Вы не можете сделать это легко, начиная с PHP 5.3-5.5.
Существует только несколько способов определить, что представляет собой «текущий» класс при совершении вызова.Все они возвращают несвязанный класс.
class First {
public function test1() { echo get_called_class(); }
public function test2() { print_r(debug_backtrace()); }
public function test3() { echo get_class($this); }
public function test4() { echo __CLASS__; }
public static function test5() { echo get_called_class(); }
}
class_alias('First', 'Second');
$aliased = new Second();
$aliased->test1(); // First
$aliased->test2(); // array( 0 => array( ... [object] => First Object, ... ) )
$aliased->test3(); // First
$aliased->test4(); // First
Second::test5(); // First
3v4l demo .
Это потому, что class_alias
не создает new class с новым именем, он создает еще одну запись в списке классов, которая указывает на тот же класс, что и оригинал.Когда вы просите PHP посмотреть, какой класс используется, он находит исходный класс, а не псевдоним.
Если вам нужно создать новый класс, это не более чем исходный класс с другим именем, вы 'Я должен сделать это через наследование.Вы можете сделать это динамически, используя eval
.Я не могу поверить, что я рекомендую eval
для чего-то.Eww.
class First {
public function test1() { echo get_called_class(); }
public function test2() { print_r(debug_backtrace()); }
public function test3() { echo get_class($this); }
public function test4() { echo __CLASS__; }
public static function test5() { echo get_called_class(); }
}
function class_alias_kinda($original, $alias) {
eval("class $alias extends $original {}");
}
class_alias_kinda('First', 'Second');
$aliased = new Second();
$aliased->test1(); // Second
$aliased->test2(); // array( 0 => array( ... [object] => Second Object, ... ) )
$aliased->test3(); // Second
$aliased->test4(); // First (this is expected)
Second::test5(); // Second
3v4l demo .
Это может работать не во всех случаях.В PHP закрытые члены могут не быть видимыми классами-потомками, так что это может ужасно испортить ваш код.