Abbotton/alipay-sdk-php

静态方法中是不能调用$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).

静态方法可通过类实例访问,但静态属性不可以。