问:

在 PHP 5 中,使用 self 和 $this 有什么区别?

什么时候合适?

答1:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

简答

使用 $this 来引用当前对象。使用 self 来引用当前类。换句话说,对非静态成员使用 t h i s − > m e m b e r ,对静态成员使用 s e l f : : this->member,对静态成员使用 self:: this−>member,对静态成员使用self::member。

完整答案

以下是对非静态和静态成员变量 $this 和 self 的正确用法示例:

non_static_member . ' '. self::$static_member;}
}new X();
?>

以下是非静态和静态成员变量 $this 和 self 的不正确用法示例:

static_member;}
}new X();
?>

下面是一个 polymorphism 示例,其中 $this 用于成员函数:

foo();}
}class Y extends X {function foo() {echo 'Y::foo()';}
}$x = new Y();
$x->bar();
?>

以下是通过将 self 用于成员函数来抑制多态行为的示例:

bar();
?>

这个想法是 $this->foo() 调用 foo() 成员函数,无论是当前对象的确切类型。如果对象是 X 类型,则它因此调用 X::foo()。如果对象是 Y 类型,它调用 Y::foo()。但是对于 self::foo(),X::foo() 总是被调用。

从 http://www.phpbuilder.com/board/showthread.php?t=10354489:

由 http://board.phpbuilder.com/member.php?145249-laserlight

这个答案过于简单。正如其他答案中所指出的,self 与范围解析运算符 :: 一起使用来引用当前类;这可以在静态和非静态上下文中完成。此外,使用 $this 调用静态方法(但不能引用字段)是完全合法的。

如果您使用的是 5.3+,还可以考虑使用 static:: 而不是 ::self。否则,它可能会让您头疼不已,请参阅下面的答案以了解原因。

-1。此答案具有误导性,请阅读其他答案以获取更多信息。

它可能被过度简化了,但它回答了我的基本问题而没有让我的脑袋爆炸。我确实得到了一些我认为进一步有用的更多信息,但现在我只是想弄清楚为什么我用 $this->attrib 和 self::constant 来访问我的类属性。这帮助我更好地理解

$this:: 呢?

答2:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

关键字 self NOT 仅指“当前类”,至少不是以将您限制为静态成员的方式。在非静态成员的上下文中,self 还提供了一种绕过当前对象的 vtable (see wiki on vtable) 的方法。正如您可以使用 parent::methodName() 调用函数的父版本一样,您也可以调用 self::methodName() 来调用方法的当前类实现。

class Person {private $name;public function __construct($name) {$this->name = $name;}public function getName() {return $this->name;}public function getTitle() {return $this->getName()." the person";}public function sayHello() {echo "Hello, I'm ".$this->getTitle()."";}public function sayGoodbye() {echo "Goodbye from ".self::getTitle()."";}
}class Geek extends Person {public function __construct($name) {parent::__construct($name);}public function getTitle() {return $this->getName()." the geek";}
}$geekObj = new Geek("Ludwig");
$geekObj->sayHello();
$geekObj->sayGoodbye();

这将输出:

你好,我是极客路德维希再见路德维希这个人

sayHello() 使用 $this 指针,因此调用 vtable 来调用 Geek::getTitle()。 sayGoodbye() 使用 self::getTitle(),因此不使用 vtable,而是调用 Person::getTitle()。在这两种情况下,我们都在处理实例化对象的方法,并且可以访问被调用函数中的 $this 指针。

如果您从一般规则而不是例外开始,这个答案会更好。这是风格问题,而不是技术专长。这是我见过的关于 self:: 和 $this-> 之间区别的最好例子,但是通过首先反驳一个概念来隐藏它是一种耻辱。

@adjwilli:为什么这种风格不好?如果 OP 的期望(正题)首先被否决(反题),然后作为综合给出解释,它不会提高意识吗?

我发现“当前班级”确实有问题。由于该词组合可以理解为“self 所在的类”/“它是其文字部分的类定义”以及“对象的类”(实际上是 static)。

$this:: 呢?

@James - 没有充分的理由使用 $this::;更常用的语法已经涵盖了所有可能的情况。根据您的意思,使用 $this->、self:: 或 static::。

答3:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

请勿使用 self::。使用 static:

我什么时候应该使用 ‘self‘ 而不是 ‘$this‘?相关推荐

  1. 站在巨人的肩膀上“思考”问题,重在思考而不是拿来主义

    米老师按:觉得值得讨论的小文!我还要认真地想一想 主题:围绕职责链设计模式-计算收费有效时间博客展开讨论 参与人: 讨论时间: 讨论内容 这次讨论主要分为以下几点: 一.职责链模式应用于机房收费系统计 ...

  2. 接触追踪解决方案建立在UWB而不是蓝牙上

    接触追踪解决方案建立在UWB而不是蓝牙上 Contact tracing solution builds on UWB rather than Bluetooth 几个月前,当社会距离明显成为对抗CO ...

  3. 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例...

    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE ...

  4. java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java

    我正在研究基于TCP的通信协议.我所知 有很多方法可以确定何时结束阅读. 在消息末尾关闭连接 将消息的长度放在数据本身之前 使用分隔符:一些在正常数据中永远不会出现的值(或者总会以某种方式转义) 通常 ...

  5. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  6. 为什么要选择useState而不是useReducer

    by Austin Malerba 奥斯汀·马勒巴(Austin Malerba) 为什么要选择useState而不是useReducer (Why you should choose useStat ...

  7. mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树

    数据库为什么使用 B+ 树? 前言 讲到索引,第一反应肯定是能提高查询效率.例如书的目录,想要查找某一章节,会先从目录中定位.如果没有目录,那么就需要将所有内容都看一遍才能找到. 索引的设计对程序的性 ...

  8. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速

    有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...

  9. php mysql设置null,MySQL和PHP – 插入NULL而不是空string

    通常情况下,你可以像这样从PHP中为MySQL添加常规值: function addValues($val1, $val2) { db_open(); // just some code ot ope ...

  10. 对话迈克尔·乔丹:太多人关注个体智能,而不关注体系

    作者 | Just 在这一波技术热潮中,AI 就像灵丹妙药一般被推向了技术进步的神坛,它用在哪个领域似乎都不违和.但在一片热情的喧嚣声中,有举足轻重的人物时不时跳将出来,泼一泼冷水. 其中机器学习的泰 ...

最新文章

  1. 【直播资料下载】Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲...
  2. Socket的三个关联函数
  3. 栏目图片 栏目描述_网站描述怎么写?对网站优化有什么作用?
  4. python去掉字符串开头的零_Python / Pandas-删除以字符串开头的列
  5. 十一届蓝桥杯国赛 美丽的2-枚举
  6. 手机只能签荣耀!最忠诚代言人胡歌喊你去天猫超品日
  7. mybatis逆向工程生成的xxxExample实例详解
  8. Django之Apache2部署
  9. python实例3.0——动态页面:Ajax数据爬取
  10. 下拉样式_Axure 组件重写之神奇的文本框和下拉框
  11. 多小区下小区上行速率的计算的想法
  12. 51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)
  13. 多渠道打包,生成不同包名的包
  14. 阿里安全人机行为识别比赛 前五名队伍分享
  15. 解决Pycharm绘图报错:Error: failed to send plot to http://127.0.0.1:63342
  16. jQuery+PHP+Ajax动态数字统计展示实例
  17. 服饰业最佳实践 – ZARA的十大成功要素
  18. 香鸡排三部曲:完结篇
  19. commit在c语言中的作用,【单选题】SQL语 言 中 COMMIT语句的主要作用是( ) A. 结束程序 B. 返回系统 C. 存储数据 D. 提交事务...
  20. mysql下备份所有的数据库和数据表

热门文章

  1. 用python写一个抖音登录代码
  2. js正则验证姓名并中间带点
  3. 【免费开源】2020年独家全球疫情大数据接口(实时获取)
  4. cordova+vue使用插件cordova-plugin-qrscanner自定义扫码页面
  5. 为什么有时候CAD属性块的中的属性文字不能显示呢?
  6. 小白扫盲——双系统装机
  7. 根据日期查询当前万年历信息
  8. 位(bit)、字节(byte)、字符之间的关系(数字占即为字节)
  9. oracle checkpoint检查点
  10. oracle的nvl的使用,oracle的nvl函数的使用介绍