require_once中的相对路径不起作用


103

我有以下结构

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

include.php文件具有以下内容

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

并且在index.php页面中,我包括了

require_once 'include/include.php';

当我打开页面index.php时,出现以下警告和致命错误。我不明白是什么原因导致此错误。当我给出绝对路径时,它可以工作。但是我相信绝对的路线不是一个好主意。

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

提前致谢


我通常做的Objective-C,并试图让我的手在PHP脚本和悲伤地看到我已经浪费了2小时搞清楚如何正确包括PHP文件。X代码使事情变得如此简单。
rohan-patel 2014年

一个人经常遇到此错误,并迅速对其进行故障排除,请按照以下步骤操作:stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Answers:


216

__DIR__

获取脚本的当前路径,这应该可以解决您的问题。

所以:

require_once(__DIR__.'/../class/user.php');

这样可以防止您可以从其他文件夹运行PHP脚本的情况,因此亲戚路径将不起作用。

编辑:斜杠问题已修复


42
小心! __DIR__是PHP 5.3中的新增功能。如果需要此脚本在早期版本的PHP上运行,则应dirname(__FILE__)改用。
查尔斯

27
请注意,您应该在后面手动添加尾部斜杠__DIR__。因此:require_once(__DIR__.'/../class/user.php'); 根据文档,除根目录外,尾部的斜杠均被省略。
Ariel Allon

9
感谢您的帮助,但我仍然不明白为什么__DIR__需要这样做。PHP文档似乎说PHP默认会搜索当前脚本的目录。谁能给我一些启示?
大卫,

1
@David我认为当您同时从2个位置导入文件时,这是必需的。例如,您有一个带有的文件require "../a.php"。如果此文件是从另一个文件(x)导入的,dir1/dir2/x.php则包含的文件将为dir1/a.php,但是如果x位于dir1/dir2/dir3/x.php,包含的文件将为dir1/dir2/a.php,等等。还是我错了?
何塞·拉蒙

1
现在,这里有一个针对此常见错误的疑难解答清单:stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

对于php版本5.2.17 __DIR__将不起作用,仅适用于php 5.3

但是对于旧版本的php来说却是 dirname(__FILE__)完美的

例如这样写

require_once dirname(__FILE__) . '/db_config.php';

1

就我而言,即使它选择了错误的路径,__DIR__或者即使getcwd()选择了错误的路径,它也不起作用,我通过用项目的绝对基本路径在我需要的每个文件中定义一个共同点来解决:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

我有php 5.4.10的MAMP,我的文件夹层次结构很基础:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....


0

我只是遇到了同样的问题,在这里一切正常,直到我在另一个包含中包含一个包含点为止。

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

解决方案1。(对我的公共html文件夹名称进行了不必要的硬编码,但它可以工作):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

解决方案2。(上面关于DIR的不需要的注释仅自php 5.3起有效,但有效):

require_once __DIR__. '/../script/pdocrud.php';

解决方案3。(我看不到任何弊端,它在我的PHP 5.3中完美运行):

require_once dirname(__FILE__). '/../script/pdocrud.php';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.