我正在将一个PHP 5.3库转换为PHP 5.2。阻碍我的主要事情是使用后期静态绑定,如return new static($options);,如果我将此转换为返回新的自我($options),我会得到相同的结果吗?

新自我和新静态的区别是什么?


当前回答

除了别人的回答:

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之前,在注释中提到

其他回答

我会得到同样的结果吗?

不是真的。不过,我不知道PHP 5.2有什么解决办法。

新自我和新静态的区别是什么?

Self引用new关键字实际写入的同一个类。

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

在下面的例子中,B继承了A的两个方法。自调用被绑定到A,因为它是在A的第一个方法的实现中定义的,而静态调用被绑定到被调用的类(也请参阅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

如果这段代码的方法不是静态的,你可以在5.2中使用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()));

结果:

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

除了别人的回答:

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之前,在注释中提到