PHP 的 include_once 的路径问题?

这是我的项目结构,
image.png

我尝试从 view/index.php 中通过 controller 从 model 获取数据后显示到 display.php 上,

view/index.php
image.png

controller/Controller.php
image.png

奇怪的是,在 model/Model.php 文件中,我发现 include_once("DBConn.php") 可以正确显示数据(DBConn.php会去连接mysql, 里面有一个$mysqli的变量),但 include_once("./DBConn.php") 或者 include_once("model/DBConn.php") 都不行,这是为什么呢?

model/Model.php
image.png

include_once 的路径机制是怎样的?为什么有时候绝对路径可以,有时相对路径可以?
由于我直接在云服务器商提供的LAMP环境开发的,没有任何错误提示,所以Debug过程非常痛苦。

更新:这个相对路径似乎和我访问路径有关

阅读 3.8k
4 个回答

的确与你想的一样: require_once()取决于入口文件(第一个访问的文件)所在位置。官方文档中提到一嘴:

image.png

解决办法如下:

// 获取当前文件的绝对路径
define('__DIR__',  dirname(__FILE__));

// 示例1
require_once(__DIR__. '/foo/bar.php');

// 示例2
require_once(__DIR__. '/../foo/bar.php');

基本的思想是:

  1. 将相对路换径换成绝对路径
  2. 动态获取绝对路径而不是直接写绝对路径(/usr/local/xxx/xxx),以避免应用部署在不同的服务器或是不同的位置时发生错误。

这样以来,无论无哪个文件访问调用,便都可以在执行require_once()时解析正常的路径了。

另外原生的PHP 仅适用于学习阶段,如果真想用PHP开发项目,还得上框架:ThinkPHP5.0入门实例教程推荐一下。

跟入口文件相关,./ 是当前目录,是指入口文件的当前目录

先说明,include_once 和 include 的区别仅在于,当多次调用时,前者只会包含一次,后者会包含多次。另外 require 和 include 的区别仅在于,前者当无法找到文件时,会同时报警告+错误,并停止执行后面的代码,而 include 则会报警告,然后继续执行后面的代码。

根据文档描述这里的问题,应该归结于 include 中 include_path 这样一个概念,默认情况下, include_path 中包含了 . 及当前位置。所以可以找到。

但是,我测试的时候发现即使去掉,也还是能找到,文档中没有对此做过多的介绍了

  • 被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。
  • 如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

image.png

加载类定义, 不要使用 类似include的语句, 请在入口文件中, 注册spl_autoload_register自动加载逻辑.

显示模板也不要到处include, 把包含逻辑放到一个函数或类中统一处理. 使用绝对路径定义模板文件.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题