PHP include 和闭合标签

9

看到一个关于在PHP脚本中省略闭合标签?>的线程,让我很好奇。

看看这段代码:

foo.php

<?php
echo 'This is foo.php';
include('bar.php');

bar.php

<?php   
echo 'This is bar.php';

如果您创建这两个脚本并运行它们,PHP 将输出:
This is foo.php
This is bar.php

(这是为了艺术效果加的新行)

那么,为什么是: baz.php

<?php
echo 'This is foo.php';

<?php
echo 'This is bar.php';

当"include"仅仅是这样做时,会导致可预测的语法错误unexpected '<',或者说,我的理解是PHP会像一直在那里一样,在该点处转储文件。

如果文件被包含,PHP是否会检查开放标签并忽略未来的标签?为什么不在一个脚本中有两组标签时这样做呢?

感谢任何澄清。虽然不是很重要的问题,但更好地理解PHP会很好。

4个回答

12

如果你包含一个文件,PHP会从解析模式切换到字面量模式(即在关闭标签时通常所做的操作)。这就是为什么这个代码可以工作的原因:

<?php
include 'foo.php';
?>

//foo.php
<?php
echo 'yo';
?>

即使内联,它也会变成

<?php
<?php
echo 'yo';
?>
?>
因为在内部,它会被转换成类似于这样的东西(仅供说明,实际上它可能并不会真正合并文件内容,而只是在它们之间跳转)。
<?php
?>
<?php
echo 'yo';
?>
<?php
?>

你可以省略最后的 "?>",因为在包含文件的末尾,PHP会切回解析包含文件,无论它当前处于什么模式。


2

个人猜测:

当你写 include('bar.php'); 时,解析器会读取 bar.php 的内容并将其插入到 foo.php 中。在读取时,它可能会去掉起始的 <?php,因为它认识到 bar.php 的所有内容都是 PHP 代码,因此结果不会产生错误。


1

可以这样理解,PHP实际上并没有将其他页面包含在第一个页面中,也就是说PHP不会在内部创建一个包含所有已包含页面的单个文件,然后解析它。

它所做的是解析第一个文件,找到include,然后停止解析第一个文件并开始解析已包含的文件。当已包含的文件完成后,它会恢复解析原始文件的位置。(虽然这相当简化了。)


0

我曾经在某处读到过省略 PHP 开始和结束标签的方法。

但是,当我这样做时,我的编辑器不会将文件格式化为 PHP 文件,而是作为普通文本文件。

直到现在,我从来没有遇到过任何包含标签的 include 文件的问题。我不知道使用标签是否已经被弃用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接