PHP 命名空间和“使用”

Posted

技术标签:

【中文标题】PHP 命名空间和“使用”【英文标题】:PHP namespaces and "use" 【发布时间】:2012-05-19 11:57:49 【问题描述】:

我在命名空间和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 语句,我会得到:

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

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

【问题讨论】:

也关于这个主题 - ***.com/questions/33341955/… 【参考方案1】:

use operator 用于为类、接口或其他命名空间的名称提供别名。大多数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 运算符与autoloading 混淆。通过注册一个自动加载器(例如使用spl_autoload_register)来自动加载一个类(不需要include)。您可能想阅读PSR-4 以了解合适的自动加载器实现。

【讨论】:

因此,如果我创建另一个名为 bootstrap.php 的文件并在其中放置一个自动加载器以及 $circle = new Circle();它包括 Circle.php,但我收到一个错误:致命错误:第 6 行的 .../Circle.php 中找不到类“Shape”。它似乎加载了 Circle.php,但没有加载 Shape.php 定义了圆如:类Circle扩展Shape实现ShapeInterface 如果我从上述类中删除命名空间,自动加载器工作正常。但是,当我在形状类的接口中有命名空间时,出现上述错误 Created a gist 举个例子。不幸的是,要点不能有子文件夹。将 bootstrap.php 放在一个文件夹中,并将其他类放在一个名为“Shape”的子文件夹中。【参考方案2】:

如果您需要将代码排序到命名空间中,只需使用关键字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;

【讨论】:

以上是关于PHP 命名空间和“使用”的主要内容,如果未能解决你的问题,请参考以下文章

现代PHP-命名空间

PHP 命名空间和“使用”

到 PHP 命名空间或不到 PHP 命名空间 [关闭]

PHP命名空间

php命名空间使用总结

php命名空间和autoload