在尝试从父类访问子类的属性时,对“在不在对象上下文中时使用$ this”进行故障诊断

时间:2011-11-28 22:48:39

标签: php static-methods

我有一个主类,它在main类的函数中初始化另一个类,我需要从主类到另一个类获得一个变量(在本例中为$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,它会返回:

  

致命错误:在第22行的C:\ Server \ wordle \ w-includes \ Wordle_Admin_Views.php中不在对象上下文中时使用$ this

所以我的问题是,如何将变量从父类传递给类?所有的帮助都很受欢迎,关于不同的做法的指示也是公开的。

3 个答案:

答案 0 :(得分:1)

您的具体问题是您正在静态调用该方法。您在静态上下文中没有对象,因此无法使用$this

你的另一个问题似乎是你对遗产的误解。由于数据库连接仅在实例化对象(new Worlde_Admin)时创建,因此对于孩子来说也是如此。

Wordle_Admin_Views无法自动访问可能在Worlde_Admin的某个实例中创建或未创建的数据库连接。只有Worlde_Admin实例具有该DB连接。您需要实例化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);

答案 1 :(得分:0)

在你的世界管理类中试试这个...

class Wordle_Admin
{
    protected $db;

}

然后在调用$ this-> db时应该继承你的db var,假设在父类中定义了$ this-> db。

答案 2 :(得分:0)

在我看来,这可能是问题的一部分:

   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?)而只是“翼了”。