2

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

我的网站的一部分使用了 Sphinx 搜索引擎,但是通过将 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

    }
}

还是有更好的方法让我想念?

提前致谢。

4

3 回答 3

2

在我看来,这种方法本质上没有任何问题。

为了提高性能,可以做的一件事是class_exists调用在sphinxapi.phpand require 中实现的类,而不是调用 require_once,如果您在单个页面重新加载时大量调用这些函数,则尤其如此. 请参阅了解需要和存在的类

例如:

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

然后更快

require_once "sphinx/shinxapi.php";

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

于 2013-05-23T21:21:45.707 回答
0

对于您调用包含页面的函数的所有时间,是的,如果没有控件,这是一种不好的做法,例如

$path = SITE_INCLUDE_PATH.SEP.'Sphinx/sphinxapi.php';
if(!in_array($path,get_required_files())) require_once $path;
于 2013-05-23T21:07:01.957 回答
0

根据PHP-docs关于包括:

当包含一个文件时,解析会在目标文件的开头退出 PHP 模式并进入 HTML 模式,并在结尾处再次恢复。因此,目标文件中应作为 PHP 代码执行的任何代码都必须包含在有效的 PHP 开始和结束标记中。

换句话说,如果这是您的意图,这将不是问题。但是,这不是很好的 OOP 编程。我建议重写你的代码来扩展SphinxClient-class。这将是一种更清洁的方法。

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

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

// Now you can do: $this->sphinx->method
于 2013-05-23T21:28:13.257 回答