【问题标题】:PHP error while (1) Importing a non-compound namespace or (2) Importing any namespace to instantiate a class(1) 导入非复合命名空间或 (2) 导入任何命名空间以实例化类时出现 PHP 错误
【发布时间】:2021-11-08 19:27:10
【问题描述】:

非复合 PHP 命名空间示例:

namespace Html;

复合 PHP 命名空间的示例:

namespace NS\Html;

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

警告:在第 34 行的 /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php 中,使用非复合名称“Html”的 use 语句无效

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

致命错误:未捕获的错误:在 /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php:38 中找不到类“表”

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

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

这与manual 所说的相反。

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

这是有效的代码:

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

<?php

  namespace NS\Html;

  class Table
  {
  }
?>

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

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

      $table = new Table();

?>

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

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    如果我理解正确,我想这就是你要找的东西?

    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();
    
    

    【讨论】:

    • 您的示例如图所示。它使用命名空间的“括号语法”。当有 2 个源文件时不能使用。然后,必须使用不带括号的语法。 (这里,“命名空间”声明必须在文件的顶部。)您的示例给出了错误“致命错误:未捕获的错误:未找到类 'A\Table'”。
    • 无论文件数量如何,括号中的语法都有效。我个人觉得看到一个包裹在一个巨大的命名空间中的文件很奇怪,但是当其他语言的人来到 PHP 时我已经看到了。无论如何,我只是尝试了上述方法,无论是打开包装还是在不同的文件中,它的工作原理都是一样的。如果你愿意,我可以在上面发布一个更新的示例。
    • 您能否发布您的新示例,显示“无括号语法”+ 2 个文件,好吗?我会很感激的。谢谢。
    • @SSteven,我用那个更新了我上面的帖子
    • 我已经测试了您的解决方案,包括几个变体。他们都完美地工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多