0

尝试包含在本地环境与生产环境中具有不同路径的文件时,我一直感到困惑。

例如,我的usercontroller.php文件中有这个:

require_once(__DIR__ . '/config.php');

在我的本地主机上,usercontroller.php位于www/myproject/inc/并且config.php位于www/myproject/(项目根目录)

这失败了。

我想要的只是一种定义项目根目录的方法。即在本地主机上它www/projectname在生产中/因为文件位于projectname我的本地主机上的目录中,所以它在我的生产服务器上引起问题。

简单定义基本路径并从中构建我的最佳方法是require_once什么?

IErequire_once($basePath . 'inc/filename.php'

4

5 回答 5

1

大多数项目使用config.inc.php位于可以定义这些内容的公共位置的文件。

配置文件

define('ROOT_FOLDER', '/');
define('APPLICATION_LINK', 'http://www.example.com/mysite');

脚本.php

require ('../config.inc.php');
echo '<a href="' . APPLICATION_LINK . '">Go home</a>';
于 2013-04-05T00:15:16.397 回答
0

每个项目都应该包含一个包含此信息的 config.php 文件。

配置文件

define('ENVIRONMENT', 'PRODUCTION');
// define('ENVIRONMENT', 'TESTING');
// define('ENVIRONMENT', 'DEVELOPMENT');

switch (ENVIRONMENT) {
    case 'PRODUCTION':
        define('BASE_URL', 'http://www.mysite.com');
        define('BASE_PATH', '/');
        break;
    case 'TESTING':
        define('BASE_URL', 'http://test.mysite.com');
        define('BASE_PATH', '/test/');
        break;
    case 'DEVELOPMENT':
        define('BASE_URL', 'http://localhost/');
        define('BASE_PATH', '/www/myproject/');
        break;
}

然后可能有一个 URL 帮助文件。

url_helper.php

function site_url($relative) {
    return BASE_URL . $relative;
}

function redirect($uri = '', $method = 'location', $http_response_code = 302) {
    if ( ! preg_match('#^https?://#i', $uri)) {
        $uri = site_url($uri);
    }

    switch($method) {
        case 'refresh' : header("Refresh:0;url=".$uri);
                break;
        default : header("Location: ".$uri, TRUE, $http_response_code);
                break;
    }
    exit;
}

和一个负载助手。

load_helper.php

function load_file($uri) {
    require BASE_PATH . $uri;
}

function load_class($class) {
    if ( ! class_exists($class))
        load_file('class/' . $class);
}

这些功能可以更强大,以满足您的需求。优点是您可以为生产/开发、各种服务器或仅针对特定环境进行不同的配置。如果您总是使用 site_url 函数在您的站点周围生成 URL,您可以通过在单个文件中进行一次更改来轻松更改 URL 的解释方式。

于 2013-04-05T00:15:57.383 回答
0

也许这样的事情可以解决问题!

switch(dirname(__FILE__)) {
case '/www/myproject/inc/':
    //DEFINE SOMETHING
break;
case '/www/myproject/':
    //DEFINE SOMETHING
break;
}
于 2013-04-05T00:18:25.097 回答
0

我知道这个答案已经晚了,但你还没有接受任何答案,所以我想我会把我在大多数应用程序中使用的东西扔进锅里。

首先,从您调用的文件config.php中,您将始终需要对其使用相对引用,即require_once '../config.php';来自您的示例。当然,您可以从 PHP 命令中“收集”配置文件的完整路径,但是当您知道它的一个目录时,为什么define要这样做,并且在其中,您可以然后是整个项目的基本路径。例如,在您的www/myproject/inc/usercontroller.php文件中,顶部看起来像:

<?php
require_once '../config.php';

然后,要自动获取项目的完整基本路径以用于其他包含等,在您的配置中,您将拥有如下内容:

<?php
$basepath = dirname(__FILE__);
define('BASEPATH', $basepath);
//Or all in one line:
define('BASEPATH', dirname(__FILE__));

从那里开始,只需BASEPATH在需要项目根目录的完整路径时使用。^^

于 2013-04-19T07:17:32.233 回答
0

文档 __DIR__中所述,返回使用它的文件的目录。

DIR - 文件的目录。如果在包含中使用,则返回包含文件的目录。这相当于 dirname( FILE )。此目录名称没有尾部斜杠,除非它是根目录。(在 PHP 5.3.0 中添加。)

要在外部目录中包含文件,您必须使用..“退出”内部目录。

require_once(__DIR__ . '../config.php');

附带说明一下,如果您使用 PHP 的命名空间,我建议您查看FIG 的自动加载标准。

于 2013-04-05T00:30:43.927 回答