静态方法中是不能调用$this的
Closed this issue · 3 comments
AlipayRequestFactory这个工厂类中create是静态方法不能调用$this
public static function create($classOrApi, $config = [])
{
$factory = isset($this) ? $this : new self();
if (strpos($classOrApi, '.')) {
return $factory->createByApi($classOrApi, $config);
} else {
return $factory->createByClass($classOrApi, $config);
}
}
首先感谢关注!
PHP 允许静态方法被动态调用,通过 isset($this)
可以判断当前方法是否处在类实例的上下文中。因此如果 isset($this)
为 TRUE,则可以使用 $this
,否则创建自身。印象中 Laravel 经常有这种语法糖。
您可以看一下单元测试,在几个常见 PHP 版本都是可以跑通过的。
https://coveralls.io/builds/21963969/source?filename=aop/AlipayRequestFactory.php#L95
测试了确实可以 类实例->静态方法 这样调用 涨知识
但是没有找到这方面的知识点 请问有相关文档分享下吗 感谢
这是由于 PHP 的面向对象特性决定的。
根据 官方文档 的描述:
Declaring class properties or methods as static makes them accessible without needing an instantiation of the class.
使用 static
关键字并不是真正地将方法定义为「静态方法」,而是「makes them accessible without needing an instantiation of the class(使它们无需类实例也可被访问)」。你可测试以下代码:
class FooBar
{
public static function foo() {}
public function foo() {}
}
// Fatal error: Cannot redeclare FooBar::foo()
无论方法是否使用 static
,它们都是方法,不能重名。
另外,文档中有明确写道:
A property declared as static cannot be accessed with an instantiated class object (though a static method can).
静态方法可通过类实例访问,但静态属性不可以。