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