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

Since I change the tree, absolute and relative path don't work

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

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

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

我有这个错误:

( ! ) Warning: include(/pdo.php): failed to open stream: No such file or directory in C:\wamp\www\MySite\forms\login.php on line 3 Call Stack

( ! ) Warning: include(): Failed opening '/pdo.php' for inclusion (include_path='.;C:\php\pear') in C:\wamp\www\MySite\forms\login.php on line 3

( ! ) Fatal error: Class 'User' not found in C:\wamp\www\MySite\forms\login.php on line 12

但是我在很多文件上都遇到了这个问题,因为我想更改文件和文件夹的树状结构(树)..

我该如何解决这个问题?以及以后我该怎么做才能避免这个问题?

谢谢

一个约定是在每个 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';
....

I tried to use the absolute path to include my files :

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

关于 includerequire 使用 PHP 中的路径的最佳方法是使用 __FILE__ and __DIR__ magic constants and the 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 风格。