首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证PSR-4文件/类结构(无痛迁移到PSR-4)

验证PSR-4文件/类结构(无痛迁移到PSR-4)
EN

Stack Overflow用户
提问于 2016-10-20 09:33:55
回答 2查看 2.7K关注 0票数 3

我有一个用于内部项目的composer包。历史上,这个包中的所有类都是通过"autoload": { "classmap": ... }自动加载的,并且没有结构化。

现在我想迁移到PSR-4。我根据类名称空间重新排序了所有文件和目录。名称空间或类名没有被更改,只有文件位置/名称被更改。

如何验证我的新文件/类结构,以确保它符合PSR-4,并且所有类都可以通过"autoload": { "psr-4": ... }加载?我已经做了谷歌搜索,但没有找到任何工具。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-24 12:27:44

我能够使用Jakub 的答案(选项2)中的提示来解决我的问题。

其想法是:

  1. 将作曲家的工作autoload_classmap.php复制到autoload_classmap-orig.php
  2. 根据需要重新排列类/更改composer.json
  3. 在原始类图上测试新的自动测试。

为了避免在包含一个类的源文件时自动定义另一个类(即在一个文件中定义了多个类),每个类应该加载在干净的php环境中(单独运行php-cli )。

为此,我使用了两个脚本:

类自动检查器(check.php):

代码语言:javascript
复制
<?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)

代码语言:javascript
复制
#!/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
票数 3
EN

Stack Overflow用户

发布于 2016-10-20 16:34:44

选项1

做个测试。

无论是自动的还是手动的,它们都会显示出任何不可能自动加载的类。

选项2

编写一个简单的脚本,以便:

  • 列出所有PHP类(FQCN)
  • 包括编写器自动加载器(配置了psr4 )
  • 对于每个类,尝试调用class_exists (这将触发自动加载)

如果给定类的class_exists失败,这意味着它的命名空间没有正确配置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40150655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档