1: 成功
<?php
abstract class DomainObject
{
public static function create()
{
return new static();
}
}
class User extends DomainObject
{
}
class Document extends DomainObject
{
}
Document::create();
2: 失败
<?php
abstract class DomainObject
{
public static function create()
{
return new self();
}
}
class User extends DomainObject
{
}
class Document extends DomainObject
{
}
Document::create();
我就想知道如何正确理解static,如何适度的使用static?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
PHP 5.3 之后,实现了延迟绑定。
在之前的版本中,如果运行下面的代码:
<?php
abstract class DomainObject
{
public static function create()
{
return new self();
}
}
class User extends DomainObject
{
}
class Document extends DomainObject
{
}
$foo = Document::create();
那么 $foo 得到的是一个 Domain 对象而不是 Document 的对象,这是由于之前的 PHP 版本中存在的一个问题,就是父类无法获得子类的状态,导致在继承时 self 这个值指向的是父类而非子类。如果要实现正常的功能的话,必须在子类中重写方法。
后来在 PHP 5.3 中,引入了 static 来实现延迟绑定,只需要用 static 来替换 self 关键字即可。