无法访问单例的静态类成员

时间:2013-09-20 03:20:07

标签: php singleton php-5.2

我有一个简单的单例类:

class controller {

    // Store the single instance of controller
    private static $_controller = null;
    public static $user;
    public static $db;
    public static $page;
    public static $code;

    // construct the class and set up the user & db instances
    private function __construct() {
        self::$db = new db(HOST, USER, PASS, DB);
        self::$user = new user();
        self::$page = new page();
        self::$code = new code();
    }

    // Getter method for creating/returning the single instance of this class
    public static function getInstance() {
        if (!self::$_controller) {                        
            self::$_controller = new self();
        }

        return self::$_controller;
    }
}

我打电话(并测试)它是这样的:

$load = controller::getInstance();
print_r($load::$db->query('SELECT * FROM `users`'));

但后来我从PHP得到了这个错误:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

此代码适用于PHP 5.3,但不适用于运行PHP 5.2的服务器

这里发生了什么?

3 个答案:

答案 0 :(得分:3)

意外的T_PAAMAYIM_NEKUDOTAYIM是此行中的双冒号(::):

print_r($load::$db->query('SELECT * FROM `users`'));

单例类应该能够创建一个且只能创建一个必须随时可用的实例。实例应该保存数据,而是使用静态属性。您应该删除静态属性(或者完全避免创建实例)。

因此,如果您想保持静态,请直接使用类名访问:

print_r(controller::$db->query('SELECT * FROM `users`'));

或者,如果删除静态:

class controller {

    // Store the single instance of controller
    private static $_controller = null;
    public $user;
    public $db;
    public $page;
    public $code;

    // construct the class and set up the user & db instances
    private function __construct() {
        $this->db = new db(HOST, USER, PASS, DB);
        $this->user = new user();
        $this->page = new page();
        $this->code = new code();
    }

    ...// the rest as it is

在致电:

时这样做
$load = controller::getInstance();
print_r($load->db->query('SELECT * FROM `users`'));

答案 1 :(得分:0)

“从PHP 5.3.0开始,可以使用变量”。

引用该类

PHP 5.2中,以这种方式执行:

class A {
    public $db;
    public static $static_db;
}

// OK
$a = new A();
$a->db;

// ERROR
$a::$static_db;

// OK
A::$static_db;

答案 2 :(得分:0)

这里的问题是您正在创建一个类的实例来访问静态变量。

在此上下文中访问静态变量的正确方法是使用类名称和范围分辨率运算符"T_PAAMAYIM_NEKUDOTAYIM",如下所示

Controller::$user; 
Controller::$db; 

等等。

现在说,你需要做的就是建立一些像@GeorgeMarquest建议的静态属性,否则你的类的一个独特的静态实例(单例)和一堆静​​态变量是没有用的因为无需构造对象即可访问它们see

请查看以下网站,以便更好地了解Singleton Design Pattern并查看和实际PHP example

您可能需要查看以下帖子Why global variables are bad并评估是否需要单身人士。