2

こんにちは、グローバルにアクセスできるクラスのコレクションがいくつかあります。

Zend_Registry で似たようなものを見つけましたが、そのコードを読むと、静的関数への呼び出しがクラスの初期化されたインスタンスを返す方法を理解できません...

私は次のようなことをする必要があります:

<?php
//index.php
$obj = new myUsefulObject();
$obj->loadCfg("myFile.xml");
$req = new HTTPRequest();
$req->filter("blablabla");
myappp::registerClass("object",$obj);
myappp::registerClass("request",$req);
$c = new Controller();
$c->execute();
?>

ここでは、Request オブジェクトをフィルター処理しており、既にフィルター処理された要求にコントローラーが到達できるようにしたいと考えています。

<?php
class Controller
{
    function __construct()
    {
        $this->request = Application::getResource("request");//This must be the filtered var =(
    }
}

?>

その Application::getResource() を実装する方法がわかりません。私が知っている唯一のことは、特定のインスタンスに関連付けることができないため、静的メソッドでなければならないということです。

4

3 に答える 3

3

静的メソッドとは別に、PHP には静的プロパティ (クラスに対してローカルなプロパティ) もあります。これは、シングルトン、または実際にはレジストリを実装するために使用できます。

class Registry { 
    private static $_registry;

    public static function registerResource($key, $object) 
    { 
        self::$_registry[$key] = $object; 
    }

    public static function getResource($key) { 
        if(!isset(self::$_registry[$key]))
            throw InvalidArgumentException("Key $key is not available in the registry");

        return self::$_registry[$key];
    }
}
于 2009-08-30T10:15:50.780 に答える
1

global1: 次のキーワードでグローバル変数にアクセスできます。

$myVar = new SomethingProvider();
class MyClass {
    public function __construct() {
        global $myVar;
        $myVar->doSomething();
    }
}

2:$GLOBALSスーパーグローバルを使用して同じことができます:

$myVar = new SomethingProvider();
class MyClass {
    public function __construct() {
        $GLOBALS['myVar']->doSomething();
    }
}

3:シングルトン クラスを定義できます(ウィキペディアにも良い例があります)。

4: グローバルを public static メンバー (または public getter/setter を持つ private static メンバー) としてクラスに追加できます。

class Constants {
    const NUM_RETIES = 3;
}
if ($tries > Constants::NUM_RETRIES) {
    # User failed password check too often.
}

class Globals {
    public static $currentUser;
}
Globals::$currentUser = new User($userId);

最初の 2 つの方法はお勧めしません。これらのグローバル変数の値を誤って上書きしてしまうのは簡単すぎるからです。

于 2009-08-30T10:31:02.450 に答える
0

何らかの形式のシングルトン設計パターンが必要なようです。

これをチェックしてください!

それが役に立てば幸い!

于 2009-08-30T10:17:51.573 に答える