2012-06-22 2 views
1

Когда я запускаю следующий код я получаю B, как и ожидалось:Есть ли способ наследовать класс ffmpeg_movie в PHP?

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

Что именно происходит здесь и есть обходной путь?

ответ

1

я не обнаружил какова была причина проблемы. Мне удалось решить эту проблему, хотя я не просто расширил класс ffmpeg_movie и вместо этого использовал __call, __get и __set PHP-методы магии для имитации наследования.

0

Это неопределенное поведение get_class(), и это обсуждалось много раз раньше.

С PHP 4.3.0 константа КЛАСС существует и содержит имя класса.

Пока кто-нибудь не придет с решением, вы могли бы возиться с чем-то вроде этого внутри вашего класса B:

public function whoAmI() { 
    return __CLASS__; 
} 

ИЛИ (от прибегая к помощи) ВОЗМОЖНО

public function whoAmI() { 
    return getClass($this); 
} 
+0

Это не просто ошибка функции get_class. Методы класса «B» также недоступны (см. Обновленный вопрос). –

Смежные вопросы