调用类中的静态方法?

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

$this->staticMethod();

或者

$this::staticMethod();
136314 次浏览

假设这是你的课:

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 输出

这是一个非常晚的回答,但是在前面的回答中添加了一些细节

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

在以后的 PHP 版本 self::staticMethod();也不会工作。它会抛出严格的标准错误。

在这种情况下,我们可以创建相同类的对象并按对象调用

这里有个例子

class Foo {


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


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

调用类中的静态方法

className::staticFunctionName

例子

ClassName::staticMethod();