php获取包含文件的命名空间

Sen*_*lez 5 php namespaces

//file foo.php
<?php
namespace foo;
class foo{
    function __construct(){
        echo "hello";
    }
}
?>

//file index.php
<?php
require_once("foo.php");
echo __NAMESPACE__;
?>
Run Code Online (Sandbox Code Playgroud)

我的问题是,从我的index.php文件中,有没有可能知道foo.php的命名空间而不读取文件内容并在其上执行正则表达式?这似乎是很多开销.

///编辑

我真的希望能够将命名空间动态添加到包含的文件中.

<?php
namespace dynamic;
require_once("foo.php");
echo __NAMESPACE__;
?>
Run Code Online (Sandbox Code Playgroud)

我想允许第三方插件,但PHP命名空间似乎很糟糕.我不希望插件编辑器必须创建命名空间.

mar*_*rio 16

不,但你可以这样欺骗它:

//file foo.php
<?php
  namespace foo;
  //...
  return __NAMESPACE__;  // must be last line
?>
Run Code Online (Sandbox Code Playgroud)

阅读它:

//file index.php
<?php
  $ns = require_once("foo.php");
Run Code Online (Sandbox Code Playgroud)

  • nb从包含中返回值可能被视为不良行为,因为它不是传统行为. (4认同)

Art*_*era 5

好吧,你可以扫描类名称空间.它包含名称空间.这是PHPUnit的做事方式.所以ie:

$namespaces = get_current_namespaces();

include 'plugin/main.php';

$newNamespaces = get_current_namespaces(); 
array_diff($namespaces, $newNamespaces)
Run Code Online (Sandbox Code Playgroud)

以下是如何实现get_current_namespaces():是否可以获取已定义的命名空间列表


ona*_*lbi 5

如果您知道该文件,则可以简单地从中提取命名空间:)。

function extract_namespace($file) {
    $ns = NULL;
    $handle = fopen($file, "r");
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            if (strpos($line, 'namespace') === 0) {
                $parts = explode(' ', $line);
                $ns = rtrim(trim($parts[1]), ';');
                break;
            }
        }
        fclose($handle);
    }
    return $ns;
}
Run Code Online (Sandbox Code Playgroud)

并且您将不会被限制在文件末尾返回可能因退出或其他返回指令而中断的内容。