这是目录结构
/start.php
require('./includes/class_bootstrap.php');
/includes/class_bootstrap.php
define('CWD', (($getcwd = getcwd()) ? $getcwd : '.'));
require_once(CWD . '/includes/init.php');
/plugins/myplugin.php
require_once(dirname(__FILE__).'../global.php');
据我所知,问题出在class_bootstrap.php文件中,因为它为CWD生成了错误的路径 这是错误:
警告:require_once(C:/wamp/www/vb4/plugins/includes/init.php)[function.require-once]: 无法打开流:第35行的C:/wamp/www/vb4/global.php中没有这样的文件或目录
正如您所见,“C:/wamp/www/vb4/plugins/includes/init.php”是错误的路径。
主要问题是我只能编辑myplugin.php文件,其他文件是CMS核心文件,不应更改。
如何解决此问题?
答案 0 :(得分:6)
如果您需要确定一组脚本的基本路径,不应该依赖于“当前工作目录”。这可以从执行环境变为执行环境。
相反,将其建立在已知路径上。
/includes/class_bootstrap.php
知道它将是基本路径所在的目录,所以它可以这样做:
define('CWD', realpath(dirname(__FILE__) . '/../') );
dirname
获取传递的字符串中给出的目录名称。如果__FILE__
返回C:/wamp/www/vb4/plugins/includes/class_bootstrap.php
,则dirname
将返回C:/wamp/www/vb4/plugins/includes
。然后我们将/../
添加到其中,然后调用realpath
,将相对..
转换为真实目录:C:/wamp/www/vb4/plugins
呼。
从那时起,CWD
将按预期运作。您可require_once CWD . '/includes/init.php'
,它会正确解析为C:/wamp/www/vb4/plugins/includes/init.php
此外,这可能听起来很愚蠢但“vb4”可能指的是vBulletin 4,在这种情况下,您的插件可能已经可以访问它公开的配置信息,包括路径等方便的东西。这可能使整个练习变得不必要。我故意对vB一无所知,否则我会指向你的开发文档。