В PHP, как вы получаете вызываемый псевдоним класса при использовании class_alias? - PullRequest
6 голосов
/ 10 февраля 2012

У меня есть класс, который устанавливает псевдоним класса для других имен классов.Когда функция вызывается внутри этого класса через псевдоним, мне нужно знать, какой псевдоним был использован.Есть ли способ сделать это в PHP?

Я пробовал следующий код:

class foo
{
  public static function test()
  {
    var_dump(get_called_class());
  }
}

class_alias('foo', 'bar');

foo::test();
bar::test();

Какой вывод:

string 'foo' (length=3)
string 'foo' (length=3)

Но я хочу bar::test();вместо этого вывести string 'bar' (length=3).Хватаясь за соломинку, __CLASS__ и get_class() все дают одинаковый результат.Кажется, я не могу найти в документации PHP ничего другого, что помогло бы мне с этой проблемой, но, надеюсь, я что-то упускаю.

Как вы получаете aliased класс при использовании class_alias?

1 Ответ

7 голосов
/ 11 февраля 2012

Вы не можете сделать это легко, начиная с 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 закрытые члены могут не быть видимыми классами-потомками, так что это может ужасно испортить ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...