包含一个包含文件的php文件

Tom*_*Tom 2 php include

这是目录结构

  • /global.php
  • /includes/class_bootstrap.php
  • /includes/init.php
  • /plugins/myplugin.php

这是这些文件中的代码

/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核心文件,不应该更改.

我该如何解决这个问题?

Cha*_*les 6

如果需要确定一组脚本的基本路径,则不应该依赖"当前工作目录".这可以从执行环境变为执行环境.

相反,它基于已知路径.

/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一无所知,否则我会指向你的开发文档.