新自我对新静态

问题描述 投票:0回答:3

我正在将 PHP 5.3 库转换为在 PHP 5.2 上工作。阻碍我的主要事情是使用像

return new static($options);
这样的后期静态绑定,如果我将它转换为
return new self($options)
我会得到相同的结果吗?

new self
new static
有什么区别?

php static late-static-binding
3个回答
1032
投票

我会得到相同的结果吗?

不是真的。不过,我不知道 PHP 5.2 的解决方法。

new self
new static
有什么区别?

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

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

在下面的例子中,

B
继承了
A
的两个方法。
self
调用绑定到
A
,因为它是在
A
的第一个方法的实现中定义的,而
static
绑定到被调用的类(另见
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_self()); // A
echo get_class(A::get_static()); // A

26
投票

如果此代码的方法不是静态的,您可以使用

get_class($this)
在 5.2 中获得解决方法。

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()));

结果:

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

11
投票

除了别人的回答:

static:: 将使用运行时信息进行计算。

这意味着您不能在类属性中使用

static::
,因为属性值:

必须能够在编译时进行评估,并且不得依赖于运行时信息。

class Foo {
    public $name = static::class;

}

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

使用

self::

class Foo {
    public $name = self::class;

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

请注意,我所做的代码中的致命错误注释并未指示错误发生的位置,错误发生在对象被实例化之前,如注释中提到的@Grapestain

© www.soinside.com 2019 - 2024. All rights reserved.