是否可以为没有名称空间的类创建一个包,并在不使用语言构造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或更高版本。我无法使用命名空间,但我想使用作曲家进行自动加载和依赖项管理。” >
答案 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会跟踪它在哪里找到了东西,并且不会在其他任何地方重试,但是仍然会影响性能。因此,最好使用通用前缀。