资讯专栏INFORMATION COLUMN

PHP static 关键字和 self 关键字实例化的区别

diabloneo / 2206人阅读

摘要:实际上,关键字对该类所起的作用与对对象所起的作用并不完全相同。将关键字替换为关键字可得运行可得这样可得到上述结论,关键字类似于关键字,但它指的是被调用的类而不是包含类。

在实例化时,static 关键字类似于 self 关键字,但 static 关键字指的是被调用的类,而 self 关键字指的是包含类。

这样说可能不太好理解,接下来举一个例子。

首先创建一个超类 DomainObject ,该类包含功能可被其扩展类共用,其次创建一个子类 Document 。

代码如下:

abstract class DomainObject {
    public static function create() {
        return new self();
    }
}

class Document extends DomainObject {
}

Document::create();

在示例代码中,将常用方法 create() 放在父类中,并使用 self 关键字作为对该类的引用,这里其实是对 self 关键字做的一个假设。实际上, self 关键字对该类所起的作用与 $this 对对象所起的作用并不完全相同。 self 关键字指的不是调用上下文,它指的是解析上下文。因此,运行示例代码可得:


PHP Fatal error: Cannot instantiate abstract class DomainObject in ...


由此可看出, self 关键字被解析为定义 create() 的 DomainObject ,而不是解析为调用 self 的 Document 类。

将 self 关键字替换为 static 关键字可得:

abstract class DomainObject {
    public static function create() {
        return new static();
    }
}

class Document extends DomainObject {
}

Document::create();

运行可得:


Document Object
{
}


这样可得到上述结论,static 关键字类似于 self 关键字,但它指的是被调用的类而不是包含类。在本例中,意思是调用Document::create()将生成一个新的 Document 对象,而不是试图实例化一个 DomainObject 对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22645.html

相关文章

  • PHPself键字

    摘要:有了的静态延迟绑定功能,可以在运行时动态确定归属的类。与是被讨论最多,也是最容易引起误用的组合。的用途看完与上述三个关键字的区别,的用途是不是呼之即出一句话总结,那就是总是指向当前类及类实例。 转载请注明文章出处:https://tlanyan.me/self-in-php/ PHP群里有人询问self关键字的用法,答案是比较明显的:静态成员函数内不能用this调用非成员函数,但可以用...

    morgan 评论0 收藏0
  • PHP中的符号 ->、=> :: 分别表示什么意思?以及this,self,pare

    摘要:定义属性,包括一个静态变量构造函数使用来调用静态变量使用调用必须使用域运算符号打印最次数值实例化对象输出我们这里只要注意两个地方,第行和第行。我们知道是指向父类的指针,一般我们使用来调用父类的构造函数。 一、->,=>和::的区别 ->前面的变量是一个对象: $user->friends_count 取对象的friends_count属性。 $t->homeTimeline($p) 调...

    null1145 评论0 收藏0
  • PHP_OOP

    摘要:特殊在,方法被对象调用执行时,会自动确定是那个对象调用的该方法,会使用该对象为方法内的赋值构造析构类,没有作用域,作用域,只是讲,函数内和函数外。析构在对象消失对象被销毁时,也会自动执行一个方法,称之为析构方法。 相关定义 对象(object):现实生活中的实体,在编程语言中的体现。实体都有属性和功能。一组数据,和操作管理这些数据的操作,定义在一起就形成了一个实体,称之为对象。(属性和...

    RiverLi 评论0 收藏0
  • PHP面试常考内容之面向对象(2)

    摘要:继上一篇面试常考内容之面向对象发表后,今天更新,需要的可以直接点击文字进行跳转获取。析构函数,当对象被销毁时调用。 PHP面试专栏正式起更,每周一、三、五更新,提供最好最优质的PHP面试内容。继上一篇PHP面试常考内容之面向对象(1)发表后,今天更新(2),需要(1)的可以直接点击文字进行跳转获取。整个面向对象文章的结构涉及的内容模块有: 一、面向对象与面向过程有什么区别?二、面向对...

    Barry_Ng 评论0 收藏0
  • 大话PHP设计模式之单例模式升级版

    摘要:用来指向已创建好的实例构造函数为空注意这里是关键这是我们需要调用的方法把函数也定义为空,这样就大功告成啦。 接上一篇大话PHP设计模式之单例模式 这一篇介绍一下升级版的单例模式,废话不说先上代码 不完美的单例模式 class singleMode { //用来指向已创建好的实例 public static $instance; //判断是...

    darcrand 评论0 收藏0

发表评论

0条评论

diabloneo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<