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