我使用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上定义的常量在其他页面上是不可用的......为什么?
答案 0 :(得分:3)
如果您希望在每个页面上执行代码,则必须确保在每个页面上执行代码。确保最简单的方法是将其放在每个页面中包含的中心文件中,这就是include
语句的用途。
至于使用常量的一些重大优点:
MAXIMUM_SUPPORTED_LENGTH
的代码比使用数字进行任意比较更容易。对于第三个:在您自己的示例中,dirname(__FILE__)
实际上会产生不同的值,具体取决于调用PHP脚本所在的文件夹。将它放入常量可以消除这个问题。其次,调用dirname(__FILE__)
实际上将在内部:
dirname
函数并调用它它不是非常慢,但是称它为500次。如果结果将是相同的500次,为什么不做一次并将其存储在常量中供以后参考?最终使网页加载速度更快。
最后 - 一个完全偏离主题的评论,但与您的具体问题相关 - 从PHP 5.3.0开始,还有一个__DIR__
常量,其字面定义与dirname(__FILE__)
相同。 Read more about it here