我如何从同一个类中的另一个方法调用静态方法?
$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)
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)
归档时间: |
|
查看次数: |
96471 次 |
最近记录: |