PHP标记

PHP标记是用来告诉Web服务器哪些部分是PHP代码,哪些部分是普通HTML的关键语法。理解PHP标记的使用是PHP编程的基础。

什么是PHP标记?

PHP标记是特殊的符号,用于在HTML文件中嵌入PHP代码。当服务器处理包含PHP代码的文件时,它会:

  1. 识别PHP标记
  2. 执行标记内的PHP代码
  3. 将执行结果与HTML内容合并
  4. 发送最终结果给浏览器

标准PHP标记

XML风格标记(推荐)

<?php
    // 这是标准的PHP标记
    echo "Hello, World!";
?>

特点:

  • 最常用的标记方式
  • XML兼容
  • 支持所有PHP版本
  • 推荐在生产环境中使用

示例:

<?php
    $name = "张三";
    $age = 25;
    echo "姓名:{$name},年龄:{$age}";
?>

简短标记

<?
    // 简短标记
    echo "简短标记示例";
?>

注意:

  • 需要在php.ini中启用short_open_tag
  • 不推荐在新项目中使用
  • 可能在某些服务器环境中不可用
  • PHP 7.4开始不推荐使用

输出标记

简短输出标记(<?=)

<?= "直接输出的内容" ?>

等同于:

<?php echo "直接输出的内容" ?>

使用场景:

<!DOCTYPE html>
<html>
<head>
    <title><?= $pageTitle ?></title>
</head>
<body>
    <h1><?= $heading ?></h1>
    <p>欢迎,<?= $username ?>!</p>
</body>
</html>

优点:

  • 代码更简洁
  • 适合在HTML中输出变量
  • PHP 5.4+版本始终可用

脚本风格标记

script标记方式

<script language="php">
    // 脚本风格标记(很少使用)
    echo "这种标记方式很少使用";
</script>

特点:

  • 类似JavaScript的标记方式
  • 几乎不使用
  • 为了向后兼容保留

HTML中的PHP标记使用

基本嵌入方式

<!DOCTYPE html>
<html>
<head>
    <title>PHP示例页面</title>
    <?php
        $page_title = "我的网站";
        $css_file = "style.css";
    ?>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="<?= $css_file ?>">
    <title><?= $page_title ?></title>
</head>
<body>
    <?php include 'header.php'; ?>

    <main>
        <h1>欢迎访问</h1>
        <?php
            $current_time = date('Y-m-d H:i:s');
            echo "<p>当前时间:{$current_time}</p>";
        ?>
    </main>

    <?php include 'footer.php'; ?>
</body>
</html>

混合使用示例

<?php
    // 定义页面数据
    $page_data = [
        'title' => '用户列表',
        'users' => [
            ['name' => '张三', 'age' => 25, 'email' => 'zhang@example.com'],
            ['name' => '李四', 'age' => 30, 'email' => 'li@example.com'],
            ['name' => '王五', 'age' => 28, 'email' => 'wang@example.com']
        ]
    ];
?>
<!DOCTYPE html>
<html>
<head>
    <title><?= $page_data['title'] ?></title>
    <meta charset="UTF-8">
    <style>
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1><?= $page_data['title'] ?></h1>

    <table>
        <thead>
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>邮箱</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($page_data['users'] as $user): ?>
            <tr>
                <td><?= htmlspecialchars($user['name']) ?></td>
                <td><?= $user['age'] ?></td>
                <td><?= htmlspecialchars($user['email']) ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</body>
</html>

PHP标记的最佳实践

1. 始终使用完整标记

推荐:

<?php
    echo "推荐使用完整标记";
?>

不推荐:

<?
    echo "简短标记可能在某些环境不工作";
?>

2. 纯PHP文件省略结束标记

推荐:

<?php
    // 纯PHP文件不需要结束标记
    $config = [
        'database' => 'mysql',
        'host' => 'localhost'
    ];

    function get_config($key) {
        global $config;
        return $config[$key] ?? null;
    }

原因:

  • 避免意外的空白字符输出
  • 防止Headers already sent错误
  • 符合PSR标准

3. 合理使用输出标记

适合使用<?=的场景:

<div class="user-info">
    <h2><?= $user['name'] ?></h2>
    <p>年龄:<?= $user['age'] ?></p>
    <p>邮箱:<?= htmlspecialchars($user['email']) ?></p>
</div>

不适合使用<?=的场景:

<?php
    // 复杂逻辑不适合使用输出标记
    if ($user->isLoggedIn()) {
        echo "欢迎回来!";
        if ($user->hasUnreadMessages()) {
            echo "您有新消息。";
        }
    }
?>

多个PHP标记块

标记块的分离

<?php
    // PHP逻辑处理
    $title = "产品列表";
    $products = [
        ['name' => 'iPhone', 'price' => 5999],
        ['name' => 'Samsung', 'price' => 4999],
        ['name' => 'Huawei', 'price' => 4599]
    ];
?>

<!DOCTYPE html>
<html>
<head>
    <title><?= $title ?></title>
</head>
<body>
    <?php if (!empty($products)): ?>
        <h1><?= $title ?></h1>
        <ul>
            <?php foreach ($products as $product): ?>
                <li><?= $product['name'] ?> - ¥<?= $product['price'] ?></li>
            <?php endforeach; ?>
        </ul>
    <?php else: ?>
        <p>暂无产品</p>
    <?php endif; ?>
</body>
</html>

标记间的变量共享

<?php
    // 第一个PHP块
    $site_name = "我的网站";
    $page_info = [
        'title' => '首页',
        'description' => '网站首页描述'
    ];
?>
<!DOCTYPE html>
<html>
<head>
    <title><?= $page_info['title'] ?> - <?= $site_name ?></title>
</head>
<body>
    <?php
        // 第二个PHP块,可以访问前面定义的变量
        $welcome_message = "欢迎访问{$site_name}!";
        echo "<h1>{$welcome_message}</h1>";

        // 也可以修改前面的变量
        $page_info['title'] = "欢迎页面";
    ?>

    <p>当前页面:<?= $page_info['title'] ?></p>
</body>
</html>

条件性包含PHP标记

检查PHP是否可用

<?php if (extension_loaded('gd')): ?>
    <?php
        // 使用GD库的PHP代码
        $image = imagecreate(200, 100);
        $bg_color = imagecolorallocate($image, 255, 255, 255);
        $text_color = imagecolorallocate($image, 0, 0, 0);
        imagettftext($image, 20, 0, 10, 50, $text_color, 'arial.ttf', 'Hello');
        header('Content-Type: image/png');
        imagepng($image);
        imagedestroy($image);
    ?>
<?php else: ?>
    <p>GD库未安装,无法生成图片</p>
<?php endif; ?>

错误的标记使用示例

常见错误

1. 嵌套标记

<?php
    if ($condition) {
        <?php // 错误:不能嵌套PHP标记
            echo "这会导致语法错误";
        ?>
    }
?>

正确写法:

<?php
    if ($condition) {
        echo "正确写法";
    }
?>

2. 在HTML属性中的标记使用

<!-- 错误 -->
<input type="text" value="<?php echo if ($error) { 'error'; } else { ''; } ?>">

<!-- 正确 -->
<input type="text" value="<?= $error ? 'error' : '' ?>">

3. 遗漏结束标记

<?php
    echo "缺少结束标记会导致问题"
    // 忘记写 ?>
<p>这段HTML可能无法正确显示</p>

实际应用示例

模板系统示例

<?php
    // 模板引擎的基础实现
    class SimpleTemplate {
        private $data = [];

        public function assign($key, $value) {
            $this->data[$key] = $value;
        }

        public function render($template) {
            if (file_exists($template)) {
                // 提取变量到当前作用域
                extract($this->data);
                include $template;
            } else {
                echo "模板文件不存在:{$template}";
            }
        }
    }

    // 使用示例
    $template = new SimpleTemplate();
    $template->assign('title', '用户管理');
    $template->assign('users', [
        ['id' => 1, 'name' => '张三'],
        ['id' => 2, 'name' => '李四']
    ]);

    $template->render('user_list.php');
?>

模板文件 (user_list.php)

<!DOCTYPE html>
<html>
<head>
    <title><?= $title ?></title>
    <meta charset="UTF-8">
</head>
<body>
    <h1><?= $title ?></h1>

    <?php if (!empty($users)): ?>
        <table>
            <tr><th>ID</th><th>姓名</th></tr>
            <?php foreach ($users as $user): ?>
                <tr>
                    <td><?= $user['id'] ?></td>
                    <td><?= htmlspecialchars($user['name']) ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    <?php else: ?>
        <p>暂无用户数据</p>
    <?php endif; ?>
</body>
</html>

性能考虑

1. 减少标记切换

优化前:

<?php for ($i = 0; $i < 10; $i++): ?>
    <?php if ($i % 2 == 0): ?>
        <span><?= $i ?></span>
    <?php else: ?>
        <strong><?= $i ?></strong>
    <?php endif; ?>
<?php endfor; ?>

优化后:

<?php
for ($i = 0; $i < 10; $i++) {
    if ($i % 2 == 0) {
        echo "<span>{$i}</span>";
    } else {
        echo "<strong>{$i}</strong>";
    }
}
?>

2. 合理使用输出缓存

<?php
// 开启输出缓存
ob_start();
?>

<div class="content">
    <h2><?= $article['title'] ?></h2>
    <div class="article-body">
        <?= $article['content'] ?>
    </div>
</div>

<?php
$content = ob_get_clean();
echo $content;
?>

调试技巧

1. 查看生成的HTML

<?php
    // 在开发时,可以查看生成的HTML代码
    $html_content = '<!DOCTYPE html>
<html>
<head><title>测试页面</title></head>
<body>
    <h1>' . $title . '</h1>
    <p>内容:' . $content . '</p>
</body>
</html>';

    // 调试时输出HTML
    if (defined('DEBUG_MODE') && DEBUG_MODE) {
        echo '<pre>' . htmlspecialchars($html_content) . '</pre>';
    } else {
        echo $html_content;
    }
?>

2. 检查PHP标记问题

<?php
    // 检查是否有输出缓冲问题
    if (headers_sent()) {
        echo "<div style='color: red;'>警告:头部信息已发送</div>";
    }

    // 检查变量是否正确设置
    echo "<!-- 调试信息:title = " . ($title ?? 'undefined') . " -->";
?>

总结

PHP标记是PHP编程的基础,掌握其正确使用方法对于编写清晰、高效的PHP代码至关重要。

关键要点:

  1. 始终使用标准标记 <?php ... ?>
  2. 纯PHP文件省略结束标记
  3. 合理使用输出标记 <?= ... ?>
  4. 避免嵌套标记
  5. 注意变量在标记间的共享

最佳实践:

  • 优先使用XML风格标记
  • 模板文件合理利用输出标记
  • 保持代码结构清晰
  • 注意性能影响
  • 遵循团队编码规范

正确使用PHP标记将帮助你编写更清晰、更易维护的PHP代码!