代码之家  ›  专栏  ›  技术社区  ›  Knownow

在PHP中导入命名空间

php
  •  0
  • Knownow  · 技术社区  · 6 年前

    namespace use . 我查阅了一些资料试图理解它们( https://code.tutsplus.com/tutorials/namespacing-in-php--net-27203 ). 我想我知道名称空间是什么,但我不太明白名称空间是如何导入的(

    我发现名称空间的工作方式如下。我有一个lib.php文件:

    <?php
    namespace namespaceproj\lib1;
     class lib1 {
         private $var;
         function __construct(){
             $this->var='Run from lib';
             echo $this->var;
         }
     }
    

    我有一个index.php文件

    <?php
    namespace main ;
    include "lib.php";
    
    class lib1 {
         private $var;
         function __construct(){
             $this->var='run from main';
             echo $this->var;
         }
    }
    $obj=new \namespaceproj\lib1\lib1(); // this refers to the class  with namespace namespaceproj\lib1;  
    $obj = new lib1();// this refers to the class with namespace main .
    

    一切都很好,现在我试着用 使用 关键字。我在use关键字中使用namespace\classname,可以直接实例化类。我猜当我们使用“use”时,类的名称空间就变成了main。

    <?php
    namespace main ;
    include "lib.php";
    
    class lib1 {
         private $var;
         function __construct(){
             $this->var='run from main';
             echo $this->var;
         }
    }
    
    //Accessing class using use
    use namespaceproj\lib1\lib1 as lib1inc ;
    $obj=new lib1(); //This refers to class with main namespace
    $obj=new lib1inc(); // This refers to class with namespaceproj\lib1; namespace 
    */
    

    现在是我无法理解的部分。如果不想单独导入类,而是要导入命名空间中的许多类,会发生什么情况?资源提示您可以使用use关键字导入名称空间。所以我尝试导入lib文件的名称空间并尝试实例化对象。如果我试着这样做

    use namespaceproj\lib1 ;
    $obj=new libnew();
    

    它给我一个错误说:

    无法将namespaceproj\lib1用作lib1,因为该名称已在第26行的C:\xampp\htdocs\AllTest\index.php中使用

    我猜名称空间和该名称空间中的所有类都被导入到主名称空间,因此出现了错误。

    as 关键字

    use namespaceproj\lib1  as libnew;
    $obj=new libnew();
    

    这给了我一个错误:

    致命错误:在第27行的C:\xampp\htdocs\AllTest\index.php中找不到类“namespaceproj\lib1”。

    1. use关键字是否总是期望一个类,即使我告诉它导入一个名称空间?
    2. 如何导入命名空间(然后在该命名空间中实例化多个类)?
    3. 对于上面的示例,如何使用两个类,一个在main namespace中,另一个在namespaceproj\lib1 namespace中?
    1 回复  |  直到 6 年前
        1
  •  2
  •   Devon Bessemer    6 年前
    use namespaceproj\lib1 ;
    

    这里导入的是名称空间,而不是名称空间中的所有类。因此,你试图创造一个符号 lib1 指向命名空间 namespaceproj\lib1 . 这失败了,因为你已经有一个

    use namespaceproj\lib1  as libnew;
    

    再一次, 名称空间项目\lib1

    new libnew\lib1;
    

    PHP7引入了组导入语法,但它仍然要求您声明要导入的类。

    use some\namespace\{ClassA, ClassB, ClassC}