Итак, в PHP я знаю, что статические классы существуют в глобальном пространстве имен и, следовательно, вызывают дополнительные затраты при их вызове.
Но что происходит, когда вы назначаете локальную переменную класса или просто локальную переменную этому статическому классу? Сняты ли накладные расходы на глобальную ссылку?
В моем конкретном случае я использую статический синглтон.
class Registry {
public static $user;
public static $DB;
public static $config;
public static $user_data;
private static $initialized = FALSE;
public static function init($config) {
if (!registry::$initialized) {
registry::$config = $config;
registry::$DB = new db($config['mysql']);
registry::$user = new user();
registry::$initialized = TRUE;
} else {
throw new Exception('Registry has already been initialized.');
}
}
}
Теперь, чтобы прояснить вопрос, было бы полезно сопоставить реестр в другом классе с переменной класса / локальной переменной для последовательных вызовов функций?
class SomethingSomethingDarkSide {
private $registry;
private $db;
private $config;
public function __construct() {
$this->registry = Registry;
$this->db = Registry::$db;
$this->config = Registry::$config;
}
}
Поскольку статические члены теперь назначаются переменной класса после ее инициализации, вызовет ли вызов последовательных методов, использующих эти переменные класса, дополнительные издержки глобального пространства имен, сохраняющиеся со статическими членами?
РЕДАКТИРОВАТЬ: Пожалуйста, удалите идею Синглтон в этом случае. Вопрос больше в том, должны ли мы искать Registry
каждый раз после его ссылки на переменную.
IE:
$registry = Registry;
$registry::doSomething();
$registry::doSomething2();
$registry::doSomething3();
против
Registry::doSomething();
Registry::doSomething2();
Registry::doSomething3();
ИЛИ ЖЕ:
class Test {
public static function sayHi() {
echo 'Hi';
}
}
$test = Test;
echo $test::sayHi(); // This being done multiple times versus
echo Test::sayHi(); // That being done multiple times
Я думаю, что ваша первоначальная проблема в том, что ваша реализация Singleton не верна. Вместо этого посмотрите на этот код:
class Registry {
private static $instance = null;
private $user;
private $DB;
private $config;
private $user_data;
public static function getInstance($config) {
if (self::$instance === null)
{
self::$instance = new self($config);
}
return self::$instance;
}
private function __construct($config) {
$this->$config = $config;
$this->$DB = new db($config['mysql']);
$this->$user = new user();
}
public function doThing() {
}
}
$registry = Registry::getInstance($config);
$registry->doThing();
Поскольку конструктор является закрытым, единственный способ получить новый экземпляр Registry
класс должен использовать публичный статический метод getInstance
,
С тех пор у вас есть $registry
переменная, которая указывает на экземпляр Registry
класс (если это не то, что вы хотите, то я не понимаю, почему вы используете шаблон Singleton …)
Я думаю, что это довольно близко, чтобы хотеть, что вы хотите:
$registry = Registry;
$registry->doSomething();
$registry->doSomething2();
$registry->doSomething3();
Других решений пока нет …