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


Posted in PHP onMay 02, 2013

静态调用非静态方法!!这在java,c#中是不可想象的,也是绝对不行的。这样的错误在这些语言中会在编译阶段就被指出错误的。但是对于php这样的动态语言呢?首先这个是语法没有错误的,php ?l 找不出错误来的。如果运行呢?
先看一个例子

<?php 
class myClass 
{ 
    private $name = "myClass";     public function echoName(){ 
        echo $this->name; 
    } 
    public function getName(){ 
        $this->echoName(); 
    } 
} 
class newClass 
{ 
    private $name = "newClass"; 
    public function echoName(){ 
        echo $this->name; 
    } 
    public function test() { 
        myClass::getName(); 
        echo "\n"; 
    } 
} 
$app = new newClass(); 
$app->test();

这个代码的最终调用结果是什么呢?(运行环境PHP 5.3.10 )

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

看这个结果,有几个地方值得注意:

首先是myClass::getName() 这是一个静态函数的调用
但是看一下myClass的getName()函数,它却并不是一个静态函数。

其次返回的结构
先是返回PHP Strict Standards Error。熟悉php的人应该知道,Strict Error是php的编码标准化警告,一般是由于php为了保持向前兼容而报出的错误。那这么说,非静态函数的静态调用在php5.3之前的某个版本是允许的,只是在后面的版本是不被建议使用!!

好了,如果你现在将Strict Error在error_reporting中注释掉,返回结果就变成了newClass!!

在php4版本的时候,子类需要调用父类的方法,但是子类又有一个同名的方法,因此不能使用$this,于是php4提供了(parentClassName::method())这样的方法。(当然php5增加了parent这个关键字)

但是php4提供的这个方法实际上就是允许了静态调用一个非静态方法!!后台由于需要向前兼容的原因,这个特性也就变成了不能删除的特性了(必须保证前面版本的代码能在后一版本的php环境中运行)。

只是增加了Strict Error来对这种调用进行提示。

底层实现原因
好了,对于为什么会出现这个情况的实现原因, 鸟哥的这篇文章有说明 http://www.laruence.com/2012/06/14/2628.html

首先需要颠覆自己的观点,什么是静态调用?并不是说有::就是静态调用,而是看calling scope。

“ $this指针指向的对象就是这个方法被调用时刻的calling scope.”

 

我换一种句子翻译:

静态调用是没有calling scope的,非静态调用$this->abc() 中的$this指向的对象就是calling scope。

Calling scope是当每一句调用的时候被传递的。

理解下面的代码:

<?php 
 class A { 
    public function __construct() { 
    } 
 } 
  class B extends A { 
    public function __construct() { 
        parent::__construct(); 
   } 
}

这里的parent::_construct()是子类将calling scope转化为父类A的calling scope。这个并不是静态调用。

回到最上面的例子
myClass::getName();

这个时候由于没有使用parent这样的关键字,也没有对$this重新赋值,因此calling scope并没有改变,仍然是$app。就是说这个时候,所有出现的$this指针都是指向$app的。

好了,下面的事情就很好理解了, echo $this->name; 自然就是调用calling scope的name属性了。

PHP 相关文章推荐
PHP生成HTML静态页面实例代码
Aug 31 PHP
php fckeditor 调用的函数
Jun 21 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
PHP __autoload函数(自动载入类文件)的使用方法
Feb 04 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
thinkPHP订单数字提醒功能的实现方法
Dec 01 PHP
php之可变函数的实例详解
Sep 13 PHP
php取出数组单个值的方法
Mar 12 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 PHP
Mysql中分页查询的两个解决方法比较
May 02 #PHP
记录mysql性能查询过程的使用方法
May 02 #PHP
基于MySQL分区性能的详细介绍
May 02 #PHP
php中使用$_REQUEST需要注意的一个问题
May 02 #PHP
PHP执行批量mysql语句的解决方法
May 02 #PHP
PHP闭包(Closure)使用详解
May 02 #PHP
PHP5中Cookie与 Session使用详解
Apr 30 #PHP
You might like
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
php精度计算的问题解析
2019/06/21 PHP
Javascript面向对象之四 继承
2011/02/08 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
python实现windows下文件备份脚本
2018/05/27 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
android面试问题与答案
2016/12/27 面试题
一些Unix笔试题和面试题
2012/09/25 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书