Давайте предположим, что это ваш класс:
class Test
{
private $baz = 1;
public function foo() { ... }
public function bar()
{
printf("baz = %d\n", $this->baz);
}
public static function staticMethod() { echo "static method\n"; }
}
Изнутри метода foo()
давайте рассмотрим различные варианты:
$this->staticMethod();
Так что вызывает staticMethod()
какметод экземпляра, верно?Это не.Это связано с тем, что метод объявлен как public static
, интерпретатор будет вызывать его как статический метод, поэтому он будет работать как положено.Можно утверждать, что это делает из кода менее очевидным, что происходит статический вызов метода.
$this::staticMethod();
Начиная с PHP 5.3, вы можете использовать $var::method()
для обозначения <class-of-$var>::
;это довольно удобно, хотя приведенный выше вариант использования все еще довольно нетрадиционен.Итак, это приводит нас к наиболее распространенному способу вызова статического метода:
self::staticMethod();
Теперь, прежде чем вы начнете думать, что ::
является оператором статического вызова, позвольте мне датьВы другой пример:
self::bar();
Это напечатает baz = 1
, что означает, что $this->bar()
и self::bar()
делают то же самое;это потому, что ::
является просто оператором разрешения области видимости.Это сделано для того, чтобы parent::
, self::
и static::
работали и давали вам доступ к статическим переменным;способ вызова метода зависит от его сигнатуры и способа вызова.
Чтобы увидеть все это в действии, см. этот вывод 3v4l.org .