2014-09-27 3 views
0

Итак, в 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; 
    } 
} 

Поскольку статические члены теперь присваивается переменной класса после того, как он был инициализирован, будет вызовом последовательные методы, которые используют эти переменные класса удалить накладные расходы на глобальное пространство имен, которые сохраняются со статическими членами?

EDIT: Пожалуйста, удалите идею Singleton в этом случае. Вопрос в том, нужно ли нам искать 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 
+1

'и, таким образом, вызвать накладные расходы при необходимости вызывать them.' не совсем наверху, проблема с использованием статики не имеет ничего общего с головой –

+0

Но не имея доступа к глобальному пространству имен себя постоянно добавлять накладные расходы? Позвольте мне изменить, чтобы добавить некоторые примеры. –

+2

'$ registry :: doSomething();' --- зачем вам статический вызов метода, когда у вас уже есть экземпляр? – zerkms

ответ

0

Я думаю, что ваша первая проблема заключается в том, что ваша реализация 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(); 
+0

Я понимаю, что мое объяснение сбивает с толку, поскольку мне всегда не хватало коллег, чтобы обсудить эти темы. Я считаю, что тот факт, что мы обсуждаем одностороннюю реализацию, не имеет отношения к вопросу. Я пытаюсь сказать, что если мы назначим '$ registry = Registry', вызовы через' $ registry 'теперь не пропускают пространство имен для решения 'Registry'? Мне очень жаль, если я не очень ясен. –

+0

Я думаю, вы уже знаете, что '$ registry = Registry' не является допустимой инструкцией PHP (вот почему вы спрашиваете!). Но я получаю то, что вы хотите, и я не могу придумать какое-либо решение для этого, поэтому я позволю другим пользователям помочь вам лучше, чем мне. Тем не менее, я все еще думаю, что вы ** можете ** иметь концепцию вместо проблемы PHP: если я обобщил, вы хотите, чтобы ** статический класс ** Реестр имел ** переменную экземпляра, инициализированную только один раз **, и вызов этого класса статическим образом во всем вашем коде. ИМХО, вы слишком усложняете ситуацию, и я не могу придумать какой-либо допустимый вариант использования, но я могу ошибаться в этом вопросе – pomeh

+0

Дело в том, что это '$ registry = Registry;' Является допустимой инструкцией PHP в что он почему-то работает. Если вы запустите мой последний последний пример, который я редактировал, он работает. Да, вы могли бы сказать, что это более концептуально, чем реальный случай использования. –

Смежные вопросы