Статические методы в PHP
Почему в PHP вы можете получить доступ к статическому методу через экземпляр некоторого класса, но не только через имя типа?
UPDATE: Я разработчик.net, но я тоже работаю с разработчиками php. Недавно я нашел этот момент о статических методах, вызванных из экземпляра, и не могу понять, почему это может быть полезно.
ПРИМЕР:
class Foo
{
public static Bar()
{
}
}
Мы можем принять такой метод:
var $foo = new Foo();
$foo.Bar(); // ??????
Ответы
Ответ 1
В PHP
класс создается с использованием нового ключевого слова, например;
$Myclass= new MyClass();
и к статическому методу или свойствам можно получить доступ с помощью оператора разрешения области видимости или оператора ссылки на объект. Например, если класс MyClass
содержит статический метод Foo()
вы можете получить к нему доступ в любом случае.
$MyClass->Foo();
Или
MyClass::Foo()
Единственное правило - статические методы или свойства вне контекста объекта. Например, вы не можете использовать $this
внутри статического метода.
Ответ 2
Class Do {
static public function test() {
return 0;
}
}
используйте следующее:
echo Do::test();
Ответ 3
Почему в 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();
что, возможно, менее запутанно. При использовании ::
она должна быть статической функцией, чтобы избежать предупреждений (в отличие от ->
, что позволяет либо).
Ответ 4
В PHP, когда вам разрешен доступ к статическому методу, ссылаясь на экземпляр класса, вам необязательно это делать. Например, вот класс со статической функцией:
class MyClass{
public static function MyFunction($param){
$mynumber=param*2;
return $mynumber;
}
Вы можете получить доступ к статическому методу только по имени типа, как это, но в этом случае вам нужно использовать двойной двоеточие (: :) вместо "->".
$result= MyClass::MyFunction(2);
(Обратите внимание, что вы также можете получить доступ к статическому методу через экземпляр класса, используя "->"). Для получения дополнительной информации: http://php.net/manual/en/language.oop5.static.php
Ответ 5
В PHP 7 кажется абсолютно необходимым, чтобы вы могли выполнять $this->staticFunction()
. Потому что, если этот код написан внутри абстрактного класса, а staticFunction()
также является абстрактным в вашем абстрактном классе, $this->
и self::
доставляют разные результаты!
$this->staticFunction()
из (неабстрактного) потомка абстрактного класса, вы в конечном итоге child::staticFunction()
. Все хорошо.
Однако, выполняя self::staticFunction()
из (неабстрактного) потомка абстрактного класса, вы в конечном итоге parent::staticFunction()
, который является абстрактным и, следовательно, выдает исключение.
Я думаю, это просто еще один пример плохо разработанного PHP. Или мне нужно больше кофе...
Ответ 6
Иногда полезно, если мы можем получить доступ к методам и свойствам в контексте класса, а не объекта. Для этого вы можете использовать статическое ключевое слово. Таким образом, мы можем получить доступ к статическому методу, используя имя класса и разрешение области видимости.
class User
{public static $ name = 'john';
public static function display()
{
return self::$name;
}
public static function display()
{
return self::$name;
}
} }
echo User :: display();
Посмотрите здесь, мы объявили статический метод в нашем классе User. Поэтому, если мы объявим статический метод, мы сможем получить доступ к нему, используя только имя класса. Нет необходимости создавать объект для доступа туда. Надеюсь, вы поймете всю процедуру.
Примечание. На самом деле это основное отличие от обычного метода: $ это недоступно в таких методах.
прочитайте статью полностью здесь Как использовать статические свойства в PHP?