在PHP中,当使用class_alias时,如何获得被调用的别名类?
我有一个为其他类名设置类别名的类。当通过别名类在该类内部调用函数时,我需要知道使用了哪个别名。有没有办法在PHP中实现这一点 我尝试了以下代码:在PHP中,当使用class_alias时,如何获得被调用的别名类?,php,php-5.3,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) str
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()
输出字符串“bar”(长度=3)
。抓着稻草,\uuu CLASS\uuu
和get\u CLASS()
都会产生相同的结果。在PHP文档中,我似乎找不到任何能帮助我解决这个问题的东西,但希望我忽略了一些东西
使用类别名时,如何获得被调用的别名类?从PHP5.3-5.5开始,您无法轻松做到这一点 只有少数几种方法可以确定在进行调用时“当前”类是什么。它们都返回unliased类
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\u 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
这可能并不适用于所有情况。在PHP中,子类看不到私有成员,因此这可能会严重破坏代码。我个人建议不要给类添加别名。它只会以眼泪结束。你不能,除非你使用可怕的debug_backtrace()方法。。。bar::test()没有在bar类中调用test(),后者是foo类的副本或克隆;它在foo类本身中调用test(),而foo类恰好也有一个别名bar,因此get_called_class()自然会返回“foo.Dup”