在Symfony 2中,所有请求都通过app_dev.php (或app.php )进行路由。

前几行看起来像:

<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Debug\Debug;
...

从理论上讲,我得到的只是将指定的命名空间(或类)导入当前范围。 我不明白的是PHP如何将其映射到文件。 例如, Debug类位于:

vendor/symfony/symfony/src/Symfony/Component/Debug/Debug.php

PHP如何知道在vendor/symfony/symfony/src/查找?

我可能误解了正在发生的事情,但任何澄清都会受到赞赏。

#1楼 票数:3 已采纳

知道一个类所在的文件不是语言的工作,它是自动加载器的工作。

所有use关键字都是这个实例创建别名:

use Symfony\Component\HttpFoundation\Request;

这是说,在下面的脚本,当我指的是Request真正的意思Symfony\\Component\\HttpFoundation\\Request 如果我以某种方式使用Request对象(通过创建实例或在其上调用静态方法),那么自动加载器将尝试加载已定义类的文件(如果尚未加载它)。

但是,自动加载器的内部工作方式因项目而异。 已经有一种标准化自动加载器行为 PSR-4)的举措,但语言中没有任何内容表明您必须遵守该标准。 例如,您可以使用一种方案,其中所有类文件都驻留在单个目录中,并且您的自动加载器只是从那里加载所有类,而不管它们在哪个命名空间中。

这个计划会受到这样一个事实的影响,即每个名字只能有一个类,但没有什么可以阻止你这样做。

回答你的问题: “它如何知道”Symfony \\ Component \\ Debug \\ Debug“是一个有效的命名空间?”

它没有,因为它实际上并没有出去并试图在此时加载该类。 如果在任何随机的PHP脚本中,你在顶部放置这样的东西:

use \Non\Existant\ObjectClass;

但是,不要在任何地方实际使用 ObjectClass ,您将不会遇到任何错误。 但是,如果您尝试说new ObjectClass ,则会出现类未找到错误。

#2楼 票数:0

简单来说,您必须事先将所有文件加载到PHP的内存中。 PHP本身并没有任何标准来定位文件,加载文件的规则必须由您的代码完成。

当PHP尝试加载文件时,如果类定义存在,它将检查其内存,如果不存在,它将尝试自动加载可能包含类定义的文件; 请参阅PHP:自动加载类spl_autoload_register

PHP Framework Interop Group已经定义了一些常见的自动加载策略:

  • PSR-0 (自动加载标准)
  • PSR-4 (改进的自动加载标准)

在这种情况下,自动加载由Composer完成,您需要做的就是在任何脚本中包含vendor/autoload.php ,并且可以自动加载通过composer下载的供应商代码。 您也可以手动将类添加到composer自动加载器中。 请参阅: Composer自动加载

  ask by DiscoInfiltrator translate from so

未解决问题?本站智能推荐:

1回复

php注释,名称空间和use关键字

我正在为php编写注释解析器(由于特殊需要,我无法使用任何第三者),我以sympfony2代码为灵感 正如我在这里看到的那样,我们在use语句中定义ORM,然后注释解析器以某种方式知道ORM是Doctrine \\ ORM \\ Mapping的别名。 我的最终目标是能够将类名作为
1回复

如何在Symfony中将php代码包含到我的Controller中?

在我的控制器中,我有很多“使用”语句: Controller.php 为了清除我的代码,我想将它们放在另一个页面上,例如服务。 一种方法是,将代码放在页面Namespace.php上并包含它: 但是我收到错误消息: 警告:include(App \\ Se
2回复

Symfony 2中的PHP 5.3名称空间

我正在使用Symfony 2,并且正在关注本教程。 现在,本教程很简单,我能够完全按照它进行操作。 这是我的控制器中的代码 现在,我有一些问题 当我运行代码而不包含namespace DemoCompany\\HelloBundle\\Controller; ,这给了我一
1回复

如何在Symfony的控制器中使用PHP扩展的功能

我是Symfony 3.0的新手,我目前的项目是词分析。 更精确地计算单词的音节。 很难找到满足此需求的解决方案。 一段时间后,我偶然发现了PECL包“ ps”( http://php.net/manual/de/ref.ps.php ),确切地说是ps_hyphenate()函数( ht
1回复

PHP的'命名空间:控制器或控制器,模型还是模型?

例如,Symfony使用\\Controller 。 Yii2使用\\controllers和\\models 。 是否有关于...s|es的标准,如PSR?
1回复

在链配置的名称空间App \\ Entity中找不到类'App \\ Form \\ Database_InteractionType'

您好,当我尝试从数据库中删除某些内容时,我找不到错误。 它说我的名称空间是错误的,但是我真的找不到任何问题。 这是即时通讯呼吁 这是实体和我的表格。 我已经连续观察了2个小时,但似乎找不到Iusse .. 实体: 我的表格: 还有我的存储库,如果有帮助
3回复

我是否需要在Symfony2中使用名称空间?

我刚刚开始学习Symfony2(在过去2年中使用1.x之后),但由于需要输入更多内容而感到不满意。 我知道这听起来很懒,但是我喜欢这样的事实,我可以用更少的输入就可以快速在1.x中启动并运行某些东西。 我想知道是否可以在不使用名称空间的情况下自动加载类。 我所有的尝试(使用PEAR命名方案
2回复

Symfony2使用类

我有一个Orders.php文件,我想在其中使用类“测试”功能。 问题是类文件位于项目根文件夹中,但我不能使用它。 orders.php: 类文件test.php是: 现在,test.php类文件位于项目根文件夹中。 而且orders.php文件位于public_htm