PHP 命名空间和“使用”
Posted
技术标签:
【中文标题】PHP 命名空间和“使用”【英文标题】:PHP namespaces and "use" 【发布时间】:2012-05-19 11:57:49 【问题描述】:我在命名空间和use
语句方面遇到了一些问题。
我有三个文件:ShapeInterface.php
、Shape.php
和 Circle.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 命名空间和“使用”的主要内容,如果未能解决你的问题,请参考以下文章