PHP 在 (1) 导入非复合命名空间或 (2) 导入任何命名空间以实例化 class 时出错

PHP error while (1) Importing a non-compound namespace or (2) Importing any namespace to instantiate a class

非复合 PHP 命名空间的示例:

namespace Html;

复合 PHP 命名空间的示例:

namespace NS\Html;

如果我尝试导入非复合 PHP 命名空间,我会收到以下错误:

Warning: The use statement with non-compound name 'Html' has no effect in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php on line 34

接下来,我尝试使用复合 PHP 命名空间。现在上面的错误(在尝试使用命名空间时)消失了,但是当我尝试在导入的命名空间中实例化 class 时,出现错误:

Fatal error: Uncaught Error: Class 'Table' not found in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php:38

我发现有效的是以下组合:

  1. 使用复合命名空间
  2. 导入 class 而不是命名空间 然后,我可以实例化 class 而不会出现任何错误。

这与 manual 所说的相反。

请注意我使用的是 Lightspeed PHP 7.3 版。

这是有效的代码:

命名空间定义:必须是复合的(在文件 Namespace1.php 中):

<?php

  namespace NS\Html;

  class Table
  {
  }
?>

导入并使用 class(而不是命名空间)(文件导入Namespace1.php):

      use NS\Html\Table As Table;   # Import and alias the class.

      $table = new Table();

?>

我想问: 有没有人实际使用非复合命名空间然后导入命名空间(而不是 class)来实例化 class?请提供实际代码。

如果我没理解错的话,我想这就是你要找的东西?

namespace b {
    class my_class{
        function test() {
            echo 'here';
        }
    }
}

namespace a {
    use b as c;
    // FQN
    (new \b\my_class())->test();
    // Aliased
    (new c\my_class())->test();
}

我个人永远不会写这样的代码,我也不知道您可以为命名空间设置别名,但它似乎可以工作。

演示:https://3v4l.org/79Dmg

编辑

这是一个包含两个文件且没有括号命名空间的版本

<?php

// file b.php
namespace b;

class my_class
{
    function test()
    {
        echo 'here';
    }
}
<?php

// file a.php
namespace a;

use b as c;

require_once 'b.php';

// FQN
(new \b\my_class())->test();
// Aliased
(new c\my_class())->test();