Статические методы в 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?