这是目录结构
/start.php
require('./includes/class_bootstrap.php');
Run Code Online (Sandbox Code Playgroud)
/includes/class_bootstrap.php
define('CWD', (($getcwd = getcwd()) ? $getcwd : '.'));
require_once(CWD . '/includes/init.php');
Run Code Online (Sandbox Code Playgroud)
/plugins/myplugin.php
require_once(dirname(__FILE__).'../global.php');
Run Code Online (Sandbox Code Playgroud)
至于我理解问题是在class_bootstrap.php文件中,因为它为CWD生成了错误的路径,这里是错误:
警告:require_once(C:/wamp/www/vb4/plugins/includes/init.php)[function.require-once]:无法打开流:C:/ wamp/www/vb4/global中没有此类文件或目录第35行的.php
正如你所看到的"C:/wamp/www/vb4/plugins/includes/init.php"是错误的路径.
主要问题是我只能编辑myplugin.php文件,其他文件是CMS核心文件,不应该更改.
我该如何解决这个问题?
如果需要确定一组脚本的基本路径,则不应该依赖"当前工作目录".这可以从执行环境变为执行环境.
相反,它基于已知路径.
/includes/class_bootstrap.php
知道它将是一个目录,从基本路径的位置向下,所以它可以这样做:
define('CWD', realpath(dirname(__FILE__) . '/../') );
Run Code Online (Sandbox Code Playgroud)
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一无所知,否则我会指向你的开发文档.