【发布时间】:2019-03-11 01:02:49
【问题描述】:
我刚刚开始学习 PHP 框架并使用 namespace 和 use。我浏览了一些资源试图了解它们 (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'。
我的问题是:
- 即使我告诉它导入命名空间,use 关键字是否总是需要一个类?
- 如何导入命名空间(然后在该命名空间中实例化多个类)?
- 对于上面的示例,您如何使用这两个类,一个在主命名空间中,另一个在 namespaceproj\lib1 命名空间中?
【问题讨论】:
-
导入仅适用于for single classes。命名空间不像其他语言那样是模块。它仅用于类名映射。
-
"我猜当我们使用 "use" 时类的命名空间会变成 main – 不,你只是 创建一个别名 .
use只是在当前文件中为该类/命名空间建立一个替代名称(通常是一个较短的)名称。不多也不少。
标签: php