Автор оригинала: David Wong.
В этой статье представлена функция и использование статического ключевого слова в PHP. Чтобы поделиться с вами для вашей справки, следующим образом:
1. Что такое статика?
Статический-очень распространенный модификатор в C + +, который используется для управления хранением и видимостью переменных. Однако в PHP ключевое слово static используется для определения статических методов и свойств. Его также можно использовать для определения статических переменных и поздней статической привязки.
2. Почему статика?
Когда программа выполняется в соответствии с ее определением, компилятор выделяет место в стеке для переменной, определенной внутри функции. Как мы все знаем, пространство, выделенное в стеке, будет освобождено в конце выполнения функции, поэтому возникает проблема: если вы хотите сохранить значение этой переменной в функции до следующего вызова, как это реализовать? Самый простой способ придумать-это определить глобальную переменную, но в определении глобальной переменной есть много недостатков. Наиболее очевидным недостатком является то, что он уничтожает диапазон доступа этой переменной (так что переменные, определенные в этой функции, управляются не только этой функцией).
3. Когда вы используете статику?
Объект данных необходим для обслуживания всего класса, а не объекта, и в то же время инкапсуляция класса не должна нарушаться. То есть этот член должен быть скрыт внутри класса и невидим снаружи.
4. Внутренний механизм статического:
Статические элементы данных должны существовать в начале программы. Поскольку функция вызывается во время выполнения программы, статические элементы данных не могут выделять пространство и инициализироваться в какой-либо функции.
Таким образом, его распределение пространства имеет три возможных места: во-первых, в качестве файла заголовка внешнего интерфейса класса есть объявления классов; во-вторых, внутренняя реализация определения класса, есть определения функций-членов класса; в-третьих, глобальные объявления и определения данных перед функцией main() прикладной программы.
Статические элементы данных должны фактически выделять пространство, поэтому они не могут быть определены в объявлении класса (могут быть объявлены только элементы данных). Объявление класса объявляет только “размер и спецификацию” класса и не выделяет фактическую память, поэтому неправильно писать определение в объявлении класса. Он также не может определить внешнее определение объявления класса в файле заголовка, потому что это приведет к его повторному определению в нескольких исходных файлах с использованием класса.
Статический вводится для информирования компилятора о том, что переменные хранятся в статической области хранения программы, а не в пространстве стека. Статические элементы данных инициализируются в том порядке, в котором они появляются. Обратите внимание, что когда статические элементы вложены, вложенные элементы должны быть инициализированы. Порядок исключения является обратным порядку инициализации.
5. Преимущества статического:
Память может быть сохранена, поскольку она является общедоступной для всех объектов, поэтому для нескольких объектов элементы статических данных хранят только одно место для общего доступа всех объектов. Значение статического элемента данных одинаково для каждого объекта, но его значение может быть обновлено. Пока значения элементов статических данных обновляются один раз, все объекты могут получать доступ к одним и тем же обновленным значениям, что может повысить эффективность использования времени.
6. При ссылке на элементы статических данных используйте следующий формат:
< имя класса >: < статическое имя члена >
Если позволяют права доступа к статическим элементам данных (т. е. общедоступным), на элементы статических данных можно ссылаться в программе в соответствии с указанным выше форматом
7. Меры предосторожности:
- (1) Статическая функция-член класса принадлежит всему классу, а не объекту класса, поэтому у нее нет указателя this, что приводит к тому, что она может обращаться только к статическим данным и статической функции-члену класса. Поскольку статические методы не нужно вызывать через объекты, фиктивная переменная $this недоступна в статических методах. Статические свойства не могут быть доступны объектам через оператор–>. Статический вызов нестатического метода может привести к ошибке уровня e ﹣ strict.
- (2) Статическая функция-член не может быть определена как виртуальная функция.
- (3) Поскольку статический член объявлен в классе и управляется вне его, операция адреса несколько особенная. Адрес переменной является указателем на ее тип данных, а тип адреса функции – “указатель на функцию, не являющуюся членом”.
- (4) Поскольку статическая функция-член не имеет этого указателя, она почти эквивалентна функции, не являющейся членом. В результате у него есть неожиданное преимущество: он становится функцией обратного вызова, которая позволяет нам комбинировать C + + с системой X window на основе C, и в то же время он успешно применяется к функции line.
- (5) Статика не увеличивает временные и пространственные затраты на программу. Вместо этого он сокращает время доступа подкласса к статическим членам родительского класса и экономит пространство памяти подкласса.
- (6) Статические элементы данных имеют префикс с ключевым словом static, когда они < определение или описание >.
- (7) Статические элементы данных хранятся статически, поэтому они должны быть инициализированы.
- (8) Статическая инициализация элемента отличается от общей инициализации элемента данных:
Инициализация выполняется вне класса без статики перед ним, чтобы избежать путаницы с общими статическими переменными или объектами; Во время инициализации символы управления доступом, такие как private и public, не добавляются; Оператор области используется для указания его класса во время инициализации; Таким образом, мы получаем формат инициализации элемента статических данных: < тип данных > < имя класса >: < имя элемента статических данных > = < значение >
- (9) Чтобы предотвратить влияние родительского класса, вы можете определить статическую переменную в дочернем классе, которая совпадает с родительским классом, чтобы защитить влияние родительского класса. Вот одна вещь, которую следует отметить: мы говорим, что статические члены совместно используются родительскими и дочерними классами, но мы неоднократно определяли статические члены, приведет ли это к ошибкам? Нет, наш компилятор использует замечательную технику: искажение имен для создания уникальных флагов.
8. практика
Примеры статических свойств и методов
Примеры статических переменных
Эта функция бесполезна, потому что каждый вызов устанавливает значение $a равным 0 и выводит 0. Добавление одной переменной в $a + + не имеет никакого эффекта, потому что после выхода из этой функции переменная $a не существует. Чтобы написать функцию подсчета, которая не теряет текущее значение подсчета, определите переменную $a как статическую:
Теперь переменная $a инициализируется только при первом вызове функции test (), после чего при каждом вызове функции test() она будет выводить значение $a и добавлять его.
Статические переменные также предоставляют способ обработки рекурсивных функций. Рекурсивная функция-это функция, которая вызывает саму себя. Будьте осторожны при написании рекурсивных функций, потому что возможна бесконечная рекурсия. Вы должны убедиться, что существует достаточно методов для прерывания рекурсии. Следующая простая функция рекурсивно считает до 10, используя статическую переменную $count, чтобы определить, когда следует остановиться:
Для получения дополнительной информации о PHP вы можете ознакомиться со следующими разделами: Введение в объектно-ориентированное программирование PHP, навыки работы с массивами PHP, введение в базовый синтаксис PHP, краткое описание операций PHP и использования операторов, краткое описание использования строк PHP, введение в работу с базой данных PHP + MySQL и краткое описание общих навыков работы с базами данных PHP
Я надеюсь, что эта статья полезна для программирования на PHP.
Оригинал: “https://developpaper.com/analysis-of-the-function-and-usage-of-static-keyword-in-php/”