假设我有3个PHP文件。
file1.php
<?php
define('INTRO','Hello world');
?>
file2.php
<?php
include('file1.php');
echo 'My first text is = ' . INTRO;
?>
file3.php
<?php
include('file2.php');
echo 'My Second text is = ' . INTRO;
?>
当我运行文件file2.php
时,显示的文字是&#39;我的第一个文字是= Hello world&#39;,这没关系。
但问题是当我运行file3.php显示的文本是
My first text is = INTRO
My Second text is = INTRO
它应显示为
My first text is = Hello world
My Second text is = Hello world
这是因为file1.php
的常量值没有传递给file3.php
它在我的电脑上工作正常,但不在服务器上。
我的电脑和服务器都使用Windows Server 2016 64bit + Apache2.4 64bit + Php5.6 64bit。
我在服务器设置中遗漏了什么吗?
答案 0 :(得分:1)
将include
更改为require
,您可能会看到您的文件未被包含,包含将无声地失败。
我的猜测是你可能有大写问题,Linux文件系统是区分大小写的窗口不是。因此,如果您的包含使用file1.php
,但您的文件名为File1.php
,其资本可用于Windows,而不适用于Linux,
然后包括在没有告诉你的情况下死去。代码没有问题,因为它在本地工作,因此只留下环境。
在您调用的第一个文件
中打开错误报告可能会有所帮助<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
你应该收到一个未定义常量的通知,然后php默认使用常量的名称作为它的值(“INTRO”)。
这就是你得到文本INTRO
的原因,这意味着你的常量没有被定义。我能看到的唯一方法就是不包含文件。如果它在本地运行而不是在服务器上运行,那么它就是一个很好的选择。它是套管问题。
我假设您在服务器上使用Windows本地和Linux,但由于这很常见,因此解决这个问题并不是一个很大的逻辑上的跳跃。
另请注意,其中包含define
的文件应为require_once
,因为如果您将该文件包含2x,则会因已定义的常量而出错。如果你不能这样做,那么你可以这样做
if(!defined("INTRO")) define('INTRO','Hello world');
在定义它之前检查它是否已定义,但最好只使用require_once
同样在语义上,如果需要包含文件(即你的程序在没有它的情况下中断),则应使用require
包含它。
干杯。