【问题标题】:PHP OOP problemPHP OOP 问题
【发布时间】:2011-05-07 08:05:09
【问题描述】:

我有课程 VideoAudio,它们扩展了课程 Popular

在类中,Video & Audio是一个函数“public static function parsing()”,它们本身是不同的

那么,我可以从“流行”的地址类到调用的类吗? 那是在“Popular”类中是“getSong”的一个函数,它有一个函数调用“parsing()”,但这里是如何从变成..的类中调用这个函数 希望解释清楚.. 有点像需要“父母”的相反功能

class Video extends Popular {

    public static function parsing()
    {
        return 'Videooooooooooooo';
        .....
    }

    public static fuinction tratata()
    {
    ....
    }

}

class Audio extends Popular {

    public static function parsing()
    {
       .............
        return 'Audio';
        .....
    }

    public static fuinction tratata()
    {
    ....
    }

}

class Popular {

    public static function getSong()
    {
        $class = '???????';//Video or Audio???
        $class::parsing();// ???
    }

}

抱歉英语不好..使用谷歌翻译

【问题讨论】:

标签: php oop


【解决方案1】:

不需要这种行为。

parsing函数放到Popular类中,让AudioVideo继承它。那么你的getSong 就是这个样子了。

编辑:self 关键字绑定到定义函数的类。所以下面是错误的。正确的答案是改用static 关键字 - 如果您使用的是 PHP 5.3.0 或更高版本。

public static function getSong()
{
    static::parsing();
}

以下是错误的


public static function getSong()
{
    self::parsing();
}

但实际上,不再需要 getSong。在子类上调用基类实现时,self 仍然指向子类,因此会自动调用正确的parsing 函数。

我是否正确理解了您的问题?

也对其他所有人:如果我对这种行为有误,那就丢脸了,我需要回到学校。我已经有一段时间没有使用这种行为了,所以我可能会生疏。

【讨论】:

  • 实际上,这个 PHP 错误报告 - bugs.php.net/30934 - 说我错了。但是PHP在这里也很愚蠢。该死的PHP。
【解决方案2】:

@Tesserex 可能有最好的答案。

不确定是不是你的意思,但是要找出当前对象的类名:

您似乎在静态上下文中使用这些函数。这让事情变得更加困难。据我所知,在这种情况下找出答案的唯一方法是 PHP 5.3 的 get_called_class().

【讨论】:

  • 他所有的方法调用都是静态的(不知道为什么)所以我不确定他是否有一个$this 来检查。这看起来可能是后期静态绑定问题,但代码相当混乱。
猜你喜欢
  • 2014-07-18
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2018-12-03
相关资源
最近更新 更多