包含PHP文件的最佳做法是什么?

时间:2011-12-02 09:40:47

标签: php include

包含PHP文件的最佳做法是什么?

最好包含一个包含所有项目PHP文件的include.php文件吗? 或者将它包含在那些需要它们的文件中

现在,我的项目在index.php文件中有几个包含文件。在index.php中包含我所有的php文件会降低效率吗?

最后,在哪里应该包含会话检查PHP文件?在所有PHP文件中?

5 个答案:

答案 0 :(得分:14)

2016年编辑

好吧,我回答这个问题已经5年了。我还活着。很多都改变了。

现在我使用自动加载器来包含我的文件。 Here is official info for autoloaders with examples.

基本上,我们的想法是拥有适当的文件夹结构(例如PSR-4标准)并在每个文件中都有一个类。这样您就可以使用自动加载器,PHP将自动加载您的文件。

OLD ANSWER

通常,我有一个这样的配置文件:

define(root, $_SERVER['DOCUMENT_ROOT']);
.... // other variables that are used a lot

include (root . '/class/database.php'); 
.... // other includes that are mostly called from each file, like a db class, or user class, functions etc etc...

if (defined('development'))
{
    // turn error reporting on
}
else 
{
    // turn it off
} 

etc etc... You got the point of config.

我在每个文件中包含config.php。我忘了现在该怎么做,但是apache可以为你做自动包含。因此,默认情况下,您可以说apache包含您的配置文件。

然后,我有控制器类,它调用视图。在每个函数中我都调用了视图。

someController.php

function index() { include root . '/views/view_index.php'; }

最后,从视图来看,如果我需要包含页眉和页脚视图,我会这样做:

view_index.php

<?include root . '/view/shared/header.php';?>
<div class="bla bla bla">bla bla bla</div>
<?include root . '/view/shared/footer.php';?>

我总是在此结构中使用include而不是include_once,因为后者需要额外检查。我的意思是,因为我很确定我只包含一次文件,所以我不需要使用include_once。这样,你也知道哪个包含在哪里。例如,您知道像db.php或functions.php这样的关键文件位于config.php中。或者您知道包含视图位于控制器中。这对我来说非常有用,我希望这对你也有帮助。

答案 1 :(得分:0)

根据我的说法,使用include.php文件是一种非常好的做法,因为它在更改大项目中包含的文件时非常有用。如果项目很小,那么包含单个文件不是问题。但随着项目的发展,管理它们成为一个问题。
对于会话检查文件,最好单独附加它们,因为检查不同页面上的会话的要求可能不同 单独包含文件或将它们全部包含在一个文件中然后包含文件会对性能产生很大影响。最终将包括所有文件。如果使用单个文件来处理它们,那么管理它们变得很容易。

答案 2 :(得分:0)

只是想一想,尽可能少考虑负载,不要包含不必要的东西。

所以对于你的PHP文件。如果你在不同的页面上包含相同的php文件,只需创建一个包含此文件的PHP文件。 如果您只使用1页或2页的PHP文件,请将它们单独包含在内。

我希望我帮助你;)

答案 3 :(得分:0)

我不认为你正在使用面向对象的编程,但如果你在这里做的话可能是一个很好的答案。

在php中,您可以定义一个名为autoloader的函数,如果您尝试创建一个尚未定义的类的对象,则调用自动加载器。然后,您可以使用类名来确定存储包含该类的文件的位置,以便在最后时刻包含该类。这是一个例子..

<?php
function on_load($class)
{
     if(file_exists(require_once('classes/'.$class.'.php')))
     {
          require_once('classes/'.$class.'.php');
     }
     else
     {
          throw new Exception('Class not found: '.$class.' in classes/');
     }
}

spl_autoload_register('on_load'); // tell php to call your on_load function if the class was not defined

如果你正在开展一个大型项目,你可能想要像这样对文件进行分组

/classes/database/MySQL.php
/classes/database/PDO.php // I'm just listing random stuff
/classes/Core.php // Whatever
/classes/datastructure/HashMap.php

然后,您可以使用特殊的命名约定来查找正确的目录

class Database_MySQL{} // look in <root_dir>/database/ for MySQL.php
class Core             // look in <root_dir>/ for Core.php
class Database_Driver_Adapter_Useless_MysqlAdapterThingy {} // look in <root_dir>/Database/Driver/... blabla

或者您可以使用php 5.3方式并定义您的类

<?php
namespace database\driver\adapter\useless;
use database\driver\adapter\MysqlAdapter; // Now you have to tell PHP which version of MysqlAdapter class you want to use, even if there is just one
class MysqlAdapterThingy extends MysqlAdapter {}

现在你必须在你需要该类的每个文件中使用'use'关键字。很酷的是,命名空间会自动添加到自动加载功能的类名中,因此您可以执行类似这样的操作

function on_load($class)
{ require_once('root/' . str_replace('\\', '/' $class)); }

如果您想了解更多信息,请尝试googeling PHP自动加载,有关此主题的大量信息。但话又说回来。从你的问题格式我不认为你正在使用OOP所以这个答案只适用于在谷歌上发现这个问题的人。


修改

我还想补充以下内容:

 // Only include the file once even if you place this statement multiple times
require_once('bla.php');
include_once('bla.php');

require('bla.php'); // Error if file doesn't exist, php will not continue
inlcude('bla.php'); // Warning if file doesn't exist, but php will continue
  • 使用include或require without _once意味着每次执行语句时都会包含该文件
  • 对模板或用户生成的文件使用include,对类使用require_once

答案 4 :(得分:-1)

独立包含文件,使用require_once()函数代替include,因为require_once只允许包含一个文件...