2

在 PHP 中,当我们包含或需要一些文件时,使用一些初始化器,如下所示。如果您在子目录或不同位置包含相同的初始化程序,我们如何克服发生的文件路径问题。

<?php

// settings
$settings = array('config');

foreach ($settings as $setting) {
    require_once "../system/settings/{$setting}.php";
}

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    require_once "../system/neutrals/{$neutral}.php";
}

// helpers
$helpers = array('database', 'file', 'logger', 'user', 'session', 'database');

foreach ($helpers as $helper) {
    require_once "../system/helpers/{$helper}.php";
}

// models
$models = array('test');

foreach ($models as $model) {
    require_once "../system/models/{$model}.php";
}

?>

上面的脚本位于文件all_initializer.php中。这里的障碍是我不能在公共子目录或其他位置使用相同的初始化程序,因为它会发生找不到文件的致命错误(如果它是必需的文件)。

编辑

例如,我在index.php文件的公用文件夹中使用此初始化程序,然后在公用文件夹public/sub中有一个子目录。如何在public/sub/index.php中使用与在public/index.php中使用的相同的初始化程序?

4

4 回答 4

0

大多数 php 框架的工作方式类似于以下,zend 框架的工作方式是这样的:

声明一个常量 APPLICATION_PATH,然后使所有路径都与此相关。

define("APPLICATION_PATH", "/var/www/mysite");

然后您的所有要求都将与您的 APPLICATION_PATH 相关。

require_once APPLICATION_PATH ."/system/helpers/{$helper}.php";

*使用这种方法,您可以毫无问题地包含来自任何脚本的文件。因为所有路径都将与您的 APPLICATION_PATH 相关。

于 2012-10-29T12:52:17.600 回答
0

简单......不要使用相对路径......在你的foreach循环中,你可以这样做:

require($_SERVER['DOCUMENT_ROOT'].'/system/thing.php');
于 2012-10-29T12:49:23.563 回答
0

您可以使用file_exists来避免致命错误

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    if (file_exists("../system/neutrals/{$neutral}.php") 
    {
        require_once "../system/neutrals/{$neutral}.php";
    }
    else
    {
        // Do some logging here so as to know that something went wrong
    }
}

至于您所指的路径问题,您可以从任何地方包含此文件,只要您为您的操作提供正确的基本路径。ROOT_PATH在文件中定义 aindex.php将帮助您检测脚本的位置以及需要加载的内容。

例如,如果你有这个结构:

/system
/system/neutrals
/system/models
/public
/public/index.php

在您的应用程序中,index.php您可以定义一个ROOT_PATH将在整个应用程序中使用并用作参考点的常量。

// this points to the folder that has /public and /system
define('ROOT_PATH', dirname(dirname(__FILE__)))); 

您也可以为您的系统文件夹设置一个常量

define('SYSTEM_PATH', ROOT_PATH . '/system'); 

然后你所有的require_once声明变成:

require_once SYSTEM_PATH ."/neutrals/{$neutral}.php";

编辑:基于问题中的其他信息

Structure:
/all_includes.php
/system
/system/neutrals
/system/models
/public
/public/index.php
/public/sub/index_sub.php

在 index.php 你定义

// this points to the folder that has /public and /system
define('ROOT_PATH', dirname(dirname(__FILE__)))); 

接着:

require_once ROOT_PATH . '/all_includes.php';

做你的初始化。同样的事情也发生在public/sub/index_sub.php.

你的all_includes.php变成:

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    if (file_exists(ROOT_PATH . "/system/neutrals/{$neutral}.php") 
    {
        require_once ROOT_PATH . "/system/neutrals/{$neutral}.php";
    }
    else
    {
        // Do some logging here so as to know that something went wrong
    }
}
于 2012-10-29T12:58:19.610 回答
-2

路径问题可以通过这种方式解决,你有一个文件总是在同一个地方。例如你有(这是你的公共 html)

.
..
folder/subfolder/filetoinclude.php
folder2/includein.php
thefilefolder/thefile.php

好的,现在在文件 php 你有一个变量

$path=dirname(__FILE__);

这将始终为您提供该文件的绝对路径,然后您可以使用此 $path 变量并围绕它构建包含路径。在此示例中,您必须包含 $path.'../folder/subfolder/filetoinclude.php'; 品脱是始终使用相同的原点,而不是使用相对路径。然后你可以在file.php中创建一个自定义的包含函数,然后事情就变得非常简单了。

于 2012-10-29T12:53:00.840 回答