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

ley*_*cua 18 php oop reflection

我知道classPHP 5.5上有一个静态字段,但我必须坚持使用PHP 5.4.是否可以从变量中获取完全限定的类名?

例:

namespace My\Awesome\Namespace

class Foo {

}
Run Code Online (Sandbox Code Playgroud)

以及代码中的其他地方:

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 
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*ran 23

你应该使用 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 
Run Code Online (Sandbox Code Playgroud)

这是一个直接复制粘贴示例 here


Nig*_*way 13

我知道这是一个老问题,但对于仍然发现这一点的人,我会建议这种方法:

namespace Foo;

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

// Usage:
use Foo\Bar;
// ...
Bar::fqcn(); // Return a string of Foo\Bar
Run Code Online (Sandbox Code Playgroud)

如果使用PHP 5.5,您可以这样做:

namespace Foo;

class Bar
{}

// Usage:
use Foo\Bar;
// ...
Bar::class; // Return a string of Foo\Bar
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...

对::类更多信息在这里.

  • @Kamafeather已添加。 (2认同)

Sha*_*him 7

对于使用 PHP 8.0 及更高版本的开发人员,您现在无需get_class.

PHP8 引入了对 on 对象的支持::class。例子:


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

   echo $var::class;
}

Run Code Online (Sandbox Code Playgroud)

请参阅RFC以获取更多信息。