Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,当使用class_alias时,如何获得被调用的别名类?_Php_Php 5.3 - Fatal编程技术网

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

在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

我有一个为其他类名设置类别名的类。当通过别名类在该类内部调用函数时,我需要知道使用了哪个别名。有没有办法在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()
输出
字符串“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”