在PHP中,如何在使用class_alias时获得被调用的别名类?

Joe*_*oni 6 php php-5.3

我有一个类为其他类名设置一个类别名.当通过别名类在此类内部调用函数时,我需要知道使用了哪个别名.有没有办法在PHP中执行此操作?

我试过以下代码:

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

class_alias('foo', 'bar');

foo::test();
bar::test();
Run Code Online (Sandbox Code Playgroud)

哪个输出:

string 'foo' (length=3)
string 'foo' (length=3)
Run Code Online (Sandbox Code Playgroud)

但我想bar::test();输出string 'bar' (length=3).抓救命稻草,__CLASS__get_class()所有产生相同的结果.我似乎无法在PHP文档中找到任何可以帮助我解决这个问题的内容,但希望我忽略了一些东西.

使用class_alias时如何获得被调用的别名类?

Cha*_*les 7

从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
Run Code Online (Sandbox Code Playgroud)

3v4l演示.

这是因为class_alias不会使用新名称创建类,它会在类列表中创建另一个与原始类相同的类.当您要求PHP查找正在使用的类时,它会找到原始类,而不是别名.

如果你需要创建一个新类,不再是具有不同名称的原始类,你需要通过继承来实现.您可以使用动态执行此操作eval.我不敢相信我会推荐eval一些东西.好恶.

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
Run Code Online (Sandbox Code Playgroud)

3v4l演示.

这可能不适用于所有情况.在PHP中,后代类不能看到私有成员,因此这可能会严重破坏您的代码.