趣文网 > 作文大全

3分钟短文|PHP new self 跟 new static 啥区别?

2020-11-21 19:00:01
相关推荐

引言

之前的文章我们已经讲过,在 PHP 类的创建过程中,使用 self 作为类本身的引用,使用 $this 作为类对象的引用。

而在 self 和 static 的使用上,有这细微的差别。特别是类继承过程中,self 可能带来意想不到的反应,也正如那篇文章所说,建议使用 static 作为类本身的引用。

本文再来探讨,类内的 new self 与 new static 有什么区别。

学习时间

self 总是指向 new 关键字所声明的类;static 在静态绑定中,可以指向层级结构中的任意类。

下面举一个例子。

类B继承了类A的方法。对于 get_self 方法,返回的是类A本身。而static则返回的是调用者的类,也就是说,谁调用,static就指向谁。self 则持续地指向声明的类。

上面的代码,我们在类 A 中使用的是 static 静态方法,如果是动态方法,则需要使用到函数 get_class 用于获取类名。下面是一个示例:

方法 create2 中使用了 return new static(),毫无疑问,调用该方法的是对象 $b,那么返回的也肯定是 class B 本身。

方法 create1 中使用 get_class($this) 通过对象本身 $this,获取类名。因为 $this 指向 class B,所以返回的是 B,而 return new $class() 等同于 return new B(),也就是类B本身。

再进一步

既然我们区分了 self 可以不经类实例化就可以使用其方法,static 必然是实例化后对象的引用,那么看下面这个例子,就会很清楚了:

class Foo {public $name = static::class; } $Foo = new Foo; echo $Foo->name; // Fatal error

上面的代码会出错。Fatal error 发生位置不是在 $Foo->name 行,而是声明行。因为 static::class 会发生错误。在对属性赋值时,只能使用非静态绑定的对象,同理 $this 的方法可肯定不行。要使用 self。

class Foo {public $name = self::class; } $Foo = new Foo; echo $Foo->name; // Foo

这样写就没错了。因为 self 引用的是类本身,调用 class 静态方法也完全行得通。

写在最后

在程序架构时这些基类的设计很关键,需要详细规划和细分业务关系,self static $this 这些高频关键字,需要我们熟练掌握。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

去海底世界的作文 中考满分作文亲情类 道歉信英语作文模板 英语作文我的妈妈 写作文用的好词好句 回望自芬芳作文 孙悟空来到我家作文 作文最难忘的一件事 堆雪人的英语作文 作文立意是什么 北京研学旅行作文 三人两足作文600字 放孔明灯作文 秋天的大自然景色作文 自己的事情自己做作文 感激作文 我的改变作文600字 写我的校园的作文 回家的路作文 扶老人过马路作文 孔乙己穿越到现代作文 微笑写作文 妈妈请听我说作文 二年级开学第一天作文 你最感激的人作文 温暖作文550 初中作文满分作文 梦想想梦作文600字 运动会作文点评 妈妈的味道作文600字