我有一个用于内部项目的composer包。历史上,这个包中的所有类都是通过"autoload": { "classmap": ... }自动加载的,并且没有结构化。
现在我想迁移到PSR-4。我根据类名称空间重新排序了所有文件和目录。名称空间或类名没有被更改,只有文件位置/名称被更改。
如何验证我的新文件/类结构,以确保它符合PSR-4,并且所有类都可以通过"autoload": { "psr-4": ... }加载?我已经做了谷歌搜索,但没有找到任何工具。
发布于 2016-10-24 12:27:44
我能够使用Jakub 的答案(选项2)中的提示来解决我的问题。
其想法是:
autoload_classmap.php复制到autoload_classmap-orig.php。composer.json。为了避免在包含一个类的源文件时自动定义另一个类(即在一个文件中定义了多个类),每个类应该加载在干净的php环境中(单独运行php-cli )。
为此,我使用了两个脚本:
类自动检查器(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发布于 2016-10-20 16:34:44
选项1
做个测试。
无论是自动的还是手动的,它们都会显示出任何不可能自动加载的类。
选项2
编写一个简单的脚本,以便:
class_exists (这将触发自动加载)如果给定类的class_exists失败,这意味着它的命名空间没有正确配置。
https://stackoverflow.com/questions/40150655
复制相似问题