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

时间:2012-02-10 14:50:20

标签: php php-5.3

我有一个类为其他类名设置一个类别名。当通过别名类在此类内部调用函数时,我需要知道使用了哪个别名。有没有办法在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文档中找到任何可以帮助我解决这个问题的内容,但希望我忽视了一些事情。

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

1 个答案:

答案 0 :(得分: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

3v4l demo

这是因为class_alias没有使用新名称创建 new 类,它会在类列表中创建另一个与原始类相同的类。当你要求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中,私有成员可以被后代类看到,因此这可能会严重破坏您的代码。