【PHP基础教程】第二课 PHP基础语法

在学习这节课之前,如果你还没有了解任何编程语言,尤其是C/C++的,非常建议先去学习它们的语法,以便于理解PHP的语法。

PHP代码是类C(C-Like)代码,几乎所有的语法都是由C/C++衍生过来的,当然也有借鉴JAVA。因为是初学,我们就先学习最基本的语法,高级语法可以到后面再学习。另外,看完本文后,还可以进一步了解PHP7(目前最高版本7.4)的新特性,以便于更好的学习和开发。

 

PHP文件的构造

PHP是一种解释型语言,原生就支持HTML,因此可以和HTML代码混在一起,所以需要起始符和结束符来限定PHP代码的范围。例如:

<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
        echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html>

*以上代码来自:https://www.php.net/manual/zh/intro-whatis.php

这段代码就很好的解释了什么是起始符和结束符,且它们的用途。PHP的起始符为<?php,虽然可以简写为<?,但是需要在php.ini中开启short_open_tag,且无法与xml代码混用,所以不推荐简写方式,大家记住用<?php就好了。结束符为?>,这个就没有什么争议。在初学阶段,一定要注意起始符和结束符的书写,避免因漏写造成代码无法执行。如果PHP代码不在起始符和结束符之间,它们将会原样输出而不被解释器解释。

 

PHP的字面量、常量和变量

有些同学可能对字面量的概念不太清楚,我这里稍微解释一下,其实就是一个固定值的表示法,如整数10、浮点数10.23、布尔型false、字符串"abc"等等。有些教程里会说这些是常量,其实不然,常量只是一个标识,只是程序运行过程中它不会变化而已。具体的可以参照:https://www.jianshu.com/p/0f2816805da6

PHP的字面量和大多数编程语言的差不多,主要有整数型、浮点型、布尔型(true/false)、字符串、数组(在JAVA中分为List/Collection和Map)。其中,PHP的数组比较特别,它可以指定键(即Java的Map),也可以不指定键(即Java的List/Collection),甚至可以混合在一起。当然了,最好是分开来,比较好维护。PHP因为是弱类型语言,因此原生就支持自动类型转换,因此对类型不敏感,这点稍后会强调(讲到运算符的时候)。

PHP的字符串可以用单引号或双引号来引起来,或者也可以使用定界符,例如:

$str1='Hi'; //单引号
$str2="你好呀"; //双引号
//它们的主要区别是,双引号引住的字符串中包含变量的话,会被解析成值,但是单引号直接原样输出。
//如果要引住一个对象的属性,则为:(假设$user存在)
$str3="Hi, {$user->name}"; //如果$user->name='Guest',那么输出为:Hi, Guest

// 定界符,定界符的标识可以随便换,但是开头和结尾一定要一样
// 这个其实叫Heredoc,还有一个叫Nowdoc的在下面
$html=<<<HTML //定界符后面不能有任何字符串(包括空格)
大量的字符串
HTML;  //必须是顶头的,不能有返回的字符

//Nowdoc,跟Heredoc的区别就像单引号和双引号引住字符串的区别,PHP5.3开始支持
$text=<<<'HI'
大量的字符串
HI;

//补充:从PHP7.3开始,Heredoc/Nowdoc结束标记不再需要独立一行或紧跟分号了。同时结束标记也可以使用缩进,使用缩进时doc内容的每行都会跳过相应的缩进。

PHP的数组这样定义和访问:

$arr1=array('123','456','789');
$arr2=['abc','efg','hij'];
// 用array和[]来定义都是可以的哦,不过[]定义在PHP5.4才得到支持

$score=['jack'=>93.5,'david'=>88.9,'dock'=>90.4];

echo $arr1[0];  // 用数字下标可以访问没有指定键的数组
echo $score['jack'];  //至于有指定键值的数组,则用对应的键来访问

PHP的常量可以使用const或define来定义,用法:

define('HELLO','hello');
const WORLD = 'world';

echo HELLO.WORLD;

输出结果:helloworld

两种用法结果上没有什么区别,唯一的区别是const更直观,且为语言结构,而define为函数,从编译(解释)耗时上看是const更胜一筹。当然了,const在PHP5.3后才被支持,之前只能在类内使用,不过现在是PHP7的时代了,我们可以不用在意。

PHP的变量也很有脚本的味道:它以美元符号$开头,后接标识符,标识符支持下划线,且必须以下划线或字母开头,例如:

$hi='HI';
$_hru='How are you';

echo $hi.$_hru;

其实就很像shell脚本啦,有意向学习shell脚本的话也可以对比学习,更容易记住。

 

PHP的输出

说到编程,就不得不说Hello World,说到Hello World,就不得不提怎么打印Hello World了。PHP跟其他编程语言一样,支持I/O交互,无论是命令行还是网页都一样。PHP可用的输出语言结构/自带函数主要有:echo/print/print_r/var_dump,其中,echo和print为语言结构,所以可以不用圆括号包围参数列表。上面的代码也演示过echo的使用了,print也是一样的,只不过print只支持一个参数(这就是你分手的借口???)。而print_r和var_dump为函数,执行效率不如语言结构,但它们的功能更强大,可以输出数组、对象等,echo/print不行。print_r和var_dump的主要区别是,print_r仅输出变量/对象的数据,而var_dump则输出更为详细的信息,例如变量/对象的类型,数组的元素个数等等,总之非常强大。

顺便附上语言结构和函数的区别:https://blog.csdn.net/beauty5188/article/details/78250875

 

PHP的语法结构

其实这个应该是第一个说才对,不过我把很有意思的放在了前面,主要是希望能够吸引一下新人。

PHP的语法结构和大多数编程语言一样,都分为顺序结构、循环结构、选择结构。

顺序结构

顺序结构自然不用说,当然是直接从上到下执行啦。PHP不需要main函数,因此可以直接把代码写在函数之外,和大多数脚本语言是一样的。PHP也和C/C++一样用{}括住“函数体”。

循环结构

主要有for/foreach/while,其中foreach算是PHP特有(其实JS也有啦),for的用法和C/C++一样:

$array=array('123','456','789');

for($i=0;$i<count($array);$i++) {
    echo $array[$i];
}

而foreach用于循环输出数组的元素和键,例如:

$arr1=[1,2,3,4,5];
$arr2=['abc'=>'123','cfg'=>'no','menber'=>3];

// $key 为键值,定义时没有指定的话是从左到右从0开始的;
// $val为当前选中的元素值,修改该值并不会影响数组原本的元素值
foreach($arr1 as $key=>$val) {
    echo 'key:'.$key.',val:'$val;
}
//也可以不需要键值
foreach($arr1 as $val) {
    echo $val;
}

foreach($arr2 as $key=>$val) {
    echo 'key:'.$key.',val:'$val;
}

while也是和C/C++一样的,这里就不举例了。

选择结构

主要有if/switch,例如:

$test=true;
if ($test) {
    echo "通过";
} else {
    echo "失败";
}

$choose="i";

switch($choose) {
    case 'i':
        echo "我";
    break;
    case 'we':
        echo "我们";
    break;
    default: echo "不知道";
}

跟C/C++的规则是一样的,不一样的地方就是switch case可以为字符串,而C/C++不行(因为字符串不是C/C++的基本类型)。

 

PHP运算符

与C/C++一样,PHP也有单目运算符、双目运算符和三目运算符。

因为重合度太高,所以这里就不详细介绍了,这里重点介绍PHP特有的运算符(有些JS其实也有)。

首先是相等运算符,PHP中有=====,它们的区别是:==只判断值是否相等,例如"123"和123、0和false在值上是相等的,因此"123"==123和0==false是true的结果,这是因为PHP对类型不敏感,可以自动转换类型并保留原有值;而===不仅判断值是否相等,也判断类型是否一致,例如123===123为true,但是"123"===123和0===false为false。

比较运算符,例如> < >= <=,支持各种基本类型/对象的比较,对象比较的规则可以参考https://www.php.net/manual/zh/language.oop5.object-comparison.php,基本类型的比较例如整数和浮点型,以及相同形式的字符串,例如"2019-12-12">"2019-11-11"、"7.3">"7.2.9"等等,在比较日期和版本号的时候非常实用。

赋值运算符,其实这个就只要提一下字符串的,因为PHP中字符串用.来拼接,所以也可以用省略写法 $text.="abcd"; 来赋值(类似于$num+=2;)。

然后是三目运算符,PHP支持省略写法,比如:$test?:0,它的完整写法应该是$test?$test:0。这一点非常方便,使代码更加简洁。除此之外,在PHP7后还支持??的用法,例如:$test['test']??null,它是isset($test['test'])?$text['test']:null的简写,可以减少isset和array_key_exists函数的使用。

更有意思的用法,等到深入学习后,自然会了解到,这里不多阐述。

 

杂项

因为有些碎片的语法和自带函数/系统常量变量不好单独介绍,但是它们又经常使用,因此都丢在这里吧。后面附上官方的介绍

isset:检测变量是否已设置并且非 NULL,返回值为布尔型。https://www.php.net/isset/

unset:释放给定的变量。https://www.php.net/unset

empty:检查一个变量是否为空,返回值为布尔型。https://www.php.net/empty

list:把数组中的值赋给一组变量。https://www.php.net/manual/zh/function.list.php

魔术常量:https://www.php.net/manual/zh/language.constants.predefined.php

$_GET:通过 URL 参数传递给当前脚本的变量的数组。https://www.php.net/manual/zh/reserved.variables.get.php

$_POST:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。https://www.php.net/manual/zh/reserved.variables.post

$_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组https://www.php.net/manual/zh/reserved.variables.cookies.php

$_REQUEST:默认情况下包含了 $_GET$_POST 和 $_COOKIE 的数组https://www.php.net/manual/zh/reserved.variables.request

$_SESSION:当前脚本可用 SESSION 变量的数组。更多关于如何使用的信息,参见 Session 函数 文档。https://www.php.net/manual/zh/reserved.variables.session

$_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组。 此数组的概况在 POST 方法上传 章节中有描述。https://www.php.net/manual/zh/reserved.variables.files

 

总结

PHP的语法与C/C++和JAVA相近,属于C-Like语言,不仅基于C/C++,也继承了很多JAVA先进的思想。不过,PHP终究是脚本语言,在规范性方面做得还不够好,但它易用,容易入门,是个人开发者的好选择。它在语法上解决了很多烦人的问题,自带了很多有用的函数,对我们的编程开发有很大的帮助,轻易就能做出一款能用的软件或网站。虽然这一课有一些枯燥无味,但我希望各位同学认真对待它,它能够解决你至少40%的PHP开发问题。

发表评论