前端之家收集整理的这篇文章主要介绍了
PHP new static()、new self()的区别,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
@H_
404_0@问题的起因是本地搭建一个站。发现用
PHP 5.2 搭建不起来,站
PHP代码里面有很多5.3以上的部分,要求更改在5.2下能运行。
@H_
404_0@改着改着发现了一个地方
return new static($val);
# End www.jb51.cc
@H_
404_0@这尼玛是神马,只见过
return new self($val);
# End www.jb51.cc
@H_
404_0@于是上网查了下,他们两个的区别。
@H_
404_0@self - 就是这个类,是
代码段里面的这个类。
@H_
404_0@static -
PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中
提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。
@H_
404_0@还是看看老外的专业解释吧:
@H_
404_0@self refers to the same class whose method the new operation takes place in.
@H_
404_0@static in
PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.
@H_
404_0@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
# End www.jb51.cc
@H_
404_0@
@H_
404_0@这个例子基本上一看就懂了吧。
@H_
404_0@原理了解了,但是问题还没有
解决,如何
解决掉 return new static($val); 这个问题呢?
@H_
404_0@其实也简单就是用 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()));
# End www.jb51.cc
@H_
404_0@
@H_
404_0@结果:
@H_
404_0@string(1) "B"
@H_
404_0@string(1) "B"
@H_
404_0@
@H_
404_0@这个static在
PHP单例模式时常用, 注意
PHP的版本问题。
原文链接:https://www.f2er.com/php/527889.html