我正在研究php中的命名空间和 Doctrine 2.2 一周。
我浏览了几个博客,并在php中阅读了几篇关于命名空间的文章。
据我所知,当我们想在不同的php页面中使用不同的名称空间时,我们必须写:include('php page that belong namespace we want to use');
但是,Doctrine 2.2不使用任何include
或require
或require_once
语句来使用命名空间。几乎所有 Doctrine 2.2 中的脚本都是这样的:
学说\ ORM \ EntityManager.php
<?php
namespace Doctrine\ORM;
use Closure, Exception,
Doctrine\Common\EventManager,
Doctrine\Common\Persistence\ObjectManager,
Doctrine\DBAL\Connection,
Doctrine\DBAL\LockMode,
Doctrine\ORM\Mapping\ClassMetadata,
Doctrine\ORM\Mapping\ClassMetadataFactory,
Doctrine\ORM\Query\ResultSetMapping,
Doctrine\ORM\Proxy\ProxyFactory,
Doctrine\ORM\Query\FilterCollection;
class EntityManager implements ObjectManager
{
/**
* The used Configuration.
*
* @var \Doctrine\ORM\Configuration
.............
..................................
..................................
..................................
..................................
?>
Doctrine 2.2 中没有include
或require
声明。
但是我们运行页面(Doctrine \ ORM \ EntityManager.php)会出现致命错误,
致命错误:找不到接口'Doctrine \ Common \ Persistence \ ObjectManager' 在第45行的C:\ xampp \ htdocs \ www \ DoctrineExplained \ DoctrineORM \ Doctrine \ ORM \ EntityManager.php
虽然 Doctrine 2.2 是 Doctrine ORM 的稳定版本,但为什么不将include
或require
用于名称空间和{{1} } S'
答案 0 :(得分:1)
大多数PHP 5.3代码都是这样的。 Doctrine希望在开始使用之前设置自动加载。您可以定义自己的__autoload()函数,使用spl_register_autoload()或使用与许多框架捆绑在一起的实现之一。
这也可以做很长时间。在公约进行调整之前花了一些时间,命名空间推动了这一变化。