Устранение неполадок «Использование $ this, когда не в контексте объекта» при попытке доступа к свойству дочернего класса из родительского класса - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть основной класс, который инициализирует другой класс в функции основного класса, и мне нужно получить переменную (в данном случае $this->db) из основного класса в этот другой класс.Например, у меня есть основной класс Wordle_Admin:

class Wordle_Admin
{
   public function __construct()
   {
       $this->db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
   }

   public function views()
   {
       include 'Wordle_Admin_Views.php';
       $wsa = new Wordle_Admin_Views();
       $view = @$_GET['view'];
       $id = @$_GET['id'];
       $type = @$_GET['type'];
       $action = @$_GET['action'];
       $msg = @$_GET['msg'];

       if( !empty( $view ) && method_exists( $wsa, $view ) ):
           $wsa::$view($id, $type, $action, $msg);
       elseif( !empty( $view ) && !method_exists( $wsa, $view ) ):
           echo'View does not exist.';
       else:
           $wsa::index($id, $type, $action, $msg);
       endif;
   }    

}

И у меня есть другой класс:

class Wordle_Admin_Views extends Wordle_Admin
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index( $id = "", $type = "", $action = "", $msg = "" )
    {
        $this->db->query('SELECT * FROM wordle_post');
    }
}

Я не могу использовать $this->db в Wordle_Admin_Views, он возвращает:

Неустранимая ошибка: использование $ this, когда не в контексте объекта в C: \ Server \ wordle \ w-includes \ Wordle_Admin_Views.php в строке 22 * ​​1014 *

Итаквопрос, как я могу передать переменную из родительского класса в класс?Мы ценим любую помощь, указатели на то, что делать по-другому, также принимаются с открытыми руками.

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Ваша конкретная проблема в том, что вы вызываете метод статически. У вас нет объекта в статическом контексте, поэтому вы не можете использовать $this.

Другая ваша проблема, кажется, в том, что вы немного неправильно понимаете наследование. Поскольку соединение с БД создается только тогда, когда вы создаете экземпляр объекта (new Worlde_Admin), то же самое относится и к дочернему элементу.

A Wordle_Admin_Views не имеет автоматического доступа к соединению с БД, которое могло или не могло быть создано в некотором случае Worlde_Admin. Только этот экземпляр Worlde_Admin имеет соединение с БД. Вам нужно создать экземпляр Wordle_Admin_Views, чтобы он также имел соединение (поскольку он унаследовал методы, как это сделать от Worlde_Admin).

$admin  = new Worlde_Admin;  // $admin now has its own db connection
$admin2 = new Worlde_Admin;  // $admin2 now has another db connection
$view   = new Wordle_Admin_Views;  // $view has yet another connection

Wordle_Admin_Views::index();  // this has no db connection

Вам следует изучить внедрение зависимостей, что означает, что вы создаете один экземпляр mysqli вне ваших классов и внедряете его в каждый экземпляр, когда он создается.

$db = new mysqli(...);

$admin = new Worlde_Admin($db);
$view  = new Wordle_Admin_Views($db);
0 голосов
/ 29 ноября 2011

Мне кажется, что это может быть частью проблемы:

   include 'Wordle_Admin_Views.php';
   $wsa = new Wordle_Admin_Views();

   /* blah blah */

   if( !empty( $view ) && method_exists( $wsa, $view ) ):
       $wsa::$view($id, $type, $action, $msg);
   elseif( !empty( $view ) && !method_exists( $wsa, $view ) ):
       echo'View does not exist.';
   else:
       $wsa::index($id, $type, $action, $msg);
   endif;

Вы пытаетесь получить доступ к статической функции не по имени класса, а по объекту.Это должно быть либо Wordle_Admin_Views::$view(), либо $wsa->$view().

Вы на самом деле выучили php или притворяетесь, что это какой-то другой язык (python?) И просто "подгоняете его".

0 голосов
/ 29 ноября 2011

в вашем мире админ класс попробуйте это ...

class Wordle_Admin
{
    protected $db;

}

тогда ваш db var должен наследоваться при вызове $ this-> db, предполагая, что $ this-> db был определен в родительском классе.

...