php构成方法的关键字是(PHP中的self关键字详解)
php构成方法的关键字是
PHP中的self关键字详解前言
PHP群里有人询问self关键字的用法,答案是比较明显的:静态成员函数内不能用this调用非成员函数,但可以用self调用静态成员函数/变量/常量;其他成员函数可以用self调用静态成员函数以及非静态成员函数。随着讨论的深入,发现self并没有那么简单。鉴于此,本文先对几个关键字做对比和区分,再总结self的用法。
与parent、static以及this的区别
要想将彻底搞懂self,要与parent、static以及this区分开。以下分别做对比。
parent
self与parent的区分比较容易:parent引用父类/基类被隐盖的方法(或变量),self则引用自身方法(或变量)。例如构造函数中调用父类构造函数:
|
class Base { public function __construct() { echo "Base contructor!" , PHP_EOL; } } class Child { public function __construct() { parent::__construct(); echo "Child contructor!" , PHP_EOL; } } new Child; // 输出: // Base contructor! // Child contructor! |
static
static常规用途是修饰函数或变量使其成为类函数和类变量,也可以修饰函数内变量延长其生命周期至整个应用程序的生命周期。但是其与self关联上是PHP 5.3以来引入的新用途:静态延迟绑定。
有了static的静态延迟绑定功能,可以在运行时动态确定归属的类。例如:
|
class Base { public function __construct() { echo "Base constructor!" , PHP_EOL; } public static function getSelf() { return new self(); } public static function getInstance() { return new static (); } public function selfFoo() { return self::foo(); } public function staticFoo() { return static ::foo(); } public function thisFoo() { return $this ->foo(); } public function foo() { echo "Base Foo!" , PHP_EOL; } } class Child extends Base { public function __construct() { echo "Child constructor!" , PHP_EOL; } public function foo() { echo "Child Foo!" , PHP_EOL; } } $base = Child::getSelf(); $child = Child::getInstance(); $child ->selfFoo(); $child ->staticFoo(); $child ->thisFoo(); |
程序输出结果如下:
Base constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!
在函数引用上,self与static的区别是:对于静态成员函数,self指向代码当前类,static指向调用类;对于非静态成员函数,self抑制多态,指向当前类的成员函数,static等同于this,动态指向调用类的函数。
parent、self、static三个关键字联合在一起看挺有意思,分别指向父类、当前类、子类,有点“过去、现在、未来”的味道。
this
self与this是被讨论最多,也是最容易引起误用的组合。两者的主要区别如下:
- this不能用在静态成员函数中,self可以;
- 对静态成员函数/变量的访问,建议 用self,不要用$this::或$this->的形式;
- 对非静态成员变量的访问,不能用self,只能用this;
- this要在对象已经实例化的情况下使用,self没有此限制;
- 在非静态成员函数内使用,self抑制多态行为,引用当前类的函数;而this引用调用类的重写(override)函数(如果有的话)。
self的用途
看完与上述三个关键字的区别,self的用途是不是呼之即出?一句话总结,那就是:self总是指向“当前类(及类实例)”。详细说则是:
- 替代类名,引用当前类的静态成员变量和静态函数;
- 抑制多态行为,引用当前类的函数而非子类中覆盖的实现;
槽点
- 这几个关键字中,只有this要加$符号且必须加,强迫症表示很难受;
- 静态成员函数中不能通过$this->调用非静态成员函数,但是可以通过self::调用,且在调用函数中未使用$this->的情况下还能顺畅运行。此行为貌似在不同PHP版本中表现不同,在当前的7.3中ok;
- 在静态函数和非静态函数中输出self,猜猜结果是什么?都是string(4) "self",迷之输出;
- return $this instanceof static::class;会有语法错误,但是以下两种写法就正常:
|
$class = static :: class ; return $this instanceof $class ; // 或者这样: return $this instanceof static ; |
所以这是为什么啊?!
参考
When to use self over $this?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。
原文链接:https://www.tlanyan.me/self-in-php/
- php框架使用方法大全(PHP MVC框架中类的自动加载机制实例分析)
- python与php比较(浅谈php调用python文件)
- phpsetcookie参数说明(PHP的cookie与session原理及用法详解)
- php框架初始化教程学习(PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解)
- phpfpm优化方法(php-fpm超时时间设置request_terminate_timeout资源问题分析)
- apache配置详解(apache2.2和php5.2.17在windows下整合过程的错误解决方法)
- php中类的属性含义(php类中static与self的使用区别浅析)
- php array只能放一种类型的数据(浅谈PHP array_search 和 in_array 函数效率问题)
- 怎么用php制作图片(PHP压缩图片功能的介绍)
- php数据库怎么获得表单(php如何把表单内容提交到数据库)
- php微信支付流程(PHP实现微信退款的方法示例)
- 织梦cms漏洞大全(织梦CMS利用php正则让文章的外链自动加nofollow)
- php 模拟登录验证码demo(PHP 模拟登陆功能实例详解)
- phpstudy中php用什么版本(phpstudy是什么?phpstudy有什么用?)
- php 策略模式工厂模式区别(PHP设计模式之策略模式原理与用法实例分析)
- php对称算法示例(php解决约瑟夫环算法实例分析)
- 法国面包(法国面包法棍)
- 微信(微信分身)
- 双十二(双十二和双十一哪个划算)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
- 越南河粉(越南河粉来自哪里)
热门推荐
- element-ui如何关闭表单验证(ElementUI实现el-form表单重置功能按钮)
- elementui多个组件怎么使用(ElementUI在实际项目使用步骤详解)
- python数字形式转换详解(Python3.5实现的罗马数字转换成整数功能示例)
- python获取txt文件内容(使用python读取.text文件特定行的数据方法)
- phpstudy服务器怎么设置(PHPStudy打开网页很慢的原因及解决方案)
- 腾讯云如何添加安全通信端口(腾讯云服务器如何添加安全通信端口?)
- 网络虚拟机系统安装教程(NPOINT免费虚拟主机管理系统windows2003的安装方法)
- zabbix监控数据库(利用zabbix监控ogg进程Windows平台)
- vue怎么更换自定义水印(Vue之全局水印的实现示例)
- dedecms栏目内容怎么插入分页符(dedecms自动给已经发布过的文章中的关键词加超链接)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9