PHP中未定义的类变量
Posted
技术标签:
【中文标题】PHP中未定义的类变量【英文标题】:Undefined class variable in PHP 【发布时间】:2012-03-04 16:57:59 【问题描述】:我已经创建了一个单独的类来连接我的数据库,并且该类在一个单独的 php 文件中:
connect.php
class connect
function __construct()
// Connect to database
function query($q)
// Executing query
$connect = new connect();
现在,我创建了 $connect 类的对象,当在 index.php 之类的文件中使用它时,它可以工作了:
index.php
require_once('connect.php');
$set = $connect->query("SELECT * FROM set");
现在,它工作正常,我不必为类重新创建对象并直接执行查询,而在另一个名为 header.php 的文件中,我有一个这样的类:
header.php
class header
function __construct()
require_once('connect.php');
// Here the problem arises. I have to redeclare the object of the connection class
// Without that, it throws an error: "undefined variable connect"
$res = $connect->query("SELECT * FROM table");
为什么它在 index.php 而不是 header.php 中工作?
【问题讨论】:
除了不好的做法外,它应该可以工作。更好的方法是使用new header($connect)
,例如注入依赖。
require_once('connect.php');
在类头之外和global $connect;
在头类的__construct()
中..
@ahmet2106 forget global
exists please
但我会在class header
中使用__construct(connect $connect)
并在您的主文件中定义$header = new header($connect);
。所以只有 require
connect.php 和 header.php 在你的主文件顶部一次。
@Gordon 我不喜欢全球性的,是的,这是邪恶的,我知道 ;)
【参考方案1】:
您的问题可能在于使用require_once()
而不是require()
。当您第一次包含 connect.php
时,它运行良好,因为变量已初始化并加载了类,但是当您稍后再次尝试时,require_once()
禁止重复包含,因此没有初始化任何变量。
无论如何,在构造函数中使用include()
是……很少有道理的。并且包含一个初始化局部变量的文件也是个坏主意。
正确的代码如下所示:
<?php
require_once('connect.php');
require_once('header.php');
$connect = new Connect();
$header = new Header($connect);
还有header.php
:
<?php
class Header
protected $connection = null;
function __construct(Connect $connection)
$this->connection = $connection;
$res = $this->connection->query("SELECT * FROM table");
【讨论】:
第一部分在这里不适用。 include 会将任何类定义导入全局范围。 OP 收到“未定义变量”错误,而不是“类声明可能未嵌套”。不过,给定的替代方案很好。 @Gordon 谢谢你的信息,我从来没有这样做过,所以我从来不需要解决这样的问题。我必须考虑如何将其纳入我的答案中。 @Gordon 这是我能想到的最好的编辑...如果您有任何要添加的内容,请随时扩展/编辑我的答案。 现在好多了。除此之外,我不知道 OP 做错了什么,因为我根本无法重现该问题:codepad.viper-7.com/He4kgu 对测试用例没有影响,是吗?我不会创建多个 Foo。以上是关于PHP中未定义的类变量的主要内容,如果未能解决你的问题,请参考以下文章