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