调用类中的静态方法?
如何从同一个类中的另一个方法调用静态方法?
$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(); } }