【问题标题】:Include inside function considered bad practice?包括内部函数被认为是不好的做法?
【发布时间】:2013-05-23 21:01:34
【问题描述】:

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

我的网站的一部分使用了 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

    }
}

或者我错过了更好的方法吗?

提前致谢。

【问题讨论】:

    标签: php coding-style sphinx


    【解决方案1】:

    在我看来,这种方法本身并没有错。

    为了提高性能,可以做的一件事是对在sphinxapi.php 中实现的类执行class_exists 调用,而不是执行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/,它会解释这个过程。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        根据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
        

        【讨论】:

        • 如果 sphinxapi.php 包含类,那么这不是真的。编辑:在 google 上搜索 sphinxapi.. 它绝对不是一个类,哈哈*
        • @Anther:OP 在他的代码中写了$search = new SphinxClient();。这意味着它是一个类。如果它是公共的,它可以得到扩展(只要方法是公共的或受保护的)。
        • @Anther:你在说什么? php.net/manual/en/class.sphinxclient.php 非常适合上课。
        • @JamesNapier:我不知道你是否熟悉 OOP 编程,但是关于使用构造函数和定义私有变量的部分应该非常简单。它允许你在你自己的类中的任何地方访问该类,你只需要包含它一次。
        猜你喜欢
        • 2013-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 2011-11-20
        • 1970-01-01
        • 2010-09-26
        相关资源
        最近更新 更多