当我运行以下代码时,我按预期得到B
:
class A {
public function __construct($file){}
}
class B extends A {
public function __construct() {
parent::__construct('test.flv');
}
}
$b = new B();
print get_class($b);
但是,请考虑对此代码稍加修改的版本(此处ffmpeg_movie
类是http://ffmpeg-php.sourceforge.net库的一部分):
class B extends ffmpeg_movie {
public function __construct() {
parent::__construct('test.flv');
}
}
$b = new B();
print get_class($b);
它返回ffmpeg_movie
而不是B
。此外,事实证明,使用B
对象时无法访问$b
类中定义的方法:
class B extends ffmpeg_movie {
public function __construct() {
parent::__construct('test.flv');
}
public function test() {
print 'ok';
}
}
$b = new B();
$b->test();
Fatal error: Call to undefined method ffmpeg_movie::test() in .../test.php on line 13
这到底发生了什么,是否有解决方法?
答案 0 :(得分:1)
我没有发现问题的根源是什么。我设法通过不直接扩展ffmpeg_movie类来解决它,而是使用__call
,__get
和__set
PHP魔术方法来模仿继承。
答案 1 :(得分:0)
这是get_class()的未定义行为,之前已多次讨论过。
从PHP 4.3.0开始,常量 CLASS 存在且包含类名。
在有人提供解决方案之前,你可能会在B类中找到类似的东西:
public function whoAmI() {
return __CLASS__;
}
或(来自谷歌搜索)可能
public function whoAmI() {
return getClass($this);
}