我想知道Composer如何知道在要执行的脚本中使用了哪些 类 。 PHP是否提供带有回调的挂钩机制?我猜因为下面的代码有效(假设已安装PHP Redis扩展,Redis在本地主机上运行且提供了auth令牌,并且class_name密钥设置为字符串'App\Examples\B'
),所以它没有检查代码: / p>
/app/Examples/A.php
<?php namespace App\Examples;
class A
{
public function __construct()
{
echo "Constructing A!\n";
}
}
/app/Examples/B.php
<?php namespace App\Examples;
class B
{
public function __construct()
{
echo "Constructing B!\n";
}
}
/app/main.php
<?php namespace App;
use App\Examples\A;
include __DIR__ . '/../vendor/autoload.php';
$r = new \Redis;
$r->connect('localhost');
$r->auth('GJuqgx[0h-OtO94X7W[9');
// App\Examples\B
$class_name = $r->get('class_name');
$a = new A;
$b = new $class_name;
从命令行运行此命令会产生预期的输出:
$ php app/main.php
Constructing A!
Constructing B!
作曲家如何知道甚至寻找App\Examples\B
?
我想强调,我不询问作曲家如何知道在哪里找到App\Examples\B
,而是问如何< / strong>,它知道首先需要找到App\Examples\B
。
答案 0 :(得分:1)
这全部与自动加载过程有关。 PHP Introperability Group(PHP无序性小组)针对自动加载提出了一项建议,称为PSR-4。作曲家使用了这个。
您必须在PHP代码中使用名称空间。最佳做法是为作曲家软件包使用唯一的名称空间。像YourCompany\ModuleName\
等。这些名称空间由编辑器解析为包含相应PHP类的路径。基本路径在composer程序包配置中(通常是程序包目录中的composer.json
文件)。这些信息由作曲家自动加载器获取,以找到正确的PHP类。