我有一个类为其他类名设置一个类别名。当通过别名类在此类内部调用函数时,我需要知道使用了哪个别名。有没有办法在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时,如何获得被调用的别名类?
答案 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
这是因为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
这可能不适用于所有情况。在PHP中,私有成员可以不被后代类看到,因此这可能会严重破坏您的代码。