du3979 2013-09-20 03:20
浏览 39
已采纳

无法访问单例的静态类成员[重复]

I have a simple singleton class:

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

And I call (and test) it like this:

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

But then I get this error from PHP:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

This code works with PHP 5.3, but not on a server running PHP 5.2

What's going on here?

</div>
  • 写回答

3条回答 默认 最新

  • dongqiang5932 2013-09-20 03:31
    关注

    The unexpected T_PAAMAYIM_NEKUDOTAYIMis the double colon (::) in this line:

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

    A singleton class should be able to create one and only one instance, which must be readily available. The instance should hold the data, but instead you used static properties. You should remove the static properties (or avoid creating an instance at all).

    So, if you want to keep this static, access directly with the class name:

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

    Or, if you remove the static:

    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
    

    And do this when calling:

    $load = controller::getInstance();
    print_r($load->db->query('SELECT * FROM `users`'));
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败