Хотя большинство, вероятно, уже видели ключевое слово static , используемое в PHP раньше, задумывались ли вы когда-нибудь о том, как много различных способов его можно использовать? Или, возможно, сколько способов, которыми эти различные виды использования могут повысить ценность вашего кода? Давайте углубимся в использование и примеры и выясним это.
Сигнатура метода
Возможно, наиболее распространенным использованием ключевого слова static является статический метод. Хотя на статические методы можно ссылаться с помощью оператора объекта ( -> ), рекомендуется использовать оператор разрешения области видимости ( :: ), поскольку альтернатива устарела и может быть удалена в будущем. Оператор разрешения области видимости позволяет вызывать статические методы непосредственно в классе, а не в экземпляре класса. Это также приводит к тому, что ключевое слово $this недоступно в теле статических методов.
Статические методы могут быть использованы для реализации шаблона метода фабрики , который действует как фабрика для создания новых экземпляров содержащего класса при каждом вызове метода.
В этом примере мы создали фабричный метод из массива , который создает экземпляр объекта Пользователя , присваивает значения экземпляра из массива и возвращает экземпляр.
class User
{
public static function fromArray($attributes)
{
$user = new User();
$user->name = $attributes['first'] . ' ' . $attributes['last'];
$user->password = password_hash($attributes['password'], PASSWORD_BCRYPT);
return $user;
}
}
$user = User::fromArray([
'first' => 'ryan',
'last' => 'cco',
'password' => 'password'
]);
В качестве альтернативы, эта логика может быть извлечена в отдельный класс, который также известен как Статический фабричный шаблон .
class UserFactory
{
public static function build($attributes)
{
//
}
}
$user = UserFactory::build($attributes);
Свойства
В отличие от обычных свойств, изменение значения статического свойства во время выполнения вашей программы повлияет на все экземпляры содержащего класса. Даже те, которые еще предстоит создать. Таким образом, статические свойства можно рассматривать как “изменяемые константы класса”. На статические свойства можно ссылаться только с помощью оператора разрешения области.
Из-за природы статических свойств они могут быть использованы для реализации Одноэлементного шаблона . Шаблон Singleton поддерживает один экземпляр данного класса на протяжении всего выполнения вашей программы.
В этом примере первоначальный вызов Queue::getInstance() создаст и назначит экземпляр Очередь в Очередь::$экземпляр и верни его. Каждый последующий вызов будет возвращать один и тот же экземпляр Очередь ранее назначенная Очередь::$экземпляр .
class Queue
{
private static $instance;
public static function getInstance()
{
if (static::$instance === null) {
static::$instance = new Queue();
}
return static::$instance;
}
}
Переменные
В контексте функции статические переменные сохраняют свое значение даже после того, как программа вышла за пределы области действия содержащей функции. В контексте метода класса статические переменные имеют дополнительное поведение, аналогичное статическим свойствам, в том смысле, что изменения их значений отражаются во всех экземплярах содержащего класса. Хотя поведение статических переменных аналогично поведению статических свойств, они доступны только в теле функции или метода.
Статические переменные часто используются как часть метода оптимизации, известного как Запоминание . Запоминание направлено на ускорение дорогостоящей операции путем кэширования результатов и сохранения их для последующего вызова с теми же параметрами.
В этом примере мы создаем хэш, уникальный для предоставленных параметров, и используем его для уникальной идентификации вызова как $key . Если значение $key не найдено в качестве индекса в $кэше , мы выполняем preg_replace и сохраняем его вывод в $key индексе $cache . Каждый последующий вызов replace с теми же параметрами будет обходить вызов preg_replace и возвращать значение из предыдущего вызова.
function replace($pattern, $replacement, $subject)
{
static $cache = [];
$key = md5(serialize(func_get_args()));
if (! isset($cache[$key])) {
$cache[$key] = preg_replace(
$pattern, $replacement, $subject
);
}
return $cache[$key];
}
Анонимные функции
Подобно методам, когда анонимная функция определена в контексте класса, они не привязаны к содержащему классу и не имеют доступного ключевого слова $this .
Статические анонимные функции не обязательно имеют какое-либо уникальное применение по сравнению с обычными анонимными функциями. Стоит отметить, что в контексте класса статические анонимные функции обеспечивают микро-улучшения производительности и могут быть предложены в любых случаях, когда вам не нужно, чтобы содержащий класс был привязан к анонимной функции.
class PostsCollectionFilter
{
public function unpublished($posts)
{
return $posts->filter(static function ($post) {
return ! $post->published;
});
}
}
Поздняя статическая привязка (LSB)
Поздняя статическая привязка демонстрирует другое использование ключевого слова static: в контексте наследования. В этом контексте статический относится к вызываемому классу, а не к тому, в котором был определен метод (на который можно было бы ссылаться с помощью self или __CLASS__ ).
class A
{
public function saySelfValue()
{
echo self::class;
}
public function sayClassValue()
{
echo __CLASS__;
}
public function sayStaticValue()
{
echo static::class;
}
}
class B extends A
{
}
$a = new A();
$a->saySelfValue(); // 'A'
$a->sayStaticValue(); // 'A'
$a->sayClassValue(); // 'A'
$b = new B();
$b->saySelfValue(); // 'A'
$b->sayStaticValue(); // 'B'
$b->sayClassValue(); // 'A'
Мы рассмотрели несколько примеров, некоторые более надуманные, чем другие, различных применений статического ключевое слово в PHP. Несмотря на надуманность, все варианты использования очень реальны, и ценность, которую они могут принести вашему коду, может быть чрезвычайно эффективной. По крайней мере, ознакомление с этими способами использования и методами, которые будут доступны в вашем наборе инструментов, сделает вас намного сильнее как разработчика.
Если у вас есть еще несколько реальных примеров, возможно, из проектов с открытым исходным кодом, которые могли бы дать представление другим читателям, пожалуйста, поделитесь ссылками в комментариях!
Первоначально опубликовано на моем личном сайте по адресу Первоначально опубликовано на моем личном сайте по адресу
Оригинал: “https://dev.to/ryancco/the-power-of-static-in-php-4130”