验证 PSR-4 file/class 结构(无痛迁移到 PSR-4)
Validate PSR-4 file/class structure (painless migrate to PSR-4)
我有一个在内部项目中使用的 composer 包。从历史上看,此包中的所有 classes 都是通过 "autoload": { "classmap": ... }
自动加载的,并且尚未结构化。
现在我想迁移到 PSR-4。我根据 class 命名空间重新排序了所有文件和目录。命名空间或 class 名称未更改,仅更改文件 locations/names。
如何验证我的新 file/class 结构以确保它符合 PSR-4 并且所有 classes 都可以通过 "autoload": { "psr-4": ... }
加载?我进行了 google 搜索,但没有找到任何工具。
选项 1
运行 你的测试。
无论是自动加载还是手动加载,它们都会显示任何无法自动加载的 classes。
选项 2
编写一个简单的脚本:
- 列出所有 PHP classes (FQCN)
- 包括 composer 自动加载器(配置了 psr4)
- 对于每个 class 尝试调用
class_exists
(这将触发自动加载)
如果给定 class 的 class_exists
失败,则表示其命名空间配置不正确。
我能够使用 Jakub Zalas 的回答(选项 2)中的提示解决我的问题。
想法是:
- 将作曲家的作品
autoload_classmap.php
复制到 autoload_classmap-orig.php
。
- 根据需要重新排列 classes/change
composer.json
。
- 针对 orig classmap 测试新的自动加载。
为了避免包含一个 class' 源文件时自动定义另一个 class 的情况(即在一个文件中定义了多个 class),每个 class应该在干净的 php 环境中加载(单独的 php-cli 运行)。
为此我使用了 2 个脚本:
Class 自动加载检查器 (check.php):
<?php
// test if a class, mentioned in autoload_classmap-orig.php at line $num,
// can be autoloaded. Exit status: 0 - ok, 4 - failed to autoload,
// 3 - no more classes in autoload_classmap-orig.php
error_reporting(0);
require_once(__DIR__ . "/vendor/autoload.php");
$num = $argv[1];
$classes = array_keys(include('autoload_classmap-orig.php'));
if (!isset($classes[$num])) {
exit(3);
}
$current_class = $classes[$num];
echo $current_class;
if (!class_exists($current_class)) {
exit(4);
}
exit(0);
迭代器(check.sh)
#!/usr/bin/env bash
# call ./check.php until all classes are checked or max number
# of checks reached.
max=500
num=0
while true ; do
php ./check.php $num
status=$?
case $status in
0) echo " - OK" ;;
3) echo "\nFinished." ; break ;;
4) echo " - CAN NOT BE AUTOLOADED" ;;
*) echo " - UNKNOWN ERROR $status" ;;
esac
num=$(($num + 1))
if [ "$num" -gt "$max" ] ; then
echo "\nMax number of classes reached."
break
fi
done
我有一个在内部项目中使用的 composer 包。从历史上看,此包中的所有 classes 都是通过 "autoload": { "classmap": ... }
自动加载的,并且尚未结构化。
现在我想迁移到 PSR-4。我根据 class 命名空间重新排序了所有文件和目录。命名空间或 class 名称未更改,仅更改文件 locations/names。
如何验证我的新 file/class 结构以确保它符合 PSR-4 并且所有 classes 都可以通过 "autoload": { "psr-4": ... }
加载?我进行了 google 搜索,但没有找到任何工具。
选项 1
运行 你的测试。
无论是自动加载还是手动加载,它们都会显示任何无法自动加载的 classes。
选项 2
编写一个简单的脚本:
- 列出所有 PHP classes (FQCN)
- 包括 composer 自动加载器(配置了 psr4)
- 对于每个 class 尝试调用
class_exists
(这将触发自动加载)
如果给定 class 的 class_exists
失败,则表示其命名空间配置不正确。
我能够使用 Jakub Zalas 的回答(选项 2)中的提示解决我的问题。
想法是:
- 将作曲家的作品
autoload_classmap.php
复制到autoload_classmap-orig.php
。 - 根据需要重新排列 classes/change
composer.json
。 - 针对 orig classmap 测试新的自动加载。
为了避免包含一个 class' 源文件时自动定义另一个 class 的情况(即在一个文件中定义了多个 class),每个 class应该在干净的 php 环境中加载(单独的 php-cli 运行)。
为此我使用了 2 个脚本:
Class 自动加载检查器 (check.php):
<?php
// test if a class, mentioned in autoload_classmap-orig.php at line $num,
// can be autoloaded. Exit status: 0 - ok, 4 - failed to autoload,
// 3 - no more classes in autoload_classmap-orig.php
error_reporting(0);
require_once(__DIR__ . "/vendor/autoload.php");
$num = $argv[1];
$classes = array_keys(include('autoload_classmap-orig.php'));
if (!isset($classes[$num])) {
exit(3);
}
$current_class = $classes[$num];
echo $current_class;
if (!class_exists($current_class)) {
exit(4);
}
exit(0);
迭代器(check.sh)
#!/usr/bin/env bash
# call ./check.php until all classes are checked or max number
# of checks reached.
max=500
num=0
while true ; do
php ./check.php $num
status=$?
case $status in
0) echo " - OK" ;;
3) echo "\nFinished." ; break ;;
4) echo " - CAN NOT BE AUTOLOADED" ;;
*) echo " - UNKNOWN ERROR $status" ;;
esac
num=$(($num + 1))
if [ "$num" -gt "$max" ] ; then
echo "\nMax number of classes reached."
break
fi
done