#php
При вызове функция из класса всегда использовал такую запись: new Class -> function (), но недавно увидел это: Class :: function(). В чём разница, и в каких случаях что использовать ?
Ответы
Ответ 1
:: подразумевает обращение к свойству/методу/константе класса в контексте класса (обычно статические свойства/методы и константы классов). Т.е. не обязательно создавать объект, можно обратиться так ClassName::CONSTANTA; ClassName::method(); Но можно и через объект: $o = new ClassName(); $o::CONSTANTA; // обращение в контексте класса через объект. Так же через двоеточие можно обратиться к нестатическим методам, например, родительского класса. Пусть в классе A объявлен метод m(), тогда внутри класса B, который наследуется от A, можно обратиться так: parent::m(); //или вообще уточняя A::m(); будет вызван метод определенный в родителе. -> - подразумевает обращение к свойству/методу класса в контексте объекта. Т.е. обращение должно идти через объект: $o = new ClassName(); $o->method(); $o->param;Ответ 2
Дополню немного предыдущих ответчиков. Парадигма ООП подразумевает у объекта наличие состояния - грубо говоря, значений свойств - и поведения - методов. В ряде случаев в программе появляется функционал и данные, к конкретным объектам не привязанные: например, значение числа пи будет для всех объектов одинаковым, а преобразование Фурье для волны не будет зависеть от состояния объекта, на котором вызывается (т.е. обычная математическая функция, так или иначе реализованная в программе, не зависит от внешних факторов). Для всего этого функционала языки реализуют такие вещи, как константы классов, статические переменные и статические методы. Их ключевое отличие в том, что если обычное свойство или метод привязано к конкретному экземпляру класса, то статическое свойство или метод привязаны к самому классу, и им не нужен экземпляр класса для их чтения / установки или вызова. Оператор двоеточия же называется в PHP оператором разрешения области видимости. Из-за общего отсутствия единообразия в PHP он выполняет смешанные функции, главная из которых - это действительно обращение к статическим свойствам. Но, как выше написал @A1essandro, с его помощью также можно использовать область видимости родительских классов - поэтому его область действия чуть шире, чем доступ к статике и константам, и поэтому он не обеспечивает доступ к статике, а разрешает область видимости.Ответ 3
Разница в вызове метода экземпляра и статическоого метода класса. new Class->method() // Это мы создали экземпляр класса и вызвали его метод Class::function() // Это мы вызвали статический метод Также двойное двоеточие позволяет обращаться к статическим свойствам и константам класса.
Комментариев нет:
Отправить комментарий