由于我更改树,绝对和相对路径不起作用

时间:2017-03-09 09:05:39

标签: php path tree include require

我尝试使用绝对路径来包含我的文件:

我有4个文件(我的localhost上有其他文件,但奇怪的是包含效果很好):

header.php C:\wamp\www\MySite\layout\header.php

<?php session_start (); 
require_once '/pdo.php';
....

pdo.php C:\wamp\www\MySite\pdo.php

<?php
require_once '/class/User.php';
require_once '/class/Order.php';
....

forms / login.php C:\wamp\www\MySite\forms\login.php

<?php
session_start (); 
include '/pdo.php';
....

login.php C:\wamp\www\MySite\login.php

<?php
  $title = 'Connexion'; 
  include ("/layout/header.php");
...

所以它看起来像:

Root
    - forms
        - login.php
    -layout
        - header.php
    - pdo.php
    - login.php

我有这个错误:

  

(!)警告:include(/pdo.php):无法打开流:第3行的C:\ wamp \ www \ MySite \ forms \ login.php中没有此类文件或目录       调用堆栈

     

(!)警告:include():在C:\ wamp \ www \ MySite \ forms \ login中打开'/pdo.php'以包含(include_path ='。; C:\ php \ pear')失败。 php在第3行

     

(!)致命错误:第12行的C:\ wamp \ www \ MySite \ forms \ login.php中找不到“用户”类

但是我在很多文件上都有这个问题,因为我想更改文件和文件夹的arboresence(树)..

我如何解决这个问题?以及如何在将来避免这个问题?

谢谢

2 个答案:

答案 0 :(得分:2)

  

我尝试使用绝对路径来包含我的文件:

     

header.php(C:\ wamp \ www \ MySite \ layout \ header.php)

<?php session_start (); 
require_once '/pdo.php';

PHP代码在服务器上执行。此上下文中的绝对路径表示文件系统绝对路径,而不是Web主机路径。由于您使用的是Windows,/pdo.php实际上意味着C:/pdo.php,而不是C:\wamp\www\MySite\pdo.php,因为您认为这样。

在PHP中使用includerequire的路径的最佳方法是使用__FILE____DIR__魔术常量以及dirname() PHP用于从相对位置开始构建(文件系统)文件的绝对路径。

您的代码变为:

header.php C:\wamp\www\MySite\layout\header.php):

<?php
session_start (); 
// 'pdo.php' is one level up
require_once dirname(__DIR__).'/pdo.php';
....

pdo.php C:\wamp\www\MySite\pdo.php

<?php
// User.php is inside the 'class' subdirectory
require_once __DIR__.'/class/User.php';
require_once __DIR__.'/class/Order.php';
....

dir1 / dir2 / dir3 / file.php C:\wamp\www\MySite\dir1\dir2\dir3\file.php

<?php
// 'header.php' is in the 'layout' subdirectory of the grand-grand parent directory
include dirname(dirname(dirname(__DIR__))).'/layout/header.php';

备注

此处介绍的解决方案使代码独立于文件系统中的实际位置。您可以将整个项目(C:\wamp\www\MySite中的所有内容)移动到不同的目录或不同的计算机上,它将无需更改即可运行。更重要的是,如果你使用正斜杠(/)作为目录名分隔符,它适用于Windows,macOS或任何Linux风格。

答案 1 :(得分:1)

一种惯例是在每个php脚本中包含一个配置文件。此配置文件将设置包含路径,允许您包含其他文件,类等,并且无论您当前的工作目录是否已更改,它都将继续工作 - 它将允许您更好地将类和函数组织到有意义的目录中并包括他们不必担心完整的道路:

以下示例:

在C:\ wamp \ www \ MySite \ config.php

创建文件
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'C:\wamp\www\MySite\class' . PATH_SEPARATOR . 'C:\wamp\www\MySite\conf');
?>

然后进去 header.php(C:\ wamp \ www \ MySite \ layout \ header.php)

<?php 
require_once('C:\wamp\www\MySite\config.php');
session_start (); 
require_once '/pdo.php';    // put pdo.php in C:\wamp\www\MySite\conf\ directory and it will be included
....

在pdo.php(C:\ wamp \ www \ MySite \ pdo.php)中:

<?php
require_once 'User.php';
require_once 'Order.php';
....