PHP中new static()与new self()的区别异同分析

 更新时间:2014年08月22日 09:51:18   投稿:shichen2014  
这篇文章主要介绍了PHP中new static()与new self()的区别异同分析,是很实用的技巧,需要的朋友可以参考下

本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助。

问题的起因是本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,要求更改在5.2下能运行。

改着改着发现了一个地方

return new static($val);

这尼玛是神马,只见过

return new self($val);

于是上网查了下,他们两个的区别。

self - 就是这个类,是代码段里面的这个类。

static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。

还是看看老外的专业解释吧:

self refers to the same class whose method the new operation takes place in.

static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.

In the following example, B inherits both methods from A. self is bound to A because it's defined in A's implementation of the first method, whereas static is bound to the called class (also see  get_called_class() ).

class A {
  public static function get_self() {
    return new self();
  }

  public static function get_static() {
    return new static();
  }
}

class B extends A {}

echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A

这个例子基本上一看就懂了吧。

原理了解了,但是问题还没有解决,如何解决掉 return new static($val); 这个问题呢?

其实也简单就是用 get_class($this); 代码如下:

class A {
  public function create1() {
    $class = get_class($this);
    return new $class();
  }
  public function create2() {
    return new static();
  }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

/*
The result 
string(1) "B"
string(1) "B"
*/

感兴趣的朋友可以动手测试一下示例代码,相信会有新的收获!

相关文章

  • PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析

    PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析

    这篇文章主要介绍了PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法,结合具体实例形式分析了蛇形矩阵,回环矩阵及数字螺旋矩阵的概念、表示方法及php实现技巧,需要的朋友可以参考下
    2017-05-05
  • gearman管理工具GearmanManager的安装与php使用方法示例

    gearman管理工具GearmanManager的安装与php使用方法示例

    这篇文章主要介绍了gearman管理工具GearmanManager的安装与php使用方法,结合实例形式详细分析了gearman管理工具GearmanManager的安装及php使用GearmanManager相关配置与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • Thinkphp框架开发移动端接口(2)

    Thinkphp框架开发移动端接口(2)

    这篇文章主要介绍了thinkphp框架开发移动端接口的第2种方法,实现移动端访问自动切换移动主题模板,从而实现伪app访问,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】

    PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】

    这篇文章主要介绍了PHP mongodb操作类定义与用法,结合实例形式分析了php封装的适合mongodb2.x和mongodb3.x版本MongoDB数据库连接、增删改查、错误处理等操作定义与使用方法,需要的朋友可以参考下
    2018-06-06
  • 解析WordPress中函数钩子hook的作用及基本用法

    解析WordPress中函数钩子hook的作用及基本用法

    这篇文章主要介绍了解析WordPress中函数钩子hook的作用及基本用法,hook是WordPress中调用函数的重要用法,也是插件开发的基础,需要的朋友可以参考下
    2015-12-12
  • php 邮件发送问题解决

    php 邮件发送问题解决

    验证错误不能登陆,需重新输验证码,或在发送新的验证码到邮箱。为了实现此功能,我用到了如何向邮箱发送邮件,以及获取登陆ip的知识
    2014-03-03
  • php版微信数据统计接口用法示例

    php版微信数据统计接口用法示例

    这篇文章主要介绍了php版微信数据统计接口用法,结合实例形式分析了php微信数据统计接口功能及相关的使用技巧,需要的朋友可以参考下
    2016-10-10
  • Memcached常用命令以及使用说明详解

    Memcached常用命令以及使用说明详解

    Memcached常用命令以及使用说明详解
    2013-06-06
  • php验证手机号码

    php验证手机号码

    这篇文章主要介绍了php验证手机号码的方法,验证手机号码通常利用php正则表达试验证了,手机号的规则是长度11位然后是13,15,18等等开头,这个我们只要加以分类规划并可实现完美手机号码验证正则了,需要的朋友可以参考下
    2015-11-11
  • php实现转换ubb代码的方法

    php实现转换ubb代码的方法

    这篇文章主要介绍了php实现转换ubb代码的方法,涉及php正则替换的使用技巧,需要的朋友可以参考下
    2015-06-06

最新评论