PHP 5.4: 获取实例变量的完全限定类名

24

我知道PHP 5.5版本中有一个静态class字段,但我必须使用PHP 5.4版本。是否有可能从变量中获取完全限定的类名?

示例:

namespace My\Awesome\Namespace

class Foo {

}

而在代码的其他地方:

public function bar() {
   $var = new \My\Awesome\Namespace\Foo();

   // maybe there's something like this??
   $fullClassName = get_qualified_classname($var);

   // outputs 'My\Awesome\Namespace\Foo'
   echo $fullClassName 
}

2
所以显然get_class()也提供了命名空间。你试过了吗? - arkascha
3个回答

32

你应该使用get_class

如果你正在使用命名空间,这个函数将返回包括命名空间的类名,因此请注意如果你的代码对此进行任何检查。

namespace Shop; 

<?php 
class Foo 
{ 
  public function __construct() 
  { 
     echo "Foo"; 
  } 
} 

//Different file 

include('inc/Shop.class.php'); 

$test = new Shop\Foo(); 
echo get_class($test);//returns Shop\Foo 

这是一个直接从这里复制粘贴的示例。


16

我知道这是一个老问题,但对于仍在寻找答案的人,我建议采用以下方法:

namespace Foo;

class Bar
{
    public static function fqcn()
    {
        return __CLASS__;
    }
}

// Usage:
use Foo\Bar;
// ...
Bar::fqcn(); // Return a string of Foo\Bar

如果使用 PHP 5.5,您只需这样做:

namespace Foo;

class Bar
{}

// Usage:
use Foo\Bar;
// ...
Bar::class; // Return a string of Foo\Bar
希望这有所帮助...
更多关于::class的信息,请点击这里

7

对于使用 PHP 8.0 及以上版本的开发人员,您现在可以轻松地做到这一点而不需要使用 get_class

PHP 8 引入了支持对象上的 ::class。例如:


public function bar() {
   $var = new \My\Awesome\Namespace\Foo();

   echo $var::class;
}

这里是有关更多信息的RFC


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接