Как обратиться к статическим свойствам объекта php
Перейти к содержимому

Как обратиться к статическим свойствам объекта php

  • автор:

Как обратиться к статическим свойствам объекта php

Кроме обычных методов и свойств с разными модификаторами доступа класс может содержать статические методы и свойства. Такие методы и свойства помечаются ключевым словом static . Статические методы и свойства содаются один раз для всего класса и относятся ко всему классу, тогда для нестатических свойств и методов создается отдельная копия для каждого объекта.

Здесь определено статическое свойство retirenmentAge , которое хранит пенсионный возраст. Если возраст — это показатель конкретного человека и может отличаться для разных людей, то пенсионный возраст, как правило, устанавливается общий для всех. Поэтому это свойство можно сделать статическим — оно относится ко всему классу Person, а не устанавливается отдельно для каждого объекта. Для объявления статического свойства перед его именем ставится модификатор static :

Также в классе определен статический метод printPerson() , который выводит информацию о человеке, который в качестве параметра передается в метод. Этот метод также не зависит от конкретного объекта класса Person, а относится ко всему классу Person в целом. Чтобы объявить статический метод, также перед словом function ставится модификатор static :

При обращении к статическим методам и свойствам используется имя класса и оператор :: , вместо операции доступа -> , так как статический метод относится ко всему классу, а не к конкретному объекту этого класса.

Для обращения к статическим свойствам и методам внутри класса вместо имени класса может применяться ключевое слово self . Например, добавим в класс человека метод, который будет вычислять, сколько человеку осталось до пенсии:

Стоит отметить, что в статических методах мы можем обращаться только к статическим свойствам и методам. Но не можем обращаться к НЕстатическим свойствам и методам через $this . Например:

Здесь в статическом методе printPerson() мы можем обратиться к статической переменной retirenmentAge :

Но не можем обратиться к нестатическим свойствам и методам:

При этом статические методы и свойства также могут иметь модификаторы доступа. Например, изменим класс Person следующим образом:

В классе Person определено свойство $id , которое представляет идентификатор пользователя. И также определено приватное сттическое свойство $counter , которое хранит общее количество созданных пользователей. В конструкторе мы увеличиваем статическую переменную на единицу, а затем устанавливаем ее значение для свойства $id.

Количество созданных пользователей — это атрибут, общий для всего класса, который независит от конкретного объекта. Однако в то же время нежелательно, чтобы его извне могли произвольно изменить. Поэтому свойство $counter определено как приватное. А чтобы увидеть его значение, определен статический метод getCounter() .

Ключевое слово "static"

Эта страница описывает использование ключевого слова static для определения статических методов и свойств. static также может использоваться для определения статических переменных и позднего статического связывания. Для получения информации о таком применении ключевого слова static пользуйтесь вышеуказанными страницами.

Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Атрибут класса, объявленный статическим, не может быть доступен посредством экземпляра класса (но статический метод может быть вызван).

В целях совместимости с PHP 4, сделано так, что если не использовалось определение области видимости, то член или метод будет рассматриваться, как если бы он был объявлен как public.

Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная $this не доступна внутри метода, объявленного статическим.

Доступ к статическим свойствам класса не может быть получен через оператор ->.

При попытке вызова нестатических методов статически выводится предупреждение уровня E_STRICT .

Как и любая другая статическая переменная PHP, статические свойства могут инициализироваться только используя литерал или константу, выражения же недопустимы. Таким образом вы можете инициализировать статическое свойство например целым числом или массивом, но не сможете указать другую переменную, результат вызова функции или объект.

Начиная с версии PHP 5.3.0 существует возможность ссылаться на класс используя переменную. Поэтому значение переменной в таком случае не может быть ключевым словом (например, self, parent и static).

Пример #1 Пример статического свойства

<?php
class Foo
<
public static $my_static = ‘foo’ ;

public function staticValue () <
return self :: $my_static ;
>
>

class Bar extends Foo
<
public function fooStatic () <
return parent :: $my_static ;
>
>

print Foo :: $my_static . «\n» ;

$foo = new Foo ();
print $foo -> staticValue () . «\n» ;
print $foo -> my_static . «\n» ; // Не определено свойство my_static

print $foo :: $my_static . «\n» ; // Начиная с PHP 5.3.0
$classname = ‘Foo’ ;
print $classname :: $my_static . «\n» ; // Начиная с PHP 5.3.0

print Bar :: $my_static . «\n» ;
$bar = new Bar ();
print $bar -> fooStatic () . «\n» ;
?>

Пример #2 Пример статического метода

<?php
class Foo <
public static function aStaticMethod () <
// .
>
>

Foo :: aStaticMethod ();
$classname = ‘Foo’ ;
$classname :: aStaticMethod (); // Начиная с PHP 5.3.0
?>

PHP ООП — Статические свойства

Статические свойства могут быть вызваны напрямую — без создания экземпляра класса.

Статические свойства объявляются с помощью ключевого слова static :

Синтаксис

Для доступа к статическому свойству используйте имя класса, двойное двоеточие (::) и имя свойства:

Синтаксис

Давайте посмотрим на пример:

Пример

<?php
class pi <
public static $value = 3.14159;
>

// Получить статическое свойство
echo pi::$value;
?>

Объяснение примера

Здесь мы объявляем статическое свойство: $value. Затем мы отображаем значение статического свойства, используя имя класса, двойное двоеточие (::) и имя свойства (без предварительного создания класса).

PHP — Подробнее о статических свойствах

Класс может иметь как статические, так и нестатические свойства. Доступ к статическому свойству можно получить из метода того же класса, используя ключевое слово self и двойное двоеточие (::):

Пример

<?php
class pi <
public static $value=3.14159;
public function staticValue() <
return self::$value;
>
>

Чтобы вызвать статическое свойство из дочернего класса, используйте ключевое слово parent внутри дочернего класса:

Пример

<?php
class pi <
public static $value=3.14159;
>

class x extends pi <
public function xStatic() <
return parent::$value;
>
>

// Получить значение статического свойства напрямую через дочерний класс
echo x::$value;

// или получить значение статического свойства с помощью метода xStatic()
$x = new x();
echo $x->xStatic();
?>

ПАЛИТРА ЦВЕТОВ
ПРИСОЕДИНЯЙТЕСЬ!

Получите ваш
Сертификат сегодня!

Связь с админом

Если вы хотите сообщить об ошибке, а также внести предложение о работе сайта, добавить объявление или рекламу на сайт, не стесняйтесь отправить админу электронное письмо на email:

Топ Учебники
Топ Справочники
Топ Примеры
Веб Сертификаты

Этот сайт оптимизирован для обучения и тестирования. Примеры могут быть упрощены для улучшения чтения и базового понимания. Учебные пособия, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность и работоспособность всего контента. Используя этот сайт, вы соглашаетесь с тем, что прочитали и приняли условия использования, cookie и политику конфиденциальности.
Также вы можете абсолютно бесплатно скачать офлайн версию сайта W3Schools на русском архивом с GitHub и пользоваться локально на своём компьютере.
Также доступна версия сайта W3Schools на украинском языке.
Copyright 1999-2021 by Refsnes Data. All Rights Reserved.
Сайт работает на фреймворке W3.CSS.

Сигнатура метода

NOP::Nuances of Programming

Самый распространенный вариант использования ключевого слова static — статический метод. Несмотря на то, что к статическим методам можно обращаться с помощью объектного оператора ( -> ), рекомендуется использовать оператор разрешения области видимости ( :: ), поскольку альтернатива устарела и, вероятно, будет удалена в будущем. С помощью оператора разрешения области видимости можно вызывать статические методы напрямую в классе, а не в его экземпляре. В результате этого ключевое слово $this становится недоступным в теле статических методов.

Статические методы можно использовать для реализации шаблона фабричный метод (Factory Method), который создает новые экземпляры содержащего его класса при каждом вызове. В данном примере фабричный метод fromArray создает экземпляр объекта User , присваивает ему значения из массива и возвращает экземпляр:

Эту логику можно извлечь в отдельный класс, который известен как шаблон проектирования статическая фабрика (Static Factory):

Свойства

В отличие от обычных свойств, изменение значения статического свойства во время выполнения программы повлияет на все экземпляры содержащего свойство класса. Даже на те, для которых еще не созданы экземпляры. Таким образом, статические свойства можно рассматривать в качестве “констант изменяемого класса”. На статические свойства можно ссылаться только с помощью оператора разрешения области видимости.

Благодаря природе статических свойств их можно использовать для реализации шаблона одиночка (Singleton). Одиночка содержит один и тот же экземпляр класса на протяжении всего выполнения программы.

В данном примере первый вызов Queue::getInstance() создает и назначает экземпляр Queue для Queue::$instance и возвращает его. Каждый последующий вызов будет возвращать один и тот же экземпляр Queue , ранее присвоенный Queue::$instance :

Переменные

В контексте статической функции переменные сохраняют свое значение даже после выхода программы из области видимости содержащей их функции. В контексте метода класса статические переменные обладают дополнительным поведением, подобным статическим свойствам: изменения их значений отражаются во всех экземплярах класса. Несмотря на схожесть со статическими свойствами, статические переменные доступны только в теле функции или метода.

Статические переменные часто используются в технике оптимизации под названием мемоизация. Ее целью является ускорение дорогостоящей операции за счет кэширования результатов и сохранения их для последующего вызова с теми же параметрами.

В данном примере мы создаем уникальный для предоставленных параметров хеш и используем его для уникальной идентификации вызова в качестве ключа. Если значение $key в качестве индекса для $cache не найдено, то выполняем preg_replace и сохраняем его вывод в индексе $key , принадлежащему $cache . Каждый последующий вызов для replace с теми же параметрами будет обходить вызов preg_replace и возвращать значение из предыдущего вызова:

Анонимные функции

Подобно методам, при определении в контексте класса анонимные функции не связаны с содержащим их классом и не имеют доступа через $this .

Статические анонимные функции не обладают такой широтой вариантов использования, как обычные анонимные функции. Стоит отметить, что статические анонимные функции немного улучшают производительность и могут использоваться в любых экземплярах при отсутствии необходимости привязки содержащего класса к анонимной функции.

Позднее статическое связывание

Позднее статическое связывание демонстрирует другой вариант использования ключевого слова static : в контексте наследования. В этом контексте static относится к вызываемому классу, а не к тому, для которого был определен метод: на него, в свою очередь, будет ссылаться self или __CLASS__ :

Заключение

Мы рассмотрели несколько примеров использования ключевого слова static в PHP. Хотя сценарии использования умозрительны, они очень реалистичны. Польза, которую они могут принести вашему коду, может быть огромной. По крайней мере, знакомство с этими способами использования static сделает вас сильным разработчиком.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *