如何从同一个类中的另一个方法调用静态方法?
$this->staticMethod();
或
$this::staticMethod();
答案 0 :(得分:276)
self::staticMethod();
答案 1 :(得分:39)
我们假设这是你的班级:
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::
工作,并允许您访问静态变量;如何调用方法取决于其签名以及调用者的调用方式。
要查看所有这些内容,请参阅this 3v4l.org output。
答案 2 :(得分:8)
这是一个非常晚的回应,但前两个回答有点误导。
在同一个类的另一个静态方法中调用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();
答案 3 :(得分:2)
在以后的PHP版本class Foo {
public function fun1() {
echo 'non-static';
}
public static function fun2() {
echo (new self)->fun1();
}
}
中也不起作用。它会引发严格的标准错误。
在这种情况下,我们可以创建相同类的对象并按对象调用
这是示例
Apr 21 15:42:26 concourse-worker concourse[24460]: {"timestamp":"1492789346.467736244","source":"worker","message":"worker.beacon.restarting","log_level":2,"data":{"error":"failed to dial: failed to construct client connection:%!(EXTRA *errors.errorString=ssh: handshake failed: remote host public key mismatch)","session":"3"}}
答案 4 :(得分:0)
在类中调用静态方法
className::staticFunctionName
示例
ClassName::staticMethod();