专栏首页程序员小助手3分钟短文 | PHP new self 跟 new static 啥区别?

3分钟短文 | 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 会发生错误。在对属性赋值时,只能使用非静态绑定的对象,同理

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

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

写在最后

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

Happy coding :_)

本文分享自微信公众号 - 程序员小助手(mql45ea),作者:Rman

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP程序员:你过来,给我说说 $this,self,static 有什么区别?

    我们每天都在敲代码,对着各种各样的类与继承。面向对象的编程设计方式,裹挟着PHP程序员加入 OOP 大军。

    程序员小助手
  • Go语言小书 | 小试牛刀,从hello world开始

    接着我们这本小册子的内容,今天我们手动实现一个hello world输出, 这是编程的惯例,用于测验环境搭建是否简单上手,或者是否准备好了基本的条件。

    程序员小助手
  • 加强版!如果编程语言是车,那么你开的是……

    世界上,总是充满活力的人,热衷于创造新语言,并不遗余力地推介,开大会,开专栏,立项目,开论坛,只求开发者能注意到:“嗨,这儿有一玩杂耍的,看着飞刀嗖嗖嗖~~~喷...

    程序员小助手
  • MJRefresh 封装

    MJRefresh是很好用的一个刷新控件,但是如果在每个ViewController中都加入如下代码

    赵哥窟
  • Python爬虫:无账号无限制获取企查查信息

    通过网上爬虫获取了全国所有企业,然后就需要补充企业信息,首先想到的就是企查查,启信宝等专业网站,最终选择了企查查,尝试了多种方法:

    Python疯子
  • iOS 图片预览 放大缩小的实现方式

    把UIImageView放到UIScrollView中 对UIImageView添加点击事件实现

    剑行者
  • python网络爬虫(13)博客园用户信息爬取

    需要cookies绕过登录,使用selenium在Firefox下模拟。需要安装geck...?插件,另外,数据存储在sqlite,需要安装。

    嘘、小点声
  • How does it work? -- threading.Condition

    继两年前的上一篇文章之后,不靠谱博主终于想起了How does it work这个坑。主要是近期也没有遇到可值得分享的「精巧」的实现。之前其实也过了一遍thre...

    岂不美哉Frost
  • pygame 笔记-6 碰撞检测

     2个矩形如果发生碰撞(即:图形有重叠区域),按上图的判断条件就能检测出来,如果是圆形,则稍微变通一下,用半径检测。如果是其它不规则图形,大多数游戏中,并不要求...

    菩提树下的杨过
  • Quartz2D复习(三) --- 涂鸦

    和上一篇手势解锁不一样,手势解锁只画了一条路径,从触摸开始--》触摸移动--》触摸结束 ,然后路径完成了,渲染出来就是手势解锁了;

    tandaxia

扫码关注云+社区

领取腾讯云代金券