composer是Include和Require PHP的替代品


composer Alternates for Include and Require PHP

我正在使用Sensio Insights来检测我的架构中的错误。

我有一个基本的模板类,它使用输出缓冲区来呈现模板的输出。

private function output() {
    if (is_readable($this->file)):
        extract($this->data);
        ob_start();
        require $this->file;
        $output = ob_get_contents();
        ob_end_clean();
        return $output;
    else:
        trigger_error('Error: Could not load template ' . $this->file . '!');
    endif;
}

Insights是扔强制性的:

使用include()或require()可以绕过第三方的惰性加载类。建议使用自动加载

这些文件不是类,它们不能自动加载。

我应该简单地忽略这些错误,还是有一个自动加载类型环境,我可以设置为惰性加载非类文件?

我通读了composer的文档,它指出你只能使用文件自动加载器来加载你想在每次执行时加载的文件,比如实用程序函数之类的。

应该忽略这些错误吗?这取决于.

是的,如果你不想改变模板呈现类的代码,你必须忽略它们。这个警告是一个通用的警告,它应该告诉你使用一个不需要的函数,如果你可以使用自动加载(有一个小的遗漏,一个自动加载函数会触发完全相同的错误——但是自动加载现在通常是由Composer完成的,不属于你自己的代码库)。

不,如果您对创建更好、更可测试的代码库感兴趣,就不应该忽略这个错误。当涉及到测试时,你在代码中做了一些可怕的事情——你不能真正测试那个函数和它的副作用:

    你正在执行PHP代码来呈现你的模板。虽然它通常没有什么问题(PHP是作为模板引擎构建的),但该函数并不真正处理可能发生的PHP错误-它假设代码将正常执行。
  1. trigger_error()完成的错误处理也不能真正以一种简单的方式进行测试。通知面向对象程序错误的更好方法是抛出异常。

所以如果你正在使用Sensio的静态代码分析来"检测架构中的错误",我想说它已经在你的代码中发现了一些固执己见的东西。

你可以让它保持原样,并争辩说这是一种执行模板渲染的高性能方式(它可能真的是)。你也可以认为它在低级函数上做了太多的事情,直接触及了金属而不是抽象的东西,并试图摆脱它(周围有很多非常好的模板引擎)。

你不能做的:将此位置更改为某种自动加载。您必须将模板放入类中,并使用它们来触发自动加载。