在PHP中导入名称空间

时间:2018-10-05 13:43:22

标签: php

我刚刚开始学习PHP框架并使用namespaceuse。我已经尝试了一些资源来理解它们(https://code.tutsplus.com/tutorials/namespacing-in-php--net-27203)。我想我知道什么是名称空间,但是我不太了解名称空间导入(use关键字)的工作原理。

我知道命名空间的工作方式如下。我有一个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关键字。我在use关键字中使用namespace \ classname,并且可以直接实例化该类。我猜想当我们使用“ use”时,该类的命名空间将成为主要名称。

<?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关键字导入名称空间,use关键字是否也总是需要一个类?
  2. 如何导入名称空间(然后在该名称空间中实例化多个类)?
  3. 对于上面的示例,如何使用这两个类,一个在主命名空间中,另一个在命名空间proj \ lib1命名空间中?

1 个答案:

答案 0 :(得分:2)

use namespaceproj\lib1 ;

这里您要导入名称空间,而不是该名称空间内的所有类。因此,您试图创建一个指向命名空间lib1的符号namespaceproj\lib1。之所以失败,是因为您已经有一个lib1符号作为类。

use namespaceproj\lib1  as libnew;

同样,namespaceproj\lib1是名称空间,而不是类。因此,现在您有了一个名为libnew的命名空间符号,您可以使用以下别名命名空间实例化类:

new libnew\lib1;

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

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