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