Существуют ли рекомендации по работе со статическими членами в PHP?

#php #static

#php #статический

Вопрос:

PHP позволяет использовать статические функции-члены и переменные, начиная с версии 5.3, включая поздние статические привязки:

 class StaticClass {
    public static $staticVar;

    ...
}

$o = new StaticClass();
  

В настоящее время существуют различные варианты доступа к этим статическим членам:

 $o->staticVar;  // as instance variable/ function
$o::staticVar;  // as class variable/ function
  

Существуют и другие варианты доступа к членам внутри класса:

 self::$staticVar;   // explicitly showing static usage of variable/ function
static::$staticVar; // allowing late static binding
  

Реструктуризация некоторых существующих классов, которые используют статические члены Я спросил себя, существуют ли рекомендации по работе со статическими членами в PHP?

Комментарии:

1. Не используйте $o->staticVar; для доступа к статическим свойствам, поскольку в наши дни это будет выдавать предупреждения; используйте StaticClass::staticVar; извне класса

Ответ №1:

Ну, очевидно, что все они делают разные вещи.

 $o->staticVar
  

Это недопустимо, поскольку вы не можете / не должны обращаться к статическим свойствам с синтаксисом свойства экземпляра.

 StaticClass::$staticVar
  

Это очень просто обращается к определенной статической переменной в очень специфическом классе.

 $o::$staticVar
  

Это позволяет получить доступ к статической переменной в классе, который $o является экземпляром. В основном он используется как сокращение для предыдущего метода и эквивалентен во всех отношениях. Очевидно, однако, какой класс используется, зависит от того, какой класс $o является экземпляром.

 self::$staticVar
  

Это может использоваться только внутри класса и всегда будет ссылаться на класс, в котором оно написано. Рекомендуется использовать это внутри класса, а StaticClass::$staticVar не если класс ссылается на самого себя, поскольку вам не нужно ни о чем беспокоиться, если вы измените имя класса позже. Например.:

 class Foo {

    protected static $bar = 42;

    public function baz() {
        self::$bar;  // good
        Foo::$bar    // the same, but should be avoided because it repeats the class name
    }

}
  
 static::$staticVar
  

Это также может использоваться только внутри класса и в основном такое же, как self указано выше, но разрешается с помощью поздней статической привязки и, следовательно, может ссылаться на дочерний класс.

Что такое «лучшая практика», является спорным. Я бы сказал, что вы всегда должны быть настолько конкретными, насколько это необходимо, но не более. $o::$staticVar и static::$staticVar оба позволяют классу варьироваться через дочерние классы, в то время self::$staticVar как и StaticClass::$staticVar нет. Следуя принципу open / closed, рекомендуется использовать первый, более вариативный метод для обеспечения расширений.

Свойства, как статические, так и нестатические, также не public должны нарушать инкапсуляцию.

Также смотрите, как не убить вашу тестируемость с помощью статики.

Комментарии:

1. По крайней мере, это не разрешено в PHP, хотя он должен вызывать статический метод для переменной-члена: $this->interpreter::staticMethod()

Ответ №2:

Прежде всего, не используйте $this->staticVar . Я не уверен, когда это изменилось (я полагаю, PHP 5.4), но в последних версиях больше невозможно извлекать статические переменные таким образом.

Что касается использования поздней статической привязки, не используйте ее, если она вам не нужна. Причина его использования заключается в том, что вы планируете использовать наследование и ожидаете изменить значение статической переменной в производном классе.