php - PHP 7 的 self 在什么情况下引用基类?

标签 php inheritance php-7

如前所述on Reddit's LOL PHP sub , PHP 7 在引用 self 时可以使用扩展类或基类,而 PHP 5 总是引用扩展类。

<?php

class Foo {
    const A = "FooA";
    const B = self::A . self::C;
    const C = "FooC";

}

class Bar extends Foo {
    const A = "BarA";
    const C = "BarC";
}

var_dump(Bar::B);

Try it online

PHP 5

string(8) "BarABarC"

PHP 7

string(8) "FooABarC"

PHP 7 的行为尤其令人担忧,因为似乎没有任何简单的规则可以知道 self 何时引用基类或扩展类。 在 PHP 7 中确定 self 将引用哪个类的规则是什么?

最佳答案

self:: 应该 始终引用它在其中使用的类(注意 PHP 5 的行为也是错误的。)

这是一个 bug , fixed7.1.4 , 这仅适用于类常量内的 self::parent:: 的解析。

基本上在:

const B = self::A . self::C;

self::C 此时仍然未知,推迟解决。不幸的是,在最终解决时,正确的范围丢失了。


这个问题也比简单的基类与扩展类更微妙,因为您最终可能会得到一个不同扩展类的值。例如:

https://3v4l.org/cY1I0

class A {
    const selfN = self::N;
    const N = 'A';
}

class B extends A {
    const N = 'B';
}

class C extends A {
    const N = 'C';
}

var_dump(B::selfN); // A

var_dump(C::selfN); // A

在 PHP 7.0.0 到 7.1.3 中输出:

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

虽然如果你把它换成:

https://3v4l.org/RltQj

var_dump(C::selfN); // A

var_dump(B::selfN); // A

你会得到:

string(1) "C"
string(1) "C"

为了在受影响的版本中避免这种情况,在类常量定义中使用类名而不是 self::,例如const selfN = A::N

关于php - PHP 7 的 self 在什么情况下引用基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020071/

相关文章:

c++ - 如何将类传递给方法,并从基类检测继承者?

c# - 使用 new 隐藏非虚拟成员的替代方法

php - PHP 7 接口(interface)中的静态返回类型

c++ - 纯虚函数和二进制兼容性

mysql - 在 PHP7 中,清理包含文件名的 UTF8 字符的最佳方法是什么?

php - Magento 2 CSS 无法加载

php - Woocommerce 添加到购物车条件

php - Rest Server Codeigniter 返回图像数据

php - 如何使用 php 变量在 MySQL 查询的 WHERE 条件中使用变量?

php - 为什么我会收到 "Class ' app\models\Yii' not found"错误?