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



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

ИмяКласса::static_method()

Немного компьютерного жаргона для вас: статические методы хранятся в отдельной части памяти кучи. Экземплярные методы хранятся в памяти стека.

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

Статические методы создаются аналогично методам экземпляра, за исключением того, что к объявлению добавляется ключевое слово static.

открытая статическая функция getNumberOfBankAccount()

К статическим свойствам также добавляется ключевое слово static .

статическое $name;

В нашем примере мы посмотрим, сколько раз был создан экземпляр объекта. Мы не хотим хранить переменную вне нашего класса. Если бы мы не использовали static, каждый раз, когда объект создавался, он считывал бы 1. Чтобы отделить себя от объекта, мы сделаем его static.

Подведение итогов. У нас есть класс GermanShepherd без каких-либо статических методов или свойств.

Давайте начнем с создания нового файла, который будет тестировать наш класс GermanShepherd. Все, что мы хотим сейчас сделать, это подсчитать, сколько раз был создан экземпляр класса. Включим в наш файл класс GermanShepherd и создадим 5 объектов GermanShepherd.

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

$num_of_dogs_createdstatic int создается и инициализируется равным 0 внутри класса GermanShepherd.

Несмотря на то, что у нас есть 5 экземпляров, инициализация до 0 происходит только во время создания первого объекта. Каждый раз не сбрасывается.

Как обновить файл $num_of_dogs_created. Вы правы, мы могли бы вручную обновлять его каждый раз при создании экземпляра класса.

Будет ли это работать? Это будет. Но это беспорядок, и мы ничего не решили. Это почти так же плохо, как иметь переменную в файле. Давайте не будем этого делать.

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

Но мы хотим поговорить и о методах. Что, если бы мы захотели увеличить $num_of_dogs_created вне класса без прямого вызова статического свойства. Помните, почему вы хотели бы использовать аксессоры и мутаторы. Мы можем создать метод, который обновляет его, а затем вызывать этот статический метод.

Поскольку мы вызываем статическое свойство в том же классе, мы можем использовать ключевое слово self для доступа к нему из нашего метода update_num_of_dogs_created(). Затем мы вызываем статический метод из нашего конструктора. Одна вещь, которую вы могли заметить, это то, что мы используем знак доллара после оператора с двойным двоеточием; это немного отличается от использования ключевого слова $this , когда вы удаляете знак доллара у свойства после оператора объекта.

Давайте попробуем и посмотрим, что мы получим.

Мы получаем Количество созданных экземпляров: 5, так как это было количество объектов, которые мы создали.

Этот метод можно вызвать вне класса, чтобы увеличить его еще раз, если мы хотим.

Прогулка по коду:

  • Мы создаем экземпляры каждого класса GermanShepherd и каждый раз увеличиваем значение статического свойства $num_of_dogs_created .
  • $num_of_dogs_created воспроизводится и отображается 5.
  • Метод update_num_of_dogs_created() вызывается снова. Статическое свойство $num_of_dogs_created увеличивается на 1.
  • В следующем операторе echo отображается 6.


Дино Кайич в настоящее время является руководителем отдела информационных технологий в компаниях LSBio (LifeSpan BioSciences, Inc.), Absolute Antibody, Kerafast, Everest BioTech, Nordic MUbio и Exalpha. Он также является генеральным директором MyAutoSystem. Он имеет более чем десятилетний опыт разработки программного обеспечения. У него есть B.S. в области компьютерных наук и несовершеннолетнего в области биологии. Его опыт включает в себя создание приложений для электронной коммерции на уровне предприятия, разработку программного обеспечения на основе исследований и содействие распространению знаний посредством письма.

Вы можете связаться с ним в LinkedIn, подписаться на него в Instagram или подписаться на его публикацию в Medium.

Прочитайте все истории Дино Каджика (и тысяч других авторов на Medium). Ваш членский взнос напрямую поддерживает Дино Кайича и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.