作曲家如何知道使用了哪些类?

时间:2020-06-22 11:34:41

标签: php composer-php autoloader

我想知道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

1 个答案:

答案 0 :(得分:1)

这全部与自动加载过程有关。 PHP Introperability Group(PHP无序性小组)针对自动加载提出了一项建议,称为PSR-4。作曲家使用了这个。

您必须在PHP代码中使用名称空间。最佳做法是为作曲家软件包使用唯一的名称空间。像YourCompany\ModuleName\等。这些名称空间由编辑器解析为包含相应PHP类的路径。基本路径在composer程序包配置中(通常是程序包目录中的composer.json文件)。这些信息由作曲家自动加载器获取,以找到正确的PHP类。