вызывать статический метод внутри класса? - PullRequest
145 голосов
/ 05 февраля 2010

как вызвать статический метод из другого метода в том же классе?

$this->staticMethod();

или

$this::staticMethod();

Ответы [ 4 ]

283 голосов
/ 05 февраля 2010
39 голосов
/ 25 октября 2013

Давайте предположим, что это ваш класс:

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 .

8 голосов
/ 11 августа 2016

Это очень поздний ответ, но предыдущие два ответа немного вводят в заблуждение.

Когда речь идет о вызове статических методов в PHP из другого статического метода в том же классе, важно различать self и имя класса.

Возьмем, к примеру, этот код:

class static_test_class {
    public static function test() {
        echo "Original class\n";
    }

    public static function run($use_self) {
        if($use_self) {
            self::test();
        } else {
            $class = get_called_class();
            $class::test(); 
        }
    }
}

class extended_static_test_class extends static_test_class {
    public static function test() {
        echo "Extended class\n";
    }
}

extended_static_test_class::run(true);
extended_static_test_class::run(false);

Вывод этого кода:

Оригинальный класс

Расширенный класс

Это потому, что self относится к классу, в котором находится код, а не к классу кода, из которого он вызывается.

Если вы хотите использовать метод, определенный в классе, который наследует исходный класс, вам нужно использовать что-то вроде:

$class = get_called_class();
$class::function_name(); 
2 голосов
/ 21 апреля 2017

В более поздней версии PHP self::staticMethod(); также не будет работать. Будет выброшена строгая стандартная ошибка.

В этом случае мы можем создать объект того же класса и вызвать объект

вот пример

class Foo {

    public function fun1() {
        echo 'non-static';   
    }

    public static function fun2() {
        echo (new self)->fun1();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...