【问题标题】:PHP sub-namespaces usagePHP 子命名空间的使用
【发布时间】:2023-04-07 12:51:01
【问题描述】:

PHP 和命名空间。

我认为我误解了它的正确用法/想法..
(请读到最后)
我有两个文件:1.php2.php

1.php:

namespace App\someNS;

class classname{}

2.php:

namespace App;
include_once("1.php");
use App\someNS; // tried to comment it also, not working

$ x = new classname();
// this fails..

我的假设是命名空间是容器\范围,所以通过包含一个 - 我可以访问它的内容;
我预计use App\someNS 将“包含”它。

我知道 someNS\classname() 会起作用,但是我看不到命名空间的巨大优势,如果从它们中唯一的“利润”是使用相同名称的变量的选项,如果毕竟我仍然需要使用路径来获取它们...我错过了什么?

【问题讨论】:

标签: php namespaces


【解决方案1】:

命名空间、use 和包含文件实际上是三个不同的东西:

  • 命名空间只是一个前缀,它允许在代码库的不同部分重用相同的类和函数名称。

  • use 语句仅创建一个别名,因此您无需键入全名(命名空间 + 本地名称),或者您可以使用不同名称的所有对象。它不导入或加载代码。

  • include 实际上使其他文件中的代码可用,但在 PHP 中实现命名空间之前它已经存在多年。

也就是说,你的代码应该抛出:

在 ...\2.php 中找不到类 'App\classname'

那是因为您的 use 别名用于命名空间,所以您需要调用:

new someNS\classname();

为了能够做到new classname(),你需要给类起别名:

use App\someNS\classname;

【讨论】:

    【解决方案2】:

    命名空间的作用类似于文件系统中的目录和文件。

    可以进入目录,执行文件:

    cd /var/www/project
    
    phpunit SomeTest
    

    或者你可以执行传递整个路径的文件:

    /var/www/project/phpunit SomeTest
    

    在您的示例中,您可以使用:

    //class2
    namespace App;
    
    include_once('1.php');
    use App\someNS\classname;
    
    $x = new classname();
    

    或者

    //class2
    namespace App;
    
    include_once('1.php');
    use App\someNS;
    
    $x = new someNS\classname();
    

    甚至

    //class2
    namespace App;
    
    include_once('1.php');
    
    $x = new someNS\classname();
    

    您可以找到更多详情here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-08
      • 2010-10-20
      • 2012-05-19
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多