我有一个主类,它在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
所以我的问题是,如何将变量从父类传递给类?所有的帮助都很受欢迎,关于不同的做法的指示也是公开的。
答案 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?)而只是“翼了”。