2、PHP基础语法:标记风格、注释、变量与常量、数据类型

好,咱们正式开始写PHP代码了。这一章是地基中的地基,我建议你认真过一遍。很多新手觉得语法枯燥,但说实话,我见过太多线上bug,根源就是变量类型没搞明白。

2.1 PHP标记风格

PHP代码要跑起来,得先告诉服务器:「嘿,这里开始是PHP了」。这个「开关」就是标记。

标准标记(推荐)

<?php
    echo "Hello, World!";
?>

这是最通用的写法,兼容性最好。我个人习惯一直用这个,不管在哪个服务器上都不会出问题。

短标记(不推荐)

<?
    echo "Hi";
?>

短标记需要php.ini中开启short_open_tag。我曾经在一个客户的旧服务器上吃过亏——代码迁移过去,短标记全失效了,页面白花花一片。嗯,从那以后我再也不用短标记了。

避坑指南: 千万别在纯PHP文件中写结尾标记 ?>。为什么?因为后面如果多了一个空格或换行,输出就会多一个空白字符,容易导致「headers already sent」错误。我当年调试这个bug花了整整一下午。

2.2 注释

注释是写给程序员看的,不是给机器看的。好的注释能救命,坏的注释能坑人。

<?php
    // 这是单行注释

    /*
        这是多行注释
        可以写好几行
    */

    # 这也是单行注释(Perl风格,不常用)
?>

我个人建议:代码逻辑复杂的地方写注释,但别写废话。比如 $i++; 旁边写「i加1」——这种注释删了吧,浪费时间。

2.3 变量

PHP的变量用$开头,不用声明类型,直接赋值就能用。这很灵活,但也容易埋坑。

<?php
    $name = "小明";
    $age = 25;
    $price = 19.99;
    $isStudent = true;
?>

变量命名规则:

  • $开头,后面跟字母或下划线
  • 区分大小写($name$Name是两个变量)
  • 不能以数字开头
我的习惯: 变量名用驼峰命名($userName)或下划线命名($user_name),选一种坚持用。团队协作时,命名风格统一比什么都重要。

2.4 常量

常量一旦定义,就不能再修改。适合存一些固定值,比如数据库密码、网站名称。

<?php
    // 使用 define() 定义
    define("SITE_NAME", "PHP学习网");
    define("MAX_USERS", 1000);

    // 使用 const 定义(PHP 5.3+)
    const VERSION = "1.0.0";

    echo SITE_NAME;  // 输出:PHP学习网
?>

常量前面没有$符号,这是和变量最大的区别。我见过新手写 $SITE_NAME,结果报错半天找不到原因。

2.5 数据类型

PHP是弱类型语言,但底层还是有8种基本数据类型。咱们一个一个过。

2.5.1 整型(Integer)

<?php
    $a = 123;       // 十进制
    $b = -456;      // 负数
    $c = 0x1A;      // 十六进制(26)
    $d = 0b1101;    // 二进制(13)
?>

整型范围取决于系统,32位系统最大约21亿,64位系统大得多。我曾经在32位服务器上做计数器,结果数字超过21亿后直接变成负数——嗯,踩坑了才知道要改用字符串存大数字。

2.5.2 浮点型(Float)

<?php
    $price = 19.99;
    $big = 1.2e5;   // 科学计数法,等于120000
?>
重要提醒: 浮点数不要直接比较相等!比如 0.1 + 0.2 == 0.3 在PHP中可能是false。为什么?因为浮点数在计算机里是近似值。算钱的时候,请用整数(单位:分)或者用BCMath扩展。

2.5.3 字符串(String)

<?php
    $str1 = '单引号字符串';
    $str2 = "双引号字符串\n换行";
    $str3 = <<<EOT
这是定界符字符串
可以写多行
EOT;
?>

单引号和双引号的区别:双引号会解析变量和转义字符,单引号不会。说白了,双引号更「聪明」但也更慢一点。我一般用单引号,除非需要解析变量。

2.5.4 布尔型(Boolean)

<?php
    $isLogin = true;
    $isAdmin = false;
?>

布尔值只有两个:true和false。但PHP里很多值也能当布尔用:

  • 0、0.0、""、"0"、null、空数组 → 都算false
  • 其他值 → 算true

这个特性很实用。比如 if ($count) 就能判断「有没有数据」,不用写 if ($count > 0)。简洁,但别滥用。

2.5.5 数组(Array)

<?php
    // 索引数组
    $colors = ["红", "绿", "蓝"];
    echo $colors[0];  // 红

    // 关联数组
    $user = [
        "name" => "张三",
        "age" => 30
    ];
    echo $user["name"];  // 张三
?>

数组是PHP的灵魂。我处理过的项目里,90%的数据都是用数组存的。关联数组特别方便,键名用字符串,一看就懂。

2.5.6 对象(Object)

<?php
    class Person {
        public $name;
        function sayHello() {
            echo "你好,我是" . $this->name;
        }
    }

    $p = new Person();
    $p->name = "李四";
    $p->sayHello();
?>

对象是面向对象编程的基础。现在先有个印象,后面有专门章节讲。

2.5.7 NULL

<?php
    $var = null;
    $var2;  // 未赋值,也是null
?>

NULL表示「没有值」。注意和空字符串""、数字0区分开。用 is_null()=== null 来判断。

2.5.8 资源(Resource)

<?php
    $file = fopen("test.txt", "r");  // $file 就是资源类型
    // 用完记得关闭
    fclose($file);
?>

资源是外部资源的引用,比如文件句柄、数据库连接。你不需要直接操作它,但要知道用完要释放。我见过有人打开文件不关闭,结果服务器上文件句柄用光,所有请求都卡住了。

2.6 类型转换

PHP会自动转换类型,但有时候需要手动转:

<?php
    $num = "123";
    $intNum = (int)$num;      // 强制转整型
    $floatNum = (float)$num;  // 强制转浮点型
    $str = (string)456;       // 强制转字符串
?>
核心要点: 理解数据类型,不是为了背语法,而是为了写出稳定的代码。变量类型搞混了,bug就来了。我每次写代码前,都会想清楚:「这个变量应该是什么类型?」

好了,这一章的内容就这些。标记、注释、变量、常量、8种数据类型——都是最基础的东西。别觉得简单就跳过,基础不牢,后面写框架、做项目时会很痛苦。下一章咱们聊运算符和流程控制,到时候这些数据类型就派上用场了。