手机版

PHP静态调用非静态方法的应用分析

时间:2021-11-20 来源:互联网 编辑:宝哥软件园 浏览:

静态调用非静态方法!这在java和c#中是无法想象的,也是绝对不可能的。在这些语言中,这样的错误将在编译阶段被指出。但是像php这样的动态语言呢?首先语法没有错误,PHPL找不到任何错误。万一它跑了呢?我们举个例子,复制代码如下:php类MyCLaSS { private $ name=' MyCLaSS ';公共函数EcHoname(){ EcHo $ this-name;}公共函数getName(){ $ this-echo name();} } class new class { private $ name=' new class ';公共函数EcHoname(){ EcHo $ this-name;}公共函数测试(){ my class : getname();回声' \ n ';} } $ app=new CLaSS();$ app-test();这段代码的最终调用结果是什么?(运行环境php5.3.10)

看这个结果,有几点值得注意:首先,myClass:getName()是一个静态函数调用,但如果看myClass的getName()函数,就不是静态函数了。其次,返回的结构首先返回PHP严格标准错误。熟悉php的人应该知道,Strict Error是对php编码标准化的警告,这一般是由于php为了保持向前兼容性而报告的错误。也就是说,在php5.3之前的版本中允许静态调用非静态函数,但在以后的版本中不推荐!好的,如果你现在在error_reporting中注释严格错误,返回的结果将变成newClass!在php4版本中,子类需要调用父类的方法,但是子类也有一个同名的方法,所以不能使用$this,所以php4提供了一个类似(parentclass name:3360 method())的方法。(当然,php5添加了关键字parent)但是php4提供的方法实际上允许静态调用非静态方法!由于向后兼容的需要,这个特性已经成为了一个不可删除的特性(必须确保之前版本的代码可以在更高版本的php环境中运行)。只需添加“严格错误”来提示此呼叫。底层实现原因是好的。对于出现这种情况的实施原因,鸟哥的这篇文章说明http://www.laruence.com/2012/06/14/2628.html需要先颠覆自己的观点。什么是静态调用?不是有:是静态调用,而是调用范围。" $this指针指向的对象是调用此方法时的调用范围。"我翻译另一句话:静态调用中没有调用范围,非静态调用$this-abc()中$this指向的对象就是调用范围。调用范围是在调用每个句子时传递的。理解以下代码:复制代码如下:php类A { public function _ _ construct(){ } }类B扩展了A { public function _ _ construct(){ parent : _ _ construct();}} parent:_construct()这里是一个将调用范围转换为父类a的子类,这不是静态调用。回到上面的例子my class :3360 getname();此时由于没有使用关键字“parent”,也没有重新分配$this,所以调用范围没有改变,仍然是$app。也就是说,此时所有的$this指针都指向$app。好了,下面的事情很容易理解,呼应$ this-name;调用作用域的name属性是很自然的。

版权声明:PHP静态调用非静态方法的应用分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。