PHP类和设置属性

时间:2011-07-05 16:08:05

标签: php class singleton

所以我在构建一个类时遇到了一个问题,我无法直接设置类的属性,而是在构造期间必须设置它。这是我试图做的一个例子。

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的事情。

2 个答案:

答案 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();
    }
}

所以过程是:

  • 编译时间
    • Class foo
    • 变量栏
    • function __construct
  • 运行时间
    • 找到新的foo
    • 内部创建对象
    • 执行foo :: __ construct()
    • return foo

这是该过程的简化版本,有几种方法可以将对象设置为类,您可以按照上面的说明执行常规方法

你可以这样做:

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);
    }
}

}