static 、self 、 parent
来源:互联网 发布:七天网络查询成绩登陆 编辑:程序博客网 时间:2024/05/20 11:32
PHP中static 、self 、 parent的指向很让人迷惑,趁有时间,把学习结果记录一下。
static
static 关键字来定义静态方法和属性。
static 也可用于定义静态变量以及后期静态绑定。
static 关键字来定义静态方法和属性。
声明类属性或方法为静态,就可以不实例化类而直接访问。
静态属性和方法可以通过以下方法访问:
类名::静态属性/方法
对象::静态属性/方法
selft::静态属性/方法
static::静态属性/方法
parent::静态属性/方法
之所以要写这个文章来记录下static 、self 、 parent的区别,就是因为调用方法有这么多种。这里涉及PHP里面 后期静态绑定 的概念。
static 用于定义静态变量
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
静态变量如果定义为全局的function,则作用域贯穿某次完整的请求。
静态变量如果定义为类的function,则作用域为该类实例化后的作用域,对象销毁了就丢失了。
静态变量如果定义为类的静态方法的静态变量,那作用域就跟全局function里的作用域一样了。
后期静态绑定
自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
理解后期静态绑定其实是件非常困难的事,php官方文档解释得也非常绕,所以要认真理解。试想面向对象编程中,类是有继承关系的,静态方法或属性也会被继承或者覆盖,如果直接继承没有任何覆盖,那最终调用都将会是父类的静态方法或属性,这样不会冲突。但是,如果静态方法或属性被覆盖了,怎么处理覆盖关系呢?
PHP引入”后期静态绑定” 来解决冲突,原理上就是用一个变量记录发起调用的类是”谁“,这个变量是static变量,实质上static变量是个多职责的变量,在“转发调用”的场景下,static跟self没有区别,在“非转发调用”的场景下,static永远代表发起调用的类。具体什么叫“转发调用”和“非转发调用”待会再解释,这里知道static有两个职责就可以。
接着看冲突是怎么被解决的。如下代码,将会打印“A”,因为self永远指向类定义本身,发起者B会被static变量记录下来,如果把 self::who(); 修改为 static::who();就会打印出“B”。这种以类B作为出发点发起调用的方式也叫做“非转发调用”, 同时,如果把B实例化之后变成
<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { self::who(); // static::who() }}class B extends A { public static function who() { echo __CLASS__; }}B::test();?>
相对于static来说,self和parent的指向是固定的,self执行的就是类定义本身,parent就是当前的类的直接父类,使用self引用静态方法或属性时,指向的就是类定义自己,如果类本身没有定义,则直接继承父类的定义,父类没有定义,则继承父类的父类的定义,不管实际调用的类是谁。
- static 、self 、 parent
- this, self, parent, static
- static,this,self,parent
- parent:: self:: static $this->php
- php中static、self、parent
- 158. class, static, self, parent
- php5 中$this ,self,parent,static const
- PHP中的self、static、parent关键字
- php类中 self parent static的区别
- static self parent $this在类中用法与区别
- self,sender,Owner,parent
- opener 、self、parent
- PHP5:this, self, parent
- Sender Self Owner Parent
- php self parent 使用
- PHP self parent
- Owner、Parent、Self、Sender
- Owner、Parent、Self、Sender
- Unity3d之截图方法
- 关于 Infinite recursion (StackOverflowError)报错
- Leetcode448. Find All Numbers Disappeared in an Array
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
- 什么是遗传算法?
- static 、self 、 parent
- Objective-C实现常用的4种排序算法
- 证书生成、应用及常见错误处理
- php值和对象的值传递和引用传递
- Spring Boot实战之单元测试
- coderforce#382div2
- 宽高的整理
- ftp传送文件
- sql之left join、right join、inner join的区别