【问题标题】:variable class name ignoring current namespace变量类名忽略当前命名空间
【发布时间】:2015-02-19 22:24:17
【问题描述】:

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

我希望以下内容相同

<?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;
}

这解决了“正确”但与上述不一致。

虽然 call_user_func 的行为方式与类类似

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

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

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    答案是,它不起作用,因为如果你开始使用动态类名,“当前命名空间”就是全局命名空间。

    但这似乎是不正确的行为,不,正如我所说,如果您使用动态类名,“当前命名空间”是全局命名空间,而不是写入它的命名空间。

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

    那么现在该如何解决呢?您只需使用魔术常量__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
    

    【讨论】:

    • 我意识到您的回答描述了行为,但没有将动态命名空间作为全局命名空间的文档,其行为仍然不稳定
    • @exussum 正如我所说,据我所知,这在手册中的任何地方都没有明确说明,但是如果您愿意,我可以为您提供一些链接,您可以在其中阅读“字里行间”。为什么行为仍然是不稳定的?
    • 从记忆中虽然无法测试当前以类似方式定义的变量和函数,但其​​行为并不像班级将在明天确认的那样,一些暗示该行为的粉红色也会很好
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2011-12-05
    • 2015-02-18
    • 1970-01-01
    • 2015-05-01
    • 2014-04-10
    相关资源
    最近更新 更多