130

我在命名空间和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”

有人可以就这个问题给我一些指导吗?

4

2 回答 2

185

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混淆。通过注册一个自动加载器(例如使用)来自动加载一个类(不需要)。您可能想阅读PSR-4以了解合适的自动加载器实现。includespl_autoload_register

于 2012-05-10T21:17:29.757 回答
15

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

文件1.php

namespace foo\bar;

在文件 2.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;

于 2017-02-24T17:16:18.530 回答