首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP new self跟new static 啥区别?

引言

之前的文章我们已经讲过,在 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 :_)

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200704A0SR5500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券