看到一个关于省略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';
导致可预测的语法错误unexpected '<'
,当“include”就是这样 - 或者更确切地说,我对include的理解是PHP只是在那时转储文件,好像它一直在那里一样。
如果包含该文件,PHP是否会检查开始标记并忽略将来的标记?当一个脚本中有两组标签时,为什么不这样做呢?
感谢您的任何澄清。这不是一个重要的问题,但更好地理解PHP。
答案 0 :(得分:10)
如果你包含一个文件,PHP会在内部从解析转换为文字模式(即通常在结束标记上执行的操作。这就是为什么这样做的原因:
<?php
include 'foo.php';
?>
//foo.php
<?php
echo 'yo';
?>
即使在内联时它也会变成
<?php
<?php
echo 'yo';
?>
?>
因为它在某种程度上被转化为类似的东西(为了说明的目的,实际上它可能实际上并不合并文件的内容,它只是在它们之间跳转)
<?php
?>
<?php
echo 'yo';
?>
<?php
?>
您可以省略结束吗?&gt;因为在包含文件的末尾,PHP切换回解析包含文件,关注它当前所处的模式。
答案 1 :(得分:2)
个人猜测:
当你写include('bar.php');
时,解析器读取内容为bar.php
并将其插入foo.php
,当读取它时可能剥离起始{{1}因为它识别<?php
的所有内容都是PHP代码,因此结果不会出错。
答案 2 :(得分:1)
将PHP视为实际包括第一个中的其他页面可能会有所帮助,因为PHP内部不会创建包含所有包含页面的单个文件,然后解析。
它的作用是解析第一个文件,找到include
,然后停止解析第一个文件并开始解析包含的文件。当包含的文件完成后,它将继续解析它停止的原始文件。 (虽然这有点简化。)
答案 3 :(得分:0)
我在某处读到了省略开启和关闭php标签的内容。
我这样做时的问题是我的编辑器没有将文件格式化为php文件,而是将其格式化为常规文本文件。
到目前为止,我从未遇到任何包含标签的包含文件的问题。我不知道是否使用标签是折旧行为。