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

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

$this->staticMethod();

или

$this::staticMethod();

Ответ 2

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

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.

Ответ 3

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

Когда дело доходит до вызова статических методов в 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(); 

Ответ 4

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

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

вот пример

class Foo {

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

    public static function fun2() {
        echo (new self)->fun1();
    }
}