在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 中使用的初始化程序相同的初始化程序?
答案 0 :(得分:0)
简单..不要在你的foreach
循环中使用相对路径......你可以这样做:
require($_SERVER['DOCUMENT_ROOT'].'/system/thing.php');
答案 1 :(得分:0)
大多数php框架的工作方式与以下类似,zend框架的工作原理如下:
声明一个常量APPLICATION_PATH,然后创建相对于此路径的所有路径。
define("APPLICATION_PATH", "/var/www/mysite");
然后您的所有要求都将与您的APPLICATION_PATH相关。
require_once APPLICATION_PATH ."/system/helpers/{$helper}.php";
* 使用这种方法,您可以包含任何脚本中的文件而不会出现问题。因为所有路径都是相对于您的APPLICATION_PATH。
答案 2 :(得分: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
文件中定义index.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
}
}
答案 3 :(得分:-2)
路径问题可以用这种方式解决,你有一个文件总是在同一个地方。例如,你有(这是你公开的HTML)
.
..
folder/subfolder/filetoinclude.php
folder2/includein.php
thefilefolder/thefile.php
好的,现在在文件php中你有一个变量
$path=dirname(__FILE__);
这将始终为您提供该文件的绝对路径,然后您可以使用此$ path变量并围绕它构建包含路径。 在这个例子中,你必须包含$ path。'.. / folder / subfolder / filetoinclude.php'; 品脱总是使用相同的原点,而不是使用相对路径。 然后你可以在file.php中创建一个自定义包含函数,然后事情变得非常简单。