Статические методы в PHP - PullRequest
       1

Статические методы в PHP

22 голосов
/ 09 февраля 2012

Почему в PHP вы можете получить доступ к статическому методу через экземпляр некоторого класса, а не только через имя типа?

ОБНОВЛЕНИЕ: Я - разработчик .net, но я тоже работаю с php-разработчиками.Недавно я нашел этот момент о статических методах, вызываемых из instance, и не могу понять, почему он может быть полезен.

ПРИМЕР:

class Foo
{
    public static Bar()
    {
    }
}

Мы можем принять такой метод:

var $foo = new Foo();
$foo.Bar(); // ??????

Ответы [ 6 ]

33 голосов
/ 09 февраля 2012

В PHP

экземпляр класса создается с использованием, например, ключевого слова new;

$MyClass = new MyClass();

, а к статическому методу или свойствам можно получить доступ с помощью любой области видимости.оператор разрешения или оператор ссылки на объект.Например, если класс MyClass содержит статический метод Foo(), вы можете получить к нему доступ любым способом.

$MyClass->Foo();

Или

MyClass::Foo()

Единственное правило - статическийметоды или свойства находятся вне контекста объекта.Например, вы не можете использовать $this внутри статического метода.

13 голосов
/ 14 декабря 2016
Class Do {
  static public function test() {
      return 0;
  }
}

используйте так:

echo Do::test();
5 голосов
/ 09 февраля 2012

Почему в 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();

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

0 голосов
/ 20 января 2019

Иногда полезно, если мы можем получить доступ к методам и свойствам в контексте класса, а не объекта. Для этого вы можете использовать статическое ключевое слово. Таким образом, мы можем получить доступ к статическому методу, используя имя класса и разрешение области видимости.

class User

{ общедоступная статическая $ name = 'john';

public static function display()
 {
return self::$name;
 }

}

echo User :: display ();

Посмотрите здесь, мы объявили статический метод в нашем классе User. Поэтому, если мы объявим статический метод, мы сможем получить доступ к нему, используя только имя класса. Нет необходимости создавать объект для доступа туда. Надеюсь, вы поймете всю процедуру.

Примечание: на самом деле это основное отличие от обычного метода: $ это не доступно в таких методах.

читать статью полностью здесь Как использовать статические свойства в PHP?

0 голосов
/ 24 августа 2018

В PHP 7 кажется абсолютно необходимым, чтобы вы могли $this->staticFunction().Потому что, если этот код написан внутри абстрактного класса и staticFunction() также является абстрактным в вашем абстрактном классе, $this-> и self:: дают разные результаты!

При выполнении $this->staticFunction() из (неабстрактный) ребенок абстрактного класса, вы в конечном итоге в child::staticFunction().Все хорошо.

Однако, выполняя self::staticFunction() от (неабстрактного) потомка абстрактного класса, вы в конечном итоге получаете parent::staticFunction(), который является абстрактным и, следовательно, выдает исключение.

Полагаю, это просто еще один пример плохо спроектированного PHP.Или мне нужно больше кофе ...

0 голосов
/ 12 марта 2018

В 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

...