Intereting Posts
Терминал отображает неверную версию php (Snow Leopard) Laravel Socialite: InvalidStateException Как сделать несколько запросов WHERE IN в редакторе запросов Doctrine? Установлен флажок PHP для проверки на основе значения базы данных Удалите все специальные символы из строки PHP: динамические поддомены для каждого пользователя, использующие htaccess алгоритм для преобразования md5 (или, может быть, другой метод хэширования?) в целое число, где можно установить возможные результирующие целые диапазоны (например: 1-10000)? Получить полученный XML с PHP SOAP Server CodeIgniter: 404 Страница не найдена после нажатия для сервера скрипт php exec python, который импортирует numpy UDP Tracker Scraping 1 скрипт, работающий с другими Очень странное поведение Drupal 7 404 PHP – Доступ к значениям многомерных массивов Получить контрольные значения из флажков Как устранить ошибку « file_get_contents (/var/www/laravel/.env): не удалось открыть поток: нет такого файла или каталога»?

Статические методы в PHP

Почему в PHP вы можете получить доступ к статическому методу через экземпляр некоторого класса, но не только через имя типа?

UPDATE: Я разработчик .net, но я тоже работаю с разработчиками php. Недавно я нашел этот момент о статических методах, вызванных из экземпляра, и не могу понять, почему это может быть полезно.

ПРИМЕР:

class Foo { public static Bar() { } } 

Мы можем принять такой метод:

 var $foo = new Foo(); $foo.Bar(); // ?????? 

В PHP

класс создается с использованием нового ключевого слова, например;

$MyClass = new MyClass();

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

$MyClass->Foo(); Or MyClass::Foo()

Единственное правило – статические методы или свойства вне контекста объекта. например, вы не можете использовать $this внутри статического метода.

 Class Do { static public function test() { return 0; } } 

используйте следующее:

 echo Do::test(); 

Почему в PHP вы можете получить доступ к статическому методу через экземпляр некоторого класса, но не только через имя типа?

В отличие от того, с которым вы, вероятно, привыкли с .NET, PHP имеет динамические типы. Рассматривать:

 class Foo { static public function staticMethod() { } } class Bar { static public function staticMethod() { } } function doSomething($obj) { // What type is $obj? We don't care. $obj->staticMethod(); } doSomething(new Foo()); doSomething(new Bar()); 

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

Теперь я не знаю, есть ли причина, почему доступ к статическому методу через -> разрешен. PHP (5.3?) Также поддерживает:

 $obj::staticMethod(); 

что, возможно, менее запутанно. При использовании :: она должна быть статической функцией, чтобы избежать предупреждений (в отличие от -> , что позволяет либо).