【发布时间】:2011-03-07 04:12:09
【问题描述】:
我从来没有见过这样的事情。
文件结构:
- somefolder/base.php
- 包括/stuff.php
- 包括/constants.php
base.php:
<?php require("../includes/stuff.php"); ?>
stuff.php:
<?php
require("constants.php");
echo "Welcome to stuff.php";
?>
constants.php:
<?php echo "IMPORTANT CONSTANTS DEFINED HERE!"; ?>
结果:
欢迎使用 stuff.php
为什么不显示 constant.php 消息?!我会告诉你什么不是问题:它不是 php 代码。
我从一些复杂的文件开始,其中常量文件实际上是 DEFINE()-ing 一些常量,并且由于某种原因,只有前几个常量在工作。我最终禁用了包括 DEFINE() 在内的所有无关代码,并且只使用了 echo 语句,而这个问题仍然让我眼前一亮。顺便说一句,无论代码的顺序如何,一些已定义的常量如何通过而不是任何回声?
所以我终于意识到这很荒谬,并决定创建一些新文件作为测试。那些工作。或者他们没有,我忘记了。无论如何,通过创建新文件并尝试移动它们并将代码从一个文件复制到另一个文件,我已经取得了一定的成功,但似乎没有任何押韵或理由。
哇,这只是在:我让 constants.php 文件以不同的名称工作,但是当我将其更改为 constants.php 时它停止工作!我尝试在不同的浏览器中清除缓存/打开并重新启动服务器,但没有任何帮助。我觉得我或我的电脑吸毒了。啊啊啊!!!
编辑
啊哈。我遗漏了一条看起来很重要的信息。一个我没有提到的文件。
- somefolder/constants.php
包含该文件而不是包含/constants.php。这就是为什么我没有收到任何丢失文件错误的原因。那是完全令人困惑的事情!我希望子包含在更高级别包含之前发生,所以 stuff.php 会在它自己的目录中查找 constants.php 但我猜 base.php 包含 stuff.php 并且 base.php 会包含在 stuff.php 中指定的内容,这意味着包含相对于 base.php。所以绝对路径毕竟是解决方案。
其他编辑:
非常有趣。当我简单地更改includes/constants.php 的名称(例如更改为constanza.php)之前,我仍然很困惑为什么它会起作用。看起来文件包含并没有那么简单。如果有两个同名的文件,它会优先选择一个相对于执行包含的父文件的文件。但如果它别无选择,它会相对于孩子去做就好了。
【问题讨论】:
-
通过设置 error_reporting 和 display_errors 启用错误报告。
-
我已经让它显示警告和错误,但我添加了 到每个文件的顶部只是为了查看。没有不同。但报告确实有效。如果我使用完整的原始常量.php,当我尝试从基本文件中回显常量时,它会抱怨“注意:使用未定义的常量 TBL_USERS”。
-
@Moss,我刚试过你的方案,它有效??!也许他们修复了它,我使用的是 PHP 5.6。