定义一个常量并在所有页面上使用它

时间:2013-05-27 00:03:33

标签: php path constants

我使用index.php作为路由页面。

我想:

define('ROOT_DIR', __DIR__);
index.php

并在所有页面中使用ROOT_DIR,是否可以不包含任何其他内容?

或者这是唯一的方法吗?

1)在DOCUMENT_ROOT目录

上创建文件globals.php

2)define('ROOT_DIR', __DIR__);中的globals.php

3)在网站的每个页面中加入globals.php以使用ROOT_DIR

include $_SERVER['DOCUMENT_ROOT'].'/globals.php';

使用常数有哪些优点?

始终使用__DIR__是不是更简单?

php上包含文件等时,能告诉我哪种方法最有效,最有用的方法来管理路径?

谢谢!

编辑 - 最终解决方案?

1)创建文件globals.php,例如在/WEB/mysite/htdocs/includes/

2)在globals.php上定义一个常量:define('ROOT_DIR', __DIR__);

3)在网站include 'globals.php';的每个文件上。例如。如果我想在globals.php上加/WEB/mysite/htdocs/test/header.php,我会使用include '../includes/globals.php

4)每个文件使用的每个包含 include ROOT_DIR.'/path_to_file_relative_to_ROOT_DIR/file.php'

5)例如要在/WEB/mysite/htdocs/scripts/script1.php上加/WEB/mysite/htdocs/test/header.php,我会写:

include '../includes/globals.php';
include ROOT_DIR.'/../scripts/script1.php';

永远不要改变globals.php;

的路径

EDIT2使用索引作为路由页

.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

index.php用作路由页面:

<?php
include 'globals.php';

$uri = $_SERVER["REQUEST_URI"];
$trimmeduri = trim($uri, '/');

if($uri == '/'){
    $sigle = $link->query("SELECT sigla AS lingue FROM LINGUE");

    while($lingue_db = mysqli_fetch_array($sigle)){
        $lingue[] = $lingue_db['lingue'];
    }

    $client_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    if(in_array($client_lang, $lingue)){
        header("location: http://www.mysite.com/$client_lang/index.php");
    }else{
        header("location: http://www.mysite.com/it/index.php");
    }

}else{
    include "sql.php";
    $link = new mysqli($host, $user, $pw, $db);
    $link->set_charset('UTF8');
    $trimmeduri = $link->real_escape_string($trimmeduri);
    $urlliste = $link->query("SELECT Nome FROM LISTE WHERE URL = '$trimmeduri'");
    while($urllista = mysqli_fetch_array($urlliste)){
        $lista = $urllista['Nome'];
    }
    $uri_count = mysqli_num_rows($urlliste);
    $urlliste->close();

    if($uri_count == '1'){
        header("location: http://www.mysite.com/pages/page.php?name=$lista");
    }elseif($uri_count > '1'){
        header('HTTP/1.0 400 Bad Request', true, 400);
        require_once "errors/400badrequest.html";
    }else{
        header("HTTP/1.0 404 Not Found");
        require_once "errors/404notfound.php";
    }
}
?>

问题是在globals.php上定义的常量在其他页面上是不可用的......为什么?

1 个答案:

答案 0 :(得分:3)

如果您希望在每个页面上执行代码,则必须确保在每个页面上执行代码。确保最简单的方法是将其放在每个页面中包含的中心文件中,这就是include语句的用途。

至于使用常量的一些重大优点:

  1. 如果更改,您只需更改一次,并且所有数千个引用都会自动获取新值。
  2. 常量保持代码可读并且没有“魔术数字”等。 - 读取引用MAXIMUM_SUPPORTED_LENGTH的代码比使用数字进行任意比较更容易。
  3. 常量可以包含预先计算的常量。
  4. 对于第三个:在您自己的示例中,dirname(__FILE__)实际上会产生不同的值,具体取决于调用PHP脚本所在的文件夹。将它放入常量可以消除这个问题。其次,调用dirname(__FILE__)实际上将在内部:

    1. 查找我们执行的文件
    2. 查找dirname函数并调用它
    3. 执行一些讨厌的字符串处理以确定目录名称
    4. 它不是非常慢,但是称它为500次。如果结果将是相同的500次,为什么不做一次并将其存储在常量中供以后参考?最终使网页加载速度更快。

      最后 - 一个完全偏离主题的评论,但与您的具体问题相关 - 从PHP 5.3.0开始,还有一个__DIR__常量,其字面定义与dirname(__FILE__)相同。 Read more about it here