我有一个简单的单例类:
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的服务器
这里发生了什么?
答案 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并评估是否需要单身人士。