Как сделать глобально доступный объект - PullRequest
2 голосов
/ 30 августа 2009

Привет, у меня есть небольшая коллекция классов, некоторые из которых должны быть доступны по всему миру.

Я нашел нечто подобное в 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 (), единственное, что я знаю, это то, что это должен быть статический метод, потому что он не может быть связан с конкретным экземпляром.

Ответы [ 3 ]

3 голосов
/ 30 августа 2009

Помимо статических методов, 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];
    }
}
1 голос
/ 30 августа 2009

1: Вы можете получить доступ к глобальным переменным с помощью ключевого слова global:

$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: Вы можете добавить глобальные переменные как открытые статические члены (или частные статические члены с открытыми методами получения / установки) к классу:

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

Я бы не рекомендовал первые два метода, поскольку непреднамеренная перезапись значений этих глобальных переменных слишком проста.

0 голосов
/ 30 августа 2009

Мне кажется, что вам может понадобиться какая-то форма шаблона Singleton;

Проверьте это out!

Надеюсь, это поможет!

...