变量类名忽略当前名称空间

时间:2015-02-19 22:24:18

标签: php namespaces

我很困惑为什么变量类名似乎忽略了当前的名称空间?

我希望以下内容相同

<?php
namespace so\level1{

  class test{
    function __construct() {
      echo "working correctly\r\n"; 
    }
  }

}

namespace so {
  $a = new level1\test();
  $b = 'level1\\test';
  $c = new $b();
}

相反,$c是新\level1\test而不是\so\level1\test

这似乎与http://php.net/manual/en/language.namespaces.fallback.php

相矛盾
  

类名始终解析为当前名称空间名称

http://php.net/manual/en/language.namespaces.rules.php

  

在命名空间内,所有未根据的属性转换的限定名称   导入规则具有前置的当前名称空间。例如,如果是   调用C \ D \ e()是在命名空间A \ B中执行的,它被转换为   A \ B \ C \ d \ E()。

我没有导入规则,因此它似乎也建议$a$c相同

我缺少哪些文件?或者行为是错的?

以上输出

working correctly
PHP Fatal error:  Class 'level1\test' not found in /tmp/namespace.php on line 15
PHP Stack trace:
PHP   1. {main}() /tmp/namespace.php:0

使用PHP 5.5.9和5.5.21

添加

namespace level1 {
  class test{
    function __construct() {
      echo "Not working correctly\r\n";
    }
  }
}

使第二个名称空间解析,但似乎是不正确的行为

要确认,由于以下

,这似乎不正确
<?php
namespace so {
  $test = "namespace";
  $var = "test";
  echo $$var;
}

这可以正确解决问题&#34;但与上述内容不一致。

虽然call_user_func的行为方式与类

类似
namespace so {
  function testing() {
    echo "in namespace";
  }
  call_user_func(__NAMESPACE__ . "\\testing");
}

在最后一种情况下,它实际上是记录在案的。使用变量函数的行为方式相同

1 个答案:

答案 0 :(得分:3)

答案是,它不起作用,因为如果你开始使用动态类名称&#34;当前命名空间&#34;是全局命名空间。

但它似乎是不正确的行为,没有,正如我所说,如果你使用动态类名称&#34;当前命名空间&#34;是全球性的,而不是它所写的那个。

但有一点,你是对的。这在手册中没有明确说明。

那么现在该如何解决?您可以使用魔术常量__NAMESPACE__来获取当前命名空间,您只需执行此操作:

namespace so\level1{

  class test{
    function __construct() {
      echo "working correctly\r\n"; 
    }
  }

}

namespace so {
  $a = new level1\test();
  $b = __NAMESPACE__ . '\\level1\\test';
  $c = new $b();
}

输出:

working correctly working correctly