2

index.php用作路由页面。

我想:

define('ROOT_DIR', __DIR__);

在所有页面上index.php使用并使用ROOT_DIR,是否可以不包含其他内容?

或者这是唯一的方法?

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

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

4

1 回答 1

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__). 在此处阅读更多相关信息

于 2013-05-27T00:05:54.440 回答