php - 带有类的 PHP 中发生了什么?

标签 php oop inheritance

如果我有此代码,则会回显字符串“test”。这是在 PHP 5.3 中。这是不应依赖的疏忽,还是在 PHP 中实现多重继承的某种方式?

class Test1
{
    function getName()
    {
        return $this->name;
    }
}

class Test2
{
    public $name = 'test';

    function getName()
    {
        return Test1::getName();
    }
}

$test = new Test2;
echo $test->getName();

编辑:

正如 GZipp 的评论所指出的,这实际上是记录在案的行为。查看此页面:http://us2.php.net/manual/en/language.oop5.basic.php和标题“Example #2 Some examples of the $this pseudo-variable”。

A 类和 B 类与我上面的两个测试类和行有类似的关系

$b = new B();
$b->bar();

显示与我的示例大致相同的结果。

最佳答案

需要说明的是——这不是继承。 Test2 不扩展 Test1。您静态引用了 Test1 类的公共(public)方法。

尽管如此,它返回“测试”的事实至少可以说是有趣的。我看到它在哪里散发出继承的想法。

如果您找不到合适的答案,我会将您的代码作为错误提交。

更新

看起来在幕后,即使您静态引用了 Test1 的方法,它仍然被称为 Test2。最后,这是未定义的行为,上面提到的 ask 确实会抛出一个严格的警告。仍然很奇怪,我个人同意它不应该工作。但只是为了更深入地了解它正在使用哪个对象。

class Test1 {
    function getName() {
        echo get_class($this);
        return $this->name;
    }
}
// ...
$test = new Test2;
echo $test->getName();

// echoes 'Test2 test'

关于php - 带有类的 PHP 中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845769/

相关文章:

javascript - 为什么 `this` 在 JavaScript 和 Java 中继承时表现不同?

PHP 从 html 消息发送电子邮件

javascript - 没有引用javascript的克隆对象

python - 当我们导入一个模块时,我们是否只是让主模块可以访问导入模块的命名空间?

c# - 在基抽象类中使用派生类型

html - 无法强制小图像继承父元素的透明度

php - 为什么我不能像服务一样获得 Symfony Finder?

javascript - 提交按钮将值传递给数据库并显示值的出现(laravel)

PHP类别反向遍历算法

C#派生类和基础构造函数参数逻辑