使用 composer php 来避免依赖
Using composer php to avoid the dependency
我在 composer 的实现中遇到了困难。我不明白自动加载的形成。我要勾勒出文件目录,然后你们就告诉我如何将 class 的目标形成为自动加载:
|---------src/
| |-----bitm/
| | |---person/
|person.php
| | |---Age/
|age.php
| |-----vendor/
|----composer
|autoload.php
| |
| |composer.json
| |
| |index.php
以上结构是我在网络服务器中的文件夹结构。
以下代码适用于 composer.json
{
"autoload":{
"psr-4":{
"bitm\person" : "src"
}
}}
以下代码用于 index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<?php
/*function __autoload($className){
//var_dump($className);
include_once($className.".php");
}*/
include_once("vendor/autoload.php");
use bitm\person\person;
use bitm\age\age;
$mamun=new person('Mamun');
$age=new age(24);
$mamun->greeting();
$age->personAge();
?>
</body>
</html>
我为 person.php 使用的命名空间是 bitm\person
我为 age.php 使用的命名空间是 bitm\age.
我的问题是你们为什么显示
Fatal error: Class 'bitm\person\person' not found in C:\xampp\htdocs\basis_mamun_ewu\Mamun\src\index.php on line 18
如果我正确阅读了你的 ASCII-art,你有四个错误:
composer.json
位于 src
目录中。没关系,但是任何与自动加载相关的路径都是相对于 composer.json
文件的位置的,而你的自动加载路径中有 src
- 错误。您要加载的代码在 bitm
目录中。
- PSR-4 前缀必须以反斜杠结尾。作曲家可能已经对此抱怨过。 运行
composer validate
看到这个,可能还有更多错误。正如您已经对内部反斜杠所做的那样,它必须在 JSON 中进行转义,因此它应该显示为 "bitm\person\"
.
- PSR-4标准告诉你,classname去掉前缀部分,剩下的部分转成路径。如果你有一个 class
bitm\person\person
和一个前缀 bitm\person
,那么 class 名称的其余部分是 person
,将被转换为路径 person.php
并假定在您在 composer.json
文件中提供的目录中。我已经提到 src
是错误的,但举个例子:Composer 会尝试加载文件 src/person.php
(相对于 composer.json
的位置)。
- 虽然PHP class不区分大小写,PHP在自动加载时不会转换class名称大小写,class名称会转化为文件名。但是文件系统是区分大小写的(除非你使用 Windows)。您有一个目录
Age
,但正在使用命名空间 age
。这将不匹配。始终在任何地方使用相同的大小写。
另请注意,您为 bitm\person
添加了前缀,但没有为 bitm\age
添加前缀,因此您无法自动加载年龄 class。你可以在自动加载部分有多个前缀,或者使用更通用的 bitm
前缀来捕获所有 classes.
我在 composer 的实现中遇到了困难。我不明白自动加载的形成。我要勾勒出文件目录,然后你们就告诉我如何将 class 的目标形成为自动加载:
|---------src/
| |-----bitm/
| | |---person/
|person.php
| | |---Age/
|age.php
| |-----vendor/
|----composer
|autoload.php
| |
| |composer.json
| |
| |index.php
以上结构是我在网络服务器中的文件夹结构。
以下代码适用于 composer.json
{
"autoload":{
"psr-4":{
"bitm\person" : "src"
}
}}
以下代码用于 index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<?php
/*function __autoload($className){
//var_dump($className);
include_once($className.".php");
}*/
include_once("vendor/autoload.php");
use bitm\person\person;
use bitm\age\age;
$mamun=new person('Mamun');
$age=new age(24);
$mamun->greeting();
$age->personAge();
?>
</body>
</html>
我为 person.php 使用的命名空间是 bitm\person 我为 age.php 使用的命名空间是 bitm\age.
我的问题是你们为什么显示
Fatal error: Class 'bitm\person\person' not found in C:\xampp\htdocs\basis_mamun_ewu\Mamun\src\index.php on line 18
如果我正确阅读了你的 ASCII-art,你有四个错误:
composer.json
位于src
目录中。没关系,但是任何与自动加载相关的路径都是相对于composer.json
文件的位置的,而你的自动加载路径中有src
- 错误。您要加载的代码在bitm
目录中。- PSR-4 前缀必须以反斜杠结尾。作曲家可能已经对此抱怨过。 运行
composer validate
看到这个,可能还有更多错误。正如您已经对内部反斜杠所做的那样,它必须在 JSON 中进行转义,因此它应该显示为"bitm\person\"
. - PSR-4标准告诉你,classname去掉前缀部分,剩下的部分转成路径。如果你有一个 class
bitm\person\person
和一个前缀bitm\person
,那么 class 名称的其余部分是person
,将被转换为路径person.php
并假定在您在composer.json
文件中提供的目录中。我已经提到src
是错误的,但举个例子:Composer 会尝试加载文件src/person.php
(相对于composer.json
的位置)。 - 虽然PHP class不区分大小写,PHP在自动加载时不会转换class名称大小写,class名称会转化为文件名。但是文件系统是区分大小写的(除非你使用 Windows)。您有一个目录
Age
,但正在使用命名空间age
。这将不匹配。始终在任何地方使用相同的大小写。
另请注意,您为 bitm\person
添加了前缀,但没有为 bitm\age
添加前缀,因此您无法自动加载年龄 class。你可以在自动加载部分有多个前缀,或者使用更通用的 bitm
前缀来捕获所有 classes.