所以我在构建一个类时遇到了一个问题,我无法直接设置类的属性,而是在构造期间必须设置它。这是我试图做的一个例子。
class foo
{
private $con = Db::init();
public function __construct()
{
}
//continue class..
}
如您所见,我只是为属性分配一个简单的单例PDO类。这不起作用,我不得不做以下事情。
class foo
{
private $con;
public function __construct()
{
$this->con = Db::init();
}
//continue class..
}
第一种方法也没有报告任何错误。它只是无法继续执行。有什么想法吗?
修改
缺少错误也可能是Zen Cart的事情。
答案 0 :(得分:3)
请参阅http://www.php.net/manual/en/language.oop5.properties.php
上的课程属性文档必须在运行时评估...这个初始化必须是一个常量值 - 也就是说,它必须能够在编译时进行评估,并且不能依赖于运行时信息才能进行评估。
Db::init()
以确定设置private $con
的值,这与类属性的编译时要求相冲突。
答案 1 :(得分:3)
这里发生的是类是一个结构,并且在PHP Fiel执行之前结构是编译,因为在编译时PHP没有实例化任何动态数据,你不能使用动态数据
例如:
$function = 'hello';
function $function(){}
在编译时,变量'$ function'不存在,因此无法读取,在您的类PHP中提供了一个名为__construct
的函数,该函数在运行时被触发,这意味着其余的系统的动态数据可用。
class foo
{
protected $bar;
public function __construct()
{
$this->bar = Db::Init();
}
}
所以过程是:
这是该过程的简化版本,有几种方法可以将对象设置为类,您可以按照上面的说明执行常规方法
你可以这样做:
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
你可以创建一个基类并扩展:
class DatabaseAccess
{
protected $db;
public function __construct()
{
$this->db = Db::Init();
}
}
然后执行:
class User extends DatabaseAccess
{
public function getUser($id)
{
$this->db->fetchRow('users',$id);
}
}
}