-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 を実行しているサーバーでは動作しません

何が起きてる?

4

3 に答える 3

3

予期しないのT_PAAMAYIM_NEKUDOTAYIMは、次の行の二重コロン ( ::) です。

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

シングルトン クラスは、すぐに利用できるインスタンスを 1 つだけ作成できる必要があります。インスタンスはデータを保持する必要がありますが、代わりに静的プロパティを使用しました。静的プロパティを削除する必要があります (または、インスタンスをまったく作成しないようにしてください)。

したがって、これを静的に保ちたい場合は、クラス名で直接アクセスします。

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`'));
于 2013-09-20T03:31:32.000 に答える
0

ここでの問題は、静的変数にアクセスするクラスのインスタンスを作成していることです。

このコンテキストで静的変数にアクセスする正しい方法は、クラス名とスコープ解決演算子"T_PAAMAYIM_NEKUDOTAYIM"を次のように使用することです。

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

等々。

そうは言っても、@GeorgeMarquestが提案したような静的プロパティのいくつかを作成するだけで済みます。そうしないと、クラスの一意の静的インスタンス(シングルトン)を静的変数の束にすることはできません。オブジェクトを構築する必要なくアクセスできます。 を参照してください。

次のサイトを見て、 Singleton Design Patternをよりよく理解し、実際のPHP の例を確認してください。

次の投稿を見て、なぜグローバル変数が悪いのかを見て、シングルトンが必要かどうかを評価することは価値があるかもしれません.

于 2013-09-20T03:48:05.023 に答える
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;
于 2013-09-20T03:38:23.080 に答える