包含内部功能被认为是不良做法?

时间:2013-05-23 21:01:34

标签: php coding-style sphinx

我想知道在函数中包含()库文件是否被认为是不好的做法?

我网站的一部分使用了Sphinx搜索引擎,但通过将sphinxapi.php添加到我的主网站范围的“配置”文件中,将sphinxapi.php添加到每个页面似乎效率低下。

相反,我做了以下事情:

 class sphinxSearch
 {
    /*
    * Performs a standard listing search
    */
     function listings($filter, $sdb)
     {
        // include the sphinx api
        require_once SITE_INCLUDE_PATH.SEP.'Sphinx/sphinxapi.php';

        // set default options
        $search = new SphinxClient();
        $search->SetServer(SPX_HOST, SPX_PORT);
        $search->SetConnectTimeout(1);
        $search->SetArrayResult(false);

        // blah blah blah

        return $result;
    }


    /*
    * Listing autocomplete box
    */  
    function autoComplete ($query, $sdb)
    {
        require_once SITE_INCLUDE_PATH.SEP.'Sphinx/sphinxapi.php';

        // set default options
        $search = new SphinxClient();
        $search->SetServer(SPX_HOST, SPX_PORT);
        $search->SetConnectTimeout(1);
        $search->SetArrayResult(false);

        // blah blah blah

    }
}

还是有更好的方式让我失踪?

提前致谢。

3 个答案:

答案 0 :(得分:2)

在我看来,这种方法没有任何内在错误。

为提高性能,可以做的一件事是对class_exists中实现的类进行sphinxapi.php调用,而不是执行require_once,这尤其正确如果你在一个页面重新加载时调用这些函数很多。见Understanding class required and exist

例如:

if (!class_exists('SphinxClass')) require "sphinx/shinxapi.php";

更快
require_once "sphinx/shinxapi.php";

到目前为止,最好的选择是设置自动加载器,这样您就不必担心包含任何文件了。看看http://phpmaster.com/autoloading-and-the-psr-0-standard/,它将解释这个过程。

答案 1 :(得分:0)

如果您调用该函数的所有时间都包含该页面,那么是的,如果没有控件,这是一个不好的做法,例如

$path = SITE_INCLUDE_PATH.SEP.'Sphinx/sphinxapi.php';
if(!in_array($path,get_required_files())) require_once $path;

答案 2 :(得分:0)

根据PHP-docs关于包括:

  

当包含文件时,解析将退出PHP模式并进入HTML   模式在目标文件的开头,然后再次恢复   结束。出于这个原因,目标文件中的任何代码都应该是   作为PHP代码执行必须包含在有效的PHP开始和结束中   标签

换句话说,如果这是您想要的,这将不会是一个问题。但是,这不是一个非常好的OOP编程。我建议重写代码以扩展SphinxClient - 类。这将是一个更清洁的方法imo。

编辑:作为最终解决方案,您可以将该文件包含在类的构造函数中,并定义一个包含SphinxClient的私有变量。像这样:

private $sphinx;
public function __construct() {
    $this->sphinx = new SphinxClient();
}

// Now you can do: $this->sphinx->method