PHP名称空间和“使用”


120

我在命名空间和use语句上遇到了一些麻烦。

我有三个文件:ShapeInterface.phpShape.phpCircle.php

我正在尝试使用相对路径进行此操作,因此已将其放在所有类中:

namespace Shape; 

在我的圈子课程中,我有以下内容:

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

如果使用这些include语句,我不会出错。如果我尝试以下use语句,则会得到:

致命错误:在第8行的/Users/shawn/Documents/work/sites/workspace/shape/Circle.php中找不到类'Shape \ Shape'

有人可以给我一些指导吗?


Answers:


169

use运营商是给别名类,接口或其他命名空间的名称。大多数use语句引用您要缩短的名称空间或类:

use My\Full\Namespace;

等效于:

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

如果将use运算符与类或接口名称一起使用,则具有以下用途:

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

use运营商不与混淆自动加载include通过注册自动加载器(例如,通过spl_autoload_register)自动加载类(无需使用)。您可能需要阅读PSR-4才能看到合适的自动加载器实现。


因此,如果我创建另一个名为bootstrap.php的文件,并将自动加载器与$ circle = new Circle()一起放入其中;它包含Circle.php,但出现错误:致命错误:在第6行的... / Circle.php中找不到类“ Shape”。它似乎加载了Circle.php,但未加载Shape.php如:类Circle扩展Shape实现ShapeInterface
Shawn Northrop

如果我从上述类中删除了名称空间,则自动加载器可以正常工作。但是,当我在形状类的接口中有名称空间时,会出现上述错误
Shawn Northrop'5

1
创建要点以举一个例子。不幸的是,要点不能有子文件夹。将bootstrap.php放在一个文件夹中,并将其他类放在一个名为“ Shape”的子文件夹中。
cmbuckley

13

如果需要将代码排序到名称空间中,只需使用关键字namespace

file1.php

namespace foo\bar;

在file2.php中

$obj = new \foo\bar\myObj();

您也可以使用use。如果在file2中,您将

use foo\bar as mypath;

您需要使用mypath而不是bar文件中的任何位置:

$obj  = new mypath\myObj();

使用use foo\bar;等于use foo\bar as bar;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.