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