在类中调用静态方法?

ajs*_*sie 157 php

我如何从同一个类中的另一个方法调用静态方法?

$this->staticMethod();
Run Code Online (Sandbox Code Playgroud)

要么

$this::staticMethod();
Run Code Online (Sandbox Code Playgroud)

jer*_*oen 300

self::staticMethod();
Run Code Online (Sandbox Code Playgroud)

有关Static关键字的更多信息.

  • @Ian Dunn简单地说,`$ this`仅在实例化对象时才存在,并且您只能在现有对象中使用`$ this-> method`.如果你没有对象但只是调用一个静态方法,并且在那个方法中你想要在同一个类中调用另一个静态方法,你必须使用`self ::`.因此,为了避免潜在的错误(和严格的警告),最好使用`self`. (24认同)

Ja͢*_*͢ck 42

我们假设这是你的班级:

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"; }
}
Run Code Online (Sandbox Code Playgroud)

foo()方法中,让我们看看不同的选项:

$this->staticMethod();
Run Code Online (Sandbox Code Playgroud)

这样调用staticMethod()作为实例方法,对吗?它不是.这是因为该方法被声明为public static解释器将其称为静态方法,因此它将按预期工作.可以说,这样做会使代码中的静态方法调用变得不那么明显.

$this::staticMethod();
Run Code Online (Sandbox Code Playgroud)

从PHP 5.3开始,你可以$var::method()用来表示<class-of-$var>::; 虽然上面的用例仍然非常传统,但这很方便.这样我们就可以使用最常用的方法来调用静态方法:

self::staticMethod();
Run Code Online (Sandbox Code Playgroud)

现在,你开始思考的是,之前::静态调用操作,让我给你举个例子:

self::bar();
Run Code Online (Sandbox Code Playgroud)

这将打印baz = 1,这意味着$this->bar()self::bar()完成相同的事情; 那是因为::它只是一个范围解析运算符.它的存在使parent::,self::static::工作,给你访问静态变量; 如何调用方法取决于其签名以及调用者的调用方式.

要查看所有这些内容,请参阅此3v4l.org输出.


Jou*_*ill 10

这是一个非常晚的回应,但前两个答案有点误导.

当从同一个类的另一个静态方法调用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);
Run Code Online (Sandbox Code Playgroud)

此代码的输出是:

原课

扩展课程

这是因为self引用了代码所在的类,而不是它所调用的代码类.

如果要使用在继承原始类的类上定义的方法,则需要使用以下内容:

$class = get_called_class();
$class::function_name(); 
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个信息丰富.一点点,我不会说其他答案是"误导".更准确地说它们"不完整"; 他们没有解决静态方法A调用另一个静态方法B,并且在子类中重写了B的(罕见)情况下`self ::`的作用(未解决)问题.恕我直言,将方法覆盖限制为"实例"方法并不那么令人困惑; 在静态级别上谨慎使用该能力.换句话说,您的代码的读者期望实例方法的方法重写(这是OO编码的本质),而不是静态方法. (2认同)