在没有名称空间且不使用'use'的情况下加载和使用PHP类

时间:2019-10-07 13:23:48

标签: php composer-php autoload

是否可以为没有名称空间的类创建一个包,并在不使用语言构造use的情况下在我的脚本中实例化它?

例如:

<?php
require_once 'vendor/autoload.php';
// use \Something_MyClass; (I don't want to use this 'use')
$mc = new MyClass();     // instead of $mc = new Something\MyClass()
?>

下面我的评论的副本,只是为了澄清:

“这是因为我仍在使用php 5.2。出于遗留原因,我无法将php升级到5.3或更高版本。我无法使用命名空间,但我想使用作曲家进行自动加载和依赖项管理。”

2 个答案:

答案 0 :(得分:2)

不可能。

即使您向spl_autoload_register注册了一个函数,该函数在new MyClass()上将包含一个带有class Something_MyClass的文件,该行也会失败,因为您正在尝试实例化一个类那不存在。

您最好的做法是将PHP升级到5.3(尽管到目前为止,受支持的最低版本是7.1,我强烈建议去那里)。当然,您可以创建自己的软件包管理器(如YvesLeBorg在评论中建议的那样),但这将使您更深入地了解遗留问题,并使将来更加难以维护和升级PHP,更不用说潜在的错误和其他问题。维护费用。

答案 1 :(得分:1)

您可以在源代码中完美地使用PHP 5.2语法,并将其与Composer结合使用,甚至可以与Composer PSR-0自动加载结合使用。 Composer不执行有关PHP版本的任何规则。

唯一无法解决的问题是Composer本身需要PHP 5.3.2才能运行。但是其他一切取决于您。

更多详细信息,PHP 5.2中“命名空间类”的唯一选择是使用现在可怕的Under_Score_Class_Name变体,该变体可以随PSR-0自动加载。您将始终必须使用完整的类名(use,适当的名称空间将允许您使用较短的名称)。该示例类名必须位于路径/Under/Score/Class/Name.php中,并且将自动与"autoload": {"psr-0": {"Under": "/"}}一起加载。您无法使用PSR-0缩短该路径(发明了PSR-4的原因之一),它必须始终将下划线之间的每个单词作为文件夹级别,从第一个单词开始。您唯一可以更改的是Composer不需要您使用库主目录中的文件夹。您可以使用路径src/Under/Score/Class/Name.php并使用"psr-0": {"Under_": "src/"}自动加载。

使用PHP 5.3.2或更高版本运行Composer可能归结为a)安装它,然后b)在运行Composer时明确指向该版本,例如/usr/local/bin/php7.2.23/php composer.phar install

如果您不想使用长路径,则只允许在根名称空间中使用类名-但是请注意,它们不得与PHP本身重复现有的类名。如果没有上面示例中的通用类名前缀,例如Under_,则自动加载可能是"psr-0": {"": "src/"}。但是请注意,这告诉Composer自动加载器在您的库中可以找到每个类。 Composer会跟踪它在哪里找到了东西,并且不会在其他任何地方重试,但是仍然会影响性能。因此,最好使用通用前缀。