调用类中的静态方法?

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

$this->staticMethod(); 

要么

 $this::staticMethod(); 
 self::staticMethod(); 

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

我们假设这是你的class级:

 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()完全相同。 这是因为::只是一个范围parsing运算符。 它在那里使parent::self::static::工作,并让您访问静态variables; 如何调用方法取决于其签名以及调用者的调用方式。

要看到所有这些行动,请参阅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指代码所在的类,而不是所调用的代码的类。

如果您想要使用inheritance原始类的类上定义的方法,则需要使用以下内容:

 $class = get_called_class(); $class::function_name(); 

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

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

这里是例子

 class Foo { public function fun1() { echo 'non-static'; } public static function fun2() { echo (new self)->fun1(); } }