在实例化时,static关键字类似于self关键字,但是static关键字指的是被调用的类,而self关键字指的是包含类。这个可能不好理解,下面举个例子。首先创建一个包含可由其扩展类共享的功能的超类DomainObject,然后创建一个子类Document。代码如下:abstractclassDomainObject{publicstaticfunctioncreate(){returnnewself();}}classDocumentextendsDomainObject{}Document::create();在示例代码中,将公共方法create()放在父类中,并使用self关键字作为对类的引用,这里实际上是对self关键字的一个假设。事实上,self关键字对类的作用与$this对对象的作用并不完全相同。self关键字不引用调用上下文,它引用解析上下文。因此,运行示例代码会产生:PHPFatalerror:CannotinstantiateabstractclassDomainObjectin...从这里可以看出,self关键字被解析为定义create()的DomainObject,而不是调用self的Document类.将self关键字替换为static关键字得到:abstractclassDomainObject{publicstaticfunctioncreate(){returnnewstatic();}}classDocumentextendsDomainObject{}Document::create();运行得到:DocumentObject{}这样就可以得到上面的结论了。static关键字类似于self关键字,但它指的是被调用类而不是包含类。在这种情况下,这意味着调用Document::create()将生成一个新的Document对象,而不是尝试实例化DomainObject对象。
