2013-05-27 65 views
2

我使用index.php作为路由页面。定义一个常量并在所有页面上使用它

我想:

define('ROOT_DIR', __DIR__); 

index.php,并在所有页面使用ROOT_DIR,是有可能不包括没有别的?

或者这是唯一的方法?

1)在DOCUMENT_ROOT目录下创建一个文件globals.php

2)globals.php

3)define('ROOT_DIR', __DIR__);在网站的每个页面包含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';的每个文件。例如。如果我想包括/WEB/mysite/htdocs/test/header.phpglobals.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'; 

,并使用指数作为路由Page

.htaccess文件永远不会改变globals.php;

EDIT2的路径:

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上定义的常量在其他页面上不可用...为什么?

+0

“你能告诉我哪一个确切地说是在php中包含文件等时管理路径的最好和最有用的方法吗?”没有人像编程一样生活,也没有绝对 – 2013-05-27 00:36:35

回答

3

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

对于一些使用常量的一大优势:

  1. 你只有当它的变化,并且所有的数千引用自动采取新的值来改变它一次。
  2. 常量保持您的代码可读性并且不含'幻数'等。 - 读取引用MAXIMUM_SUPPORTED_LENGTH的代码比使用数字进行任意比较更容易。
  3. 常量可以包含预先计算的常量。

第三种:在您自己的示例中,dirname(__FILE__)实际上会根据调用PHP脚本所在的文件夹而产生不同的值。把它放在一个常量中可以消除这个问题。其次,调用dirname(__FILE__)实际上将内部:

  1. 查找该文件中我们执行
  2. 中查找dirname功能并调用它
  3. 做一些讨厌的字符串处理,以确定该目录名

这不是很慢,但称它500次是。如果结果反复500次,那么为什么不做一次并将其存储在一个常量中供以后参考?最终使网页加载速度更快。

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

+0

谢谢。所以最好的想法是(如果我正确地忽略了):创建一个文件'global.php',它定义了'define('ROOT_DIR',__DIR __);'并将其包含在网站的每个文件中。我现在的疑问是,我应该如何在每个页面上包含'global.php'?使用'$ _SERVER ['DOCUMENT_ROOT']。'/ path_to_/global.php'还是使用相对路径? – Perocat

+0

使用相对路径,'DOCUMENT_ROOT'历史上不太可靠(Apache用于为虚拟文档根目录设置错误),并且无论部署如何,始终可以指望相对路径在自己的应用程序中有效。另外,如果您的网络服务器是最新的(PHP 5.2已过时),请使用'__DIR__'。 –

+0

我用我的“最终解决方案”更新了我的问题?没事儿?我应该使用其他权宜之计吗?非常感谢你! – Perocat

相关问题