PHP项目的文件结构


File Structure for a PHP Project

我的文件结构:

/holiday/admin/list.php
/holiday/includes/functions.php   # common functions
/holiday/index.php
# / is the document root
# /holiday/ is a "self-contained" sub-directory
# There are other "self-contained" sub-directories e.g. /promotion/, /international/

functions.php中,我有一个通用函数来生成HTML的<head>部分;还有一个函数,用于从文档根返回绝对路径。注释我尝试计算/holiday/includes/

<? function get_path() {
  // Technically, this returns dirname(__FILE__) - $_SERVER['DOCUMENT_ROOT']
  return str_replace($_SERVER['DOCUMENT_ROOT'], "", dirname(__FILE__)); 
} ?>
<? function open_page($head = "", $body_id = "") { ?>
<!DOCTYPE HTML>
<html>
<head>
<link type="text/css" rel="stylesheet" href="<? echo get_path() . "/../css/savvyextras.css"; ?>" />
<script type="text/javascript" src="<? echo get_path() . "/../scripts/modernizr.js"; ?>"></script>
...
<? } ?>

functions.php如下所示:

// From list.php
require_once('../includes/functions.php');
open_page(...);
// From index.php
require_once('./includes/functions.php');
open_page(...);

我觉得一定有一种更直接的方法来完成同样的事情。任何内置的PHP函数为我的get_path() ?也许我应该换个方式解决问题?

注意:有些人建议使用框架(这是一件好事)。但是,为了帮助我(和其他人)理解整个包含文件的事情,其他非框架解释?

<

相关讨论/strong>:

  • 部署在非根位置的绝对路径
  • 包含文件的相对路径

@Siku-Siku.Com,使用__autolload()自动加载类并不能真正解决你的主要问题。此外,只有当你转向主要面向对象的设计时,你才能最大限度地利用__autolload(),这将带来自己的挑战。

目前,最明智的做法是像@hafichuk建议的那样。创建一个主包含文件,例如my_funcs.inc.php,并将其包含在所有其他页面的顶部。这样做的好处是,通过为包含文件提供特殊的.inc扩展名,可以更容易地区分它们。另外,您可以使用它来阻止Apache中的这些文件,以增加一点安全性。

如果我还能提到:
我认为短标签有风险。它们鼓励糟糕的编码实践,并为移植噩梦敞开大门。他们鼓励不良的编码实践。
2)因为require是一个语句,而不是一个函数,所以它应该这样使用:

require 'my_file.inc.php';

对于您当前拥有的布局类型,您最好的选择是使用单个includes.php文件来保存所有require_once调用,然后在每个条目脚本的顶部使用require_once('../includes.php')(或等效位置)。设置和维护很麻烦,但至少它都在一个地方。

如果你打算使用对象而不是函数,那么我会看看使用__autoload()

在进行了更多的实验并收集了其他输入后,我发现使用constant可以达到目的:

# functions.php
define('PREFIX', '/holiday');
<? function open_page($head = "", $body_id = "") { ?>
<!DOCTYPE HTML>
<html>
<head>
<link type="text/css" rel="stylesheet" href="<?php echo PREFIX; ?>/css/savvyextras.css"; ?>" />
<script type="text/javascript" src="<?php echo PREFIX; ?>/scripts/modernizr.js"; ?>"></script>
...
<? } ?>

所以,如果你需要移动/holiday/到一个不同的子目录,例如/vacation/,你只需要改变一个常量,即PREFIX