2014-06-26 37 views
0

方案PHP路径

我有2个文件:file.phpadmin/file.php

file.php已经require_once 'admin/functions.php';

admin/file.php已经require_once 'functions.php';

所以他们俩都包括相同文件。问题在于在functions.php之内,诸如file_get_contentsincluderequire之类的东西看到相对于file.phpadmin/file.php而不是functions.php定义的路径。因为这个原因,我不能使用不同目录中的相同functions.php而不创建重复的文件,我不认为这是最好的做法,因为我编辑一个文件,我必须记住编辑其他也是如此。

这种情况的最佳做法是什么?

编辑:请参阅下面接受的答案的评论。

回答

1

这种情况的最佳做法是什么?

简单。只需在配置文件&中手动设置一个基本路径,不用担心它 - 相对路径 - 再次。

这就是说,如果你正在试图简化文件加载的方式,你应该明确地设置一个$BASE_PATH这样的:

$BASE_PATH = '/full/path/to/your/codebase/here/'; 

如果你不知道你的文件系统的基本路径是什么,只需将这行代码放入您的PHP代码中;像index.php

echo "Your path is: " . realpath(dirname(__FILE__)) . "<br />"; 

然后加载该页面。附近的某处顶部将是这样的文字:

你的路径是:/全/路径/到/你/用那一套代码库/位置/

然后你就可以改变你的代码是什么像这样:

然后设置你的include_once这样的:

include_once $BASE_PATH . 'includes/myfile.php'; 

也许有人会说,你应该使用$_SERVER['DOCUMENT_ROOT']甚至dirname(__FILE__)直接意味着你可以通过这种方式简化代码可移植性。但文件路径设置为安装的方式可能会有所不同,所以它只是从来没有效果好&你在一个奇怪的服务器怪癖上挂钩的机会很高。

它总是最好还是手动设置$BASE_PATH在配置文件中,当你不是处理造成PHP常量像$_SERVER没有被安装,设置&配置之间是一致的头痛移动代码。

+1

这正是我正在寻找。一旦我认识到它是我见过的几乎所有CSM中使用的相同练习,它就会为我点击。我创建了2个配置文件(一个用于管理目录,一个用于基本目录): Admin config.php:'define(ADMIN_PATH,realpath(dirname(__ FILE__))。'/');' Base config.php:'define(ADMIN_PATH,realpath(dirname(__ FILE__))。'/ admin /');' 我希望能够澄清某人的解决方案。 –

+0

@SolidI使用'realpath(dirname(__ FILE __))'这个问题真的很麻烦,因为'__FILE__'总是将符号链接解析为真正的绝对路径路径。今天你可能不会遇到这个问题,但如果这个问题窒息,那将是原因。考虑手动编写完整路径。 http://www.php.net//manual/en/language.constants.predefined.php – JakeGould

0

如果您使用常量,如__DIR____FILE__那么它可以使事情变得更容易。

的functions.php:

require __DIR__ . '/../foo.php'; // will be one directory lower than admin' 'require __DIR__ . '/bar.php'; // will be in admin directory

-1

我特别总是创建一个包含我的系统路径和URL模式目录中的文件。从我开始开发我的系统的那一刻开始,任何包含或要求我去做,我把这个完整的路径。在你的情况下,这是目前最好的做法。

一个细节,require_once不会再次调用该文件。它会检查该文件是否已被调用,然后忽略该调用。

-1

有没有简单的方法,而不必修改你的两个function.php文件使用绝对路径,而不是将它们作为相对路径。即使你可以通过聪明的技巧使当前的代码工作,它会使你的生活在未来更加困难。

我将在文件顶部声明一个变量,坚持一个路径到它,然后再用变量在整个函数

$my_root=$_SERVER['DOCUMENT_ROOT']; 

$my_root="/usr/docs/etc/etc"; //if you don't trust the server. 

,然后就搜索文件中的路径并更改它们

用于功能admin文件夹外的文件 从

更改为
require "folder1/folder2"; 

require $my_root . "/folder1/folder2"; 

和功能在管理文件夹中的文件

require "folder1/folder2"; 

require $my_root . "/admin/folder1/folder2"; 

对于任何动态数据遵循相同的逻辑。

这可能是一项繁琐的工作,但最终会减少卷积,最终可能会在以后感谢您。即使你可以使当前的代码工作通过