$ это когда не в контексте объекта при использовании класса базы данных в другом классе

0

Я посмотрел на другие вопросы к этому и, как большинство из нас привыкло говорить, вызывать статические методы и т.д., И никто из них не мог понять, почему я получаю эту ошибку?

Я привык к классам и не хочу строить соединение с базой данных в каждом классе, но у меня есть класс для этого, который использует каждый другой класс, использующий соединение с базой данных (это просто имеет смысл и меньше работа в конечном итоге).

Ниже приведены 2 класса, init.php, которые загружают классы и вызов класса на index.php, причем все его основные.

Его строка, которую я указал в классе "Отчеты", который бросает ошибку.

Класс DB

<?php
class DB{

    public static $instance = null;

    private $_pdo;

    public function __construct(){
        try{
            $this->_pdo = new PDO('mysql:host=12345;dbname=12345', '12345', '12345');
            $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
            $e->getMessage();
        }
    }

    public static function getInstance() {
        if(!isset(self::$instance)) {
            self::$instance = new DB();
        }
        return self::$instance;
    }

}
?>

Класс отчетов

<?php
class Reports{

     private $_db;

     public function __construct(){
         $this->_db = DB::getInstance();
     }

     public static function getReports($table, $version, $orderBy){

         $sql = "SELECT * FROM {$table} WHERE name = :name ORDER BY :orderBy";
         $query = $this->_db->prepare($sql); // line thats throwing the error on $this->_db
         $query->execute(array(
            ':name'=>$version,
            ':orderBy'=>$orderBy
         ));
         $result = $query->fetchALL(PDO::FETCH_OBJ);

         return $result;
     }
}
?>

init.php

<?php
error_reporting(E_ALL);
session_start();
session_regenerate_id(true);

function autoload($class) {
    require_once 'classes/' . $class . '.php';
}

spl_autoload_register('autoload');
?>

index.php

<?php
require_once "core/init.php";

$reports = Reports::getReports("demo", "name1", "id");

echo "<pre>" . print_r($reports) . "</pre>";
?>

Любые указатели будут высоко оценены.

Теги:
pdo

2 ответа

1
Лучший ответ

Его статический метод, поэтому вам нужно получить доступ к нему статически или получить экземпляр, по которому существует метод. Это так, как вы его разработали, в настоящее время нет никакого способа сделать это. Кажется, что этот метод не должен быть статическим, поэтому я бы просто сделал его нестатичным:

class Reports{

     private $_db;

     public function __construct(){
         $this->_db = DB::getInstance();
     }

     public function getReports($table, $version, $orderBy){

         $sql = "SELECT * FROM {$table} WHERE name = :name ORDER BY :orderBy";
         $query = $this->_db->prepare($sql); // line thats throwing the error on $this->_db
         $query->execute(array(
            ':name'=>$version,
            ':orderBy'=>$orderBy
         ));
         $result = $query->fetchALL(PDO::FETCH_OBJ);

         return $result;
     }
}

Применение:

require_once "core/init.php";
$report = new Reports();
$reports = $report->getReports("demo", "name1", "id");

echo "<pre>" . print_r($reports) . "</pre>";

Если вы настроены на сохранение статики, то метод getReports должен будет сделать что-то вроде этого:

     public static function getReports($table, $version, $orderBy){

         $reports = new self();
         $sql = "SELECT * FROM {$table} WHERE name = :name ORDER BY :orderBy";
         $query = $reports->_db->prepare($sql); // line thats throwing the error on $this->_db
         $query->execute(array(
            ':name'=>$version,
            ':orderBy'=>$orderBy
         ));
         $result = $query->fetchALL(PDO::FETCH_OBJ);

         return $result;
     }
  • 0
    Спасибо за подробный ответ!
0

Измените класс отчетов на:

class Reports{

     public static function getReports($table, $version, $orderBy){
         $db = DB::getInstance();
         $sql = "SELECT * FROM {$table} WHERE name = :name ORDER BY :orderBy";
         $query = $db->prepare($sql);
         $query->execute(array(
            ':name'=>$version,
            ':orderBy'=>$orderBy
         ));
         $result = $query->fetchALL(PDO::FETCH_OBJ);

         return $result;
     }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню