关于php:new self与new static

New self vs. new static

我正在转换一个php 5.3库来处理php 5.2。在我看来,最主要的是使用像return new static($options);这样的后期静态绑定,如果我把它转换成return new self($options)我会得到同样的结果吗?

new selfnew static有什么区别?


will I get the same results?

不是真的。不过,我不知道PHP5.2的解决方案。

What is the difference between new self and new static?

self是指实际写入new关键字的同一类。

在php 5.3后期的静态绑定中,static指的是您在层次结构中调用方法的任何类。

在下面的示例中,B继承了A的两个方法。self调用绑定到A上,因为它是在A的第一个方法的实现中定义的,而static绑定到被调用的类(另见get_called_class())。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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_self()); // A
echo get_class(A::get_static()); // A


如果这段代码的方法不是静态的,您可以使用get_class($this)在5.2中找到解决方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()));

结果:

1
2
string(1)"B"
string(1)"B"


除了其他人的答案:

static:: will be computed using runtime information.

这意味着您不能在类属性中使用static::,因为属性值:

Must be able to be evaluated at compile time and must not depend on run-time information.

1
2
3
4
5
6
7
class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

使用self::

1
2
3
4
5
6
class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo