【问题标题】:Import namespace in PHP在 PHP 中导入命名空间
【发布时间】:2019-03-11 01:02:49
【问题描述】:

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

【问题讨论】:

  • 导入仅适用于for single classes。命名空间不像其他语言那样是模块。它仅用于类名映射。
  • "我猜当我们使用 "use" 时类的命名空间会变成 main – 不,你只是 创建一个别名 . use 只是在当前文件中为该类/命名空间建立一个替代名称(通常是一个较短的)名称。不多也不少。

标签: php


【解决方案1】:
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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2021-02-26
    相关资源
    最近更新 更多