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

2022-01-05 00:00:00 path tree include php require

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

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

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

I have 4 files (I have other file on my localhost but oddly the inclusion works well) :

header.php (C:wampwwwMySitelayoutheader.php)

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

pdo.php (C:wampwwwMySitepdo.php)

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

forms/login.php (C:wampwwwMySiteformslogin.php)

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

login.php (C:wampwwwMySitelogin.php)

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

所以它看起来像:

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

我有这个错误:

( ! ) 警告:include(/pdo.php):无法打开流:第 3 行的 C:wampwwwMySiteformslogin.php 中没有这样的文件或目录调用栈

( ! ) Warning: include(/pdo.php): failed to open stream: No such file or directory in C:wampwwwMySiteformslogin.php on line 3 Call Stack

( ! ) 警告:include():无法在 C:wampwwwMySiteformslogin 中打开包含 (include_path='.;C:phppear') 的/pdo.php".第 3 行的 php

( ! ) Warning: include(): Failed opening '/pdo.php' for inclusion (include_path='.;C:phppear') in C:wampwwwMySiteformslogin.php on line 3

( ! ) 致命错误:在第 12 行的 C:wampwwwMySiteformslogin.php 中找不到用户"类

( ! ) Fatal error: Class 'User' not found in C:wampwwwMySiteformslogin.php on line 12

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

But I have this problem on a lot of files since I wanted to change the arboresence (tree) of files and folder ..

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

How I can solve this problem ? and how I can do to avoid this problem in the future ?

谢谢

推荐答案

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

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

header.php (C:wampwwwMySitelayoutheader.php)

header.php (C:wampwwwMySitelayoutheader.php)

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

PHP 代码在服务器上执行.此上下文中的绝对路径是指文件系统绝对路径,而不是 Web 主机路径.由于您使用的是 Windows,/pdo.php 实际上意味着 C:/pdo.php 而不是 C:wampwwwMySitepdo.php 就像你想的那样.

The PHP code is executed on the server. An absolute path in this context means a file-system absolute path, not a web host path. Since you are on Windows, /pdo.php in fact means C:/pdo.php and not C:wampwwwMySitepdo.php as it seems you think.

在 PHP 中处理路径的最佳方法,关于 includerequire 是使用 __FILE____DIR__ 魔法常量和 dirname() PHP 函数,用于从文件的相对位置开始构建文件的(文件系统)绝对路径.

The best way to work with paths in PHP, regarding include and require is to use the __FILE__ and __DIR__ magic constants and the dirname() PHP function to build the (file-system) absolute paths of files starting from their relative locations.

您的代码变为:

header.php (C:wampwwwMySitelayoutheader.php):

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

pdo.php (C:wampwwwMySitepdo.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:wampwwwMySitedir1dir2dir3file.php)

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

备注

此处提供的解决方案使代码独立于其在文件系统中的实际位置.您可以将整个项目(C:wampwwwMySite 中的所有内容)移动到不同的目录或不同的计算机上,并且无需更改即可正常工作.更重要的是,如果您使用正斜杠 (/) 作为目录名称分隔符,它适用于 Windows、macOS 或任何 Linux 版本.

Remark

The solution presented here makes the code independent of its actual location in the file system. You can move the entire project (everything in C:wampwwwMySite) in a different directory or on a different computer and it will work without changes. Even more, if you use forward slashes (/) as directory names separators it works on Windows, macOS or any Linux flavor.

相关文章