PHP:运行 phing 时仅包含文件?

发布于 2024-07-19 23:20:53 字数 871 浏览 5 评论 0原文

我有以下文件夹结构:

/main
    /loader.php
    /build.xml
    /components
        /package1
            /class1.php
        /package2
            /class2.php
    /tests
        /package1
            /class1.test.php
        /package2
            /class2.test.php

当我运行 Web 应用程序时,我首先加载 loader.php ,并通过调用 Loader::load( 'package_name' ) 包含其他组件。 然后所有必要的文件都包含在内。 这里的好处是我不需要在类文件中包含 loader.php,因为我可以依赖 Loader 的工作实例。

单元测试类通过显式包含所有必要的类来模拟此行为。 所以phing和PHPUnit也没有问题。

但现在我想用 phing 和 Xdebug 生成覆盖率报告。 这里的问题是 phing 似乎加载每个 PHP 文件来创建覆盖数据库。 不幸的是,它停止了,因为它找不到 PHP 文件中使用的 Loader 类。

我可以轻松地向每个类文件添加 include 语句,但我想知道是否有一种方法仅在代码覆盖率分析正在检查文件时才包含文件?

其他想法:我还可以配置覆盖率分析,使其扫描单元测试目录,从而找到所有必要的包含内容。 然后我需要过滤与 /Test$/i 等模式匹配的类。 可能的?

I have the following folder structure:

/main
    /loader.php
    /build.xml
    /components
        /package1
            /class1.php
        /package2
            /class2.php
    /tests
        /package1
            /class1.test.php
        /package2
            /class2.test.php

When I run the web application I load loader.php at first and include other components by calling Loader::load( 'package_name' ). Then all neccessary files are included. The good thing here is that I don't need to include loader.php within the class files because I can rely on having a working instance of Loader.

The Unit Test classes simulate this behaviour by including all neccessary classes explicitly. So there is also no problem with phing and PHPUnit.

But now I want to generate a coverage report with phing and Xdebug. The problem here is that phing seems to load every single PHP file to create the coverage database. Unfortunately it stops because it cannot find the Loader class that is used in the PHP files.

I could easily add an include statement to every class file, but I wonder whether there is a way to include files only if code coverage analysis is inspecting the file?

Other idea: I could also configure the coverage analysis in a way that it scans the unit tests directory and therefore finds all neccessary includes. Then I'd need to filter classes that match to a pattern like /Test$/i or so. Possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月下客 2024-07-26 23:20:53

我花了很长时间寻找类似的东西。

最后我进行了以下更改。 基本上,您告诉 php cli 在前面添加一个包含加载逻辑的 php 文件。

在我的 cli 的 php.ini 中,我设置了以下内容:

auto_prepend_file = autoload.php

我确保该文件位于我的包含路径上(在我的情况下为 /usr/share/php ),并在其中放入以下行(我使用Zend Framework 也在我的包含路径上):

require_once "Zend/Loader/Autoloader.php";
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Model_');

现在,您可以做的是定义 __autoload 函数并定义需要自动加载的内容,但您明白了。

这是一个丑陋的黑客,但它为我完成了事情。

工作时间
杰罗恩

I looked for ages for something similar.

In the end I ended up with the changes below. Basically you tell php cli to prepend a php file which contains your loading logic.

In php.ini of my cli I've set the following:

auto_prepend_file = autoload.php

I made sure that the file was on my include path (/usr/share/php in my case) and put following lines in it (I use Zend Framework which is also on my include path):

require_once "Zend/Loader/Autoloader.php";
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Model_');

Now, what you could do is define your __autoload function and define what needs to be autoloaded, but you get the idea.

It's an ugly hack, but it got things done for me.

Wkr
Jeroen

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文