这里有什么PHP课程?

时间:2010-10-02 12:49:01

标签: 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和标题“示例#2 $ this伪变量的一些示例”。

类A和B与我上面的两个测试类和行

具有相似的关系
$b = new B();
$b->bar();

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

3 个答案:

答案 0 :(得分:1)

要明确 - 这不是继承。 Test2不扩展Test1。您静态引用了Test1类的公共方法。

尽管如此,至少可以说它返回“测试”的事实很有意思。而且我看到它在哪里放弃了继承的想法。

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

更新

看起来很糟糕,即使你静态引用了Test1的方法,它仍然被称为Test2。最后,这是未定义的行为,并且上面提到的问题确实会发出严格的警告。仍然非常奇怪,我个人同意这不应该奏效。但只是为了更多地了解它所使用的对象。

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

// echoes 'Test2 test'

答案 1 :(得分:1)

PHP允许调用非静态方法,就像它们是静态的一样 - 这是一个特性。 PHP将$this作为此类调用的隐式参数传递。就像以正常方式调用方法一样。

但显然PHP没有检查静态调用的类是否继承了当前的类 - 这就是错误。

这就是你如何看待PHP的作用:

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

function Test2->getName($this = null) {
    return Test1->getName($this);
}

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

这种行为是错误的。正确的Test2->getName将是:

function Test2->getName($this = null) {
    return $this instanceof Test1 ? Test1->getName($this) : Test1->getName();
}

答案 2 :(得分:0)

这必须是一个错误。 100%。

  1. 这不是继承。
  2. 你不应该打电话 Test1 :: getName()为getName()in Test1不是静态的
  3. 即使你 可以称之为,$ this->名称应该 无权访问该值 TEST2。
  4. 这打破了OO的这么多规则我对这是如何通过测试感到困惑。好吧,不要找到它!