Küresel erişilebilir nesne yapmak için nasıl

3 Cevap php

Merhaba dünya çapında erişilebilir olmalıdır bazıları sınıfları küçük bir koleksiyona sahip.

Ben Zend_Registry benzer bir şey buldum, ama onun kodu okumak i statik işlevine bir çağrı, bir sınıfın bir başlatılmış örneğini döndürür nasıl anlayamıyorum ...

i gibi bir şey yapmanız gerekir:

<?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();
?>

İşte ben Request nesnesi filtre var ve ben kontrolör zaten filtreden isteği ulaşmak mümkün olmak istiyorum.

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

?>

Ben o Uygulama :: getResource () uygulamak nasıl bilmiyorum, benim bildiğim tek şey, belirli bir örneği ilgili olamaz çünkü statik bir yöntem olmasıdır.

3 Cevap

Sınıf için yerel özellikler: Kenara statik yöntemleri, PHP de statik özelliklere sahiptir. Bu singletons uygulamak, ya da gerçekten bir Registry için kullanılabilir:

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

1: global anahtar kelime ile global değişkenler acess yapabilirsiniz:

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

2: kullanarak aynı şeyi $GLOBALS süper küresel yapabilirsiniz:

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

3: tanımlayabilirsiniz bir singleton class (wikipedia da, bir nice example vardır).

4: Bir sınıfa (kamu alıcılar / ayarlayıcıları ile veya özel statik üyeleri) ortak statik üye olarak küresellerle ekleyebilirsiniz:

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

Ben istemeden çok kolay bu küresel değişkenlerin değerlerinin üzerine, ilk iki yöntem tavsiye etmem.

Eğer Singleton tasarım deseni çeşit gerekebilir gibi görünüyor bana;

this check out!

Umarım yardımcı olur!