PHP块语法约定

4

如果这个问题听起来很新手,我很抱歉。我对PHP语法约定还很陌生,不太确定我应该寻找什么。

我有一本书,其中给出了以下示例,作为HTML代码中的传统PHP块。

<?php
//... some code ...
?>

我理解您的意思,但令人困惑的是,我正在查看一些来自xampp的示例代码(例如CD收藏源代码),它们似乎没有遵循相同的约定。
相反,示例代码更像是这样。
<? include("langsettings.php"); ?>

<?
//... some code ...
?>

这两种形式从实际意义上来说是否等效,或者我在PHP入门方面完全错过了一些关键内容?
另外,为什么PHP不使用闭合标签(或者说我没有看到它们)?我想我想的是带有闭合标签的JavaScript,但无论如何,它们本身就是代码库,因此可以工作。只是似乎HTML的语法核心具有对称性,而PHP的语法则违背了这种对称性,这很奇怪。
感谢您的时间。

1
PHP是一种解释性语言,显然不需要对称性。我总是使用第一个选项(<?php),无法回答你的主要问题。+1 - Fabrício Matté
可能是Are PHP short tags acceptable to use?的重复问题。 - Scott Saunders
5个回答

4
这两者之间唯一的区别是,第二种需要启用设置short_open_tag(在新的PHP版本中默认为关闭)。 <?php 是常规开标记。 <? 是短标记(默认情况下已禁用)。
除此之外,像<? include("langsettings.php"); ?>这样的内容放置在自己的一行中,括在自己的一对<? ?>中,实际上是源代码特定风格的问题。不同的项目使用非常不同的约定,而每个PHP书籍通常都采用自己的约定。
不幸的是,PHP没有真正具体的编码约定,例如您可能会在Ruby、Java或Python等语言中找到的那样,这是我不请自来的意见,也是PHP最大的灵活性之一。

现在,关于短标签是否适用于现代PHP应用程序的最佳实践是一个完全不同的问题,已经在这里广泛讨论过。


而且,虽然PHP是一种对初学者比较友好的服务器端语言,但它也容易让人写出没有框架的混乱、过程式的代码。 - Justus Romijn

3
两种形式是等效的,但您会发现短代码可能会出现问题。我建议使用常规标签:
<?php

和被关闭的块

?>

编辑:结束标签是可选的,但仅限于您希望在开放标签之后的所有内容被解释为PHP直到页面末尾。

那些块之外的任何内容都将被解释为HTML,因此您必须确保注意打开和关闭的位置。

例如:

<body>

<h1> The Heading </h1>

<p>
   <?php
      echo "This is the Content";
   ?>
</p>

</body>

将有效,将PHP生成的字符串输出到您的段落标签中。

PHP与Javascript类似,它没有“打开”和“关闭”标签,而是利用分号声明特定PHP语句的结尾。

include "file1.php";
include "file2.php";

如果您忘记了分号,就像这样:
include "file1.php"
include "file2.php";

这将会产生一个错误。


好的回答;我只想补充一下,闭合标签是可选的。如果省略了它,那么在开头的 PHP 标签和页面结尾之间的所有文本都将被解释为 PHP 代码。 - octern
我在原始评论中忘了提到:我在回答中也犯了同样的错误,被cHao指正了(: - octern

1

PHP块的结束标记是?>。虽然不需要结束标记,但如果您想将页面的一部分解释为PHP,另一部分解释为字面HTML,则可以使用它。有时候人们这样做是因为他们想在页面开头进行一些PHP处理,然后编写一个普通的静态HTML页面,其中只有一些PHP变量被回显。

换句话说,在<?php标记之后和?>标记之前的文本将被解释为PHP。如果省略了结束标记,则从打开php标记到页面末尾的所有文本都将被解释为PHP。

唯一的例外是,如果您在php块内部打开条件语句,然后关闭php块,则页面上以下所有文本都将受到该条件语句的影响,直到您开始一个新的php块并关闭条件语句。例如,如果运行脚本:

<?php
if(1==0) {
?>

<B>conditional HTML</B>

<?php
}
?>

两个 PHP 代码块之间的 HTML 不会显示在页面上。

请注意,不同的 PHP 代码块都是同一个脚本的一部分。在一个代码块中定义的变量、函数和类可以被该页面上的其他代码块使用,依此类推。


这一点非常重要!基本上你永远不会有一个关闭的 PHP 标签。这将始终确保没有由 PHP 以外的数据被发送到输出缓冲区。 - Daan Timmer
这个答案有点可疑。如果“页面上任何不在<?php?>之间的内容都不会被解释为PHP”,那么没有?>的页面就没有任何在<?php?>之间的内容,整个页面应该被解释为HTML。但是不仅省略?>有效,而且对于没有字面HTML的页面,这是推荐的做法。 - cHao
@cHao 谢谢你指出这个问题!我已经修改了我的回答。我写的适用于 OP 给出的例子,但并不是普遍正确的规则。 - octern

0

PHP的起始标签是<?php,结束标签是?>

如果服务器允许使用短标签,你也可以使用<??>语法。

你可以在官方PHP文档中了解更多相关信息。

祝好, 汤姆。


0

关于短版本长开放标签的问题已经得到解决。

在这些答案中还没有提到一个常见的陷阱,我只想提一下。

比较以下内容:

<?php
 /*
  * Some comments here, (c) notice, etc.
  */

  header("Content-type: text/html");
  ...

vs

<?php
 /*
  * Some comments here, (c) notice, etc.
  */
?>

<?php
  header("Content-type: text/html");
  ...

第二个不起作用。

为什么?

在第一个 PHP 代码块和第二个之间有一行非 PHP 代码的空白行。在没有使用输出缓冲的服务器环境中,这个空白行向 PHP 发出信号,表明头部已经全部完成,从此处开始的任何内容都是发送到浏览器的 HTML(或其他内容)的一部分。

然后,我们尝试发送一个标头。这会产生:

Warning: Cannot modify header information - headers already sent

所以……要小心你的空白行。在 PHP 内部的空白行是可以的。在 PHP 外部,它可能会产生不良影响。


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