【问题标题】:PHP block syntax conventionsPHP 块语法约定
【发布时间】:2012-06-06 17:40:43
【问题描述】:

很抱歉,如果这是一个完全令人讨厌的问题。我是 PHP 语法约定的新手,所以我不完全确定我应该寻找什么。

我的书给出了以下示例作为 html 代码中的常规 php 块。

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

我明白了,但令人困惑的是,我正在查看来自 xampp 的一些示例的示例代码(例如 CD 集合源代码)似乎没有遵循相同的约定。

相反,示例代码更像这样。

<? include("langsettings.php"); ?>

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

这两种形式在所有意图和目的上都是等效的,还是我完全错过了这里介绍 php 的关键内容?

另外,为什么 php 不使用结束标签(或者我只是没有看到它们)?我想我正在考虑带有结束标签的 javascript,但我想无论哪种方式,它们本身就是代码库,所以它可以工作。似乎 html 在其语法的核心具有对称性,但 php 语法排序打破了这种对称性,这很奇怪。

感谢您的宝贵时间。

【问题讨论】:

  • PHP 是一种解释型语言,显然它不需要对称性。我总是使用第一个选项(&lt;?php),我无法回答您的主要问题。 +1

标签: php html tags


【解决方案1】:

它们之间的唯一区别是第二个需要the setting short_open_tag to be enabled(在新的PHP版本中默认为关闭)。

&lt;?php 常规打开标签。

&lt;?短开标签(默认禁用)

除此之外,将&lt;? include("langsettings.php"); ?&gt; 之类的东西放在自己的一对&lt;? ?&gt; 中,这实际上是您找到它的源代码的特定样式问题。不同的项目使用非常不同的约定,和 PHP 书籍都倾向于采用自己的约定。

不幸的是,PHP 没有任何真正的特定编码约定,例如您可能在 Ruby、Java 或 Python 等语言中找到的,在我看来,这是 PHP 的主要失败之一,也是其最大的灵活性之一.

现在,关于短开放标签是否适合在现代 PHP 应用程序中使用是一个完全独立的问题,which has been discussed at great length here.

【讨论】:

  • 而且,虽然 PHP 是一种服务器端语言,对初学者来说非常软弱,但它也可以在没有框架的情况下编写杂乱的程序代码。
【解决方案2】:

这两种形式是等价的,但你会发现简码会给你带来问题。我会坚持使用常规标签:

<?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。
  • 我在原评论中忽略了:我在回答中也有同样的遗漏,并被 cHao 纠正(:
【解决方案3】:

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

换句话说,&lt;?php 标记之后和?&gt; 标记之前的文本被解释为 PHP。如果省略结束标记,则开始 php 标记和页面末尾之间的所有文本都被解释为 PHP。

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

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

<B>conditional HTML</B>

<?php
}
?>

两个 PHP 块之间的 HTML 不会出现在页面上。

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

【讨论】:

  • 理解这一点很重要!基本上你永远不会有一个关闭的 php-tag。这将始终确保没有数据发送到不是由 PHP 本身创建的输出缓冲区。
  • 这个答案有些可疑。如果“页面上不在&lt;?php?&gt; 之间的任何内容都将......不被解释为PHP”,那么没有?&gt; 的页面将不会有&lt;?php 和a 之间的任何内容?&gt;,整个页面应该被解释为 HTML。但是,省略 ?&gt; 不仅有效,而且对于其中没有文字 HTML 的页面,推荐
  • @cHao 感谢您指出这一点!我已经修改了我的答案。我写的内容适用于 OP 显示的示例,但这不是一般正确的规则。
【解决方案4】:

PHP 开始标签是&lt;?php,结束标签是?&gt;

如果服务器上允许使用短标签,您也可以使用 &lt;? ?&gt; 语法。

您可以在 Offcial PHP Documentation 上阅读更多相关信息

最好的问候, 汤姆。

【讨论】:

    【解决方案5】:

    关于短版本长开放标签的问题已经涵盖。

    我将只提及这些答案中尚未提及的问题中的一个常见问题。

    比较以下:

    <?php
     /*
      * Some comments here, (c) notice, etc.
      */
    
      header("Content-type: text/html");
      ...
    

    <?php
     /*
      * Some comments here, (c) notice, etc.
      */
    ?>
    
    <?php
      header("Content-type: text/html");
      ...
    

    第二个不行。

    为什么?

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

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

    Warning: Cannot modify header information - headers already sent
    

    所以...小心你的空白行。你的 PHP 里面有一个空行就可以了。在您的 PHP 之外,它可能会产生令人讨厌的副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多