PHP new static()、new self()的区别

前端之家收集整理的这篇文章主要介绍了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

猜你在找的PHP相关文章