开发者社区 问答 正文

PHP5.3之后的static到底怎么了?

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?

展开
收起
落地花开啦 2016-06-16 13:53:46 2046 分享 版权
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    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 关键字即可。

    2019-07-17 19:40:45
    赞同 展开评论
问答分类:
PHP
问答标签:
问答地址: