阿里云新用户优惠

第二章 PHP基础语法

一、PHP入门

掌握PHP语法风格,PHP标记和注释

1、第一个脚本程序

<!DOCTYPE html>
<html>
<head>
    <title>PHP程序</title>
</head>
<body>
    <?php
        echo "<h1>你好,这是第一个PHP脚本程序!</h1>"; 
    ?>
</body>
</html>
  • PHP 文件的默认扩展名是 “.php”
  • PHP 文件中可以包含 html、CSS、JavaScript 代码
  • PHP 标记 开始标记 <?php 和 结束标记 ?> 中间写 PHP 代码
  • PHP 语句结束符 ;一条语句结束符,{}一个段落结束符

2、PHP语言标记风格

  • 开始标记 <?php 和 结束标记 ?> 中间写 PHP 代码
    当解析一个文件时,PHP 会寻找起始和结束标记,也就是告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。
php有4种标记方式:
标记方式 名称 描述
<?php //PHP代码 ?> XML风格,标准风格 推荐使用
<? //PHP代码 ?> 简短风格 PHP默认关闭
<scrpit language="php" //PHP代码 </scrpit> 脚本风格 PHP7已不支持
<% //PHP代码 %> ASP风格 PHP7已不支持

简短风格 在 php.ini中 通过 short_open_tag = On 来设置开启,设置后需要重启Apache

注:<?php之间不能有空格
注:如果整个页面都是PHP代码,PHP结束符可以省略(推荐)

3、PHP页面输出

  • echo 可以输出一个或多个字符串,用逗号(,)隔开,无返回值
  • print 只允许输出一个字符串,执行成功返回1,失败返回0
  • print_r() PHP内置函数,它可输出任意类型的数据,如字符串、数组等
  • var_dump() 可以输出一个或多个任意类型数据,还可以获取数据的类型和元素个数
<?php
    echo 111,222
    print "aabbcc"
    echo print 111;
    $a = ['a' => 1, 'b' => 2];
    echo $a;
    echo "<hr/>";
    print $a;
    echo "<hr/>";
    print_r($a);
    echo "<hr/>";
    var_dump($a);
?>
注:上面代码报错,因为没有结束符

4、语句结束符 ;

<?php
    echo 111,222;
    print 111;
?>

5、PHP程序注释

<?php
    // echo "这是C++注释风格";
    # echo "这是shell风格的注释";
    /*
        echo "这是C语言风格的多行注释";
        echo "注释后,在浏览器和网页源码中,是看不到的。";
    */
?>

6、PHP使用JavaScript

<?php
    echo "<script>";
    echo "alert('我是JavaScript! ');";
    echo "</script>";
?>

7、综合案列

<!DOCTYPE html>
<html lang="en">
<head>
    <title>标记应用</title>
    <style type="text/csss">
        p {
            text-align: center;
            font-family: "黑体";
            font-size: 24px;
        }
    </style>
</head>
<body>
    <p>HTML5页面</p>
    <?php
        $str1 = "PHP 变量1";
        $str2 = "PHP 变量2";
        echo "<script>";
        echo "alert('".$str1."');";
        echo "</script>";
    ?>
    <input type="text" id="tx" size="20"><br/>
    <input type="button" name="bt" value="单击" onclick="tx.value='<?php echo $str2; ?>'">
</body>
</html>
注:注意代码编写规范

以下代码有错误,请修改

<? php
    / 这里是注释
    echo "大家好";
    echo "这是我的一个php程序"
    echo "我正在查找错误";    
?>

二、数据类型

掌握常用的数据类型与不同类型转换的方法

数据类型有两种:强类型和弱类型
PHP是弱类型,PHP7之后支持强类型

1、标量数据类型

类型 描述
整型Integer 整型包含所有的整数,可以是正数也可以是负数
浮点型Float 带小数的数字
布尔型Boolean truefalse
字符串String 汉字、英文、符号、其它国家语言,被引号包含的内容
  • 整型 在 PHP 中,整型变量称为 integer 或 int 类型,用来表示一个整数
    PHP支持2、8、10、16进制的整数
<?php
    $num1=10;		//十进制
    $num2=010;		//八进制(数字前面加0)
    $num3=0x10;		//十六进制(数字前面加0x)
    $num4=0b100101; //二进制数(数字前面加0b)

    echo $num1,'<br>';		//10
    echo $num2,'<br>';		//8
    echo $num3,'<br>';		//16
    echo $num4;             //37
?>

进制转换

机制 缩写 单词
十进制 dec decimalist
二进制 bin binary
八进制 oct octonary
十六进制 hex hexdecimalist

例题

PHP提供了进制转换函数

<?php
    echo decbin(123),'<br>';        //十进制转二进制
    echo bindec(1111011),'<br>';	//二进制转十进制
    echo dechex(123),'<br>';		//十进制转十六进制
    echo hexdec('7b'),'<br>';		//十六进制转十进制
    echo decoct(123);				//十进制转八进制
?>

建议:数字不要使用单引号或者双引号

<?php
    var_dump("10");
    echo '<br>';
    var_dump("1");
    echo '<br>';
    var_dump("10"+"1");
    echo '<hr>';   
    var_dump("0xe");
    echo '<br>';
    var_dump("0x1");
    echo '<br>';
    var_dump("0xe" + "0x1");
?>
  • 浮点型 浮点型在 PHP 中被称为 float 类型,也可称为实数,可以用来存储整数和小数
<?php
    $num1 = 3.1415926;
    $num2 = 1.3e4;
    $num3 = 7e-10;
    $num4 = 0.0000000007;
    var_dump($num1, $num2, $num3);
?>

浮点数在内存中保存的是近似值
浮点数不能参与比较

<?php
    var_dump(0.9==(1-0.1));		//bool(true) 
    echo '<br>';
    var_dump(0.1==(1-0.9));		//bool(false) 
?>

如果浮点数要比较,必须确定比较的位数

<?php
    var_dump(0.9==(1-0.1));		//bool(true) 
    echo '<br>';
    var_dump(0.1==(1-0.9));		//bool(false) 
    echo '<br>';
    //比较小数点后面5位   int(0)   0表示相等
    var_dump(bccomp(0.1,1-0.9,5));
?>

bccomp(string $num1, string $num2, ?int $scale = null): int
比较 num1 和 num2, 并且返回整型数字的结果。
两个数相等时返回 0; num1 比 num2 大时返回 1; 其他则返回 -1。

<?php
    echo bccomp('1', '2') . "\n";   // -1
    echo '<br>';
    echo bccomp('1.00001', '1', 3); // 0
    echo '<br>';
    echo bccomp('1.00001', '1', 5); // 1
    echo '<hr>';
    $num3 = 7e-10;
    $num4 = 0.0000000007;
    var_dump($num4 == $num3);
    echo '<br>';
    // bccomp会将参数转成字符串,需要将7e-10写成小数点模式才能比较
    echo bccomp($num3, $num4, 20); 
?>
  • 布尔型 布尔型只有两种值,分别是 TRUE 和 FALSE(不区分大小写)
    不能使用echo 和print输出布尔型,要使用var_dump()输出
<?php
    $x = true;
    $y = false;
    var_dump($x, $y);
?>
  • 字符串型
    在PHP中单引号字符串和双引号字符串是有区别的
    单引号字符串是真正的字符串
    双引号字符串要解析字符串中的变量

例题

<?php
    $name = 'tom';
    echo '我的名字叫$name','<br>';
    echo "我的名字叫$name",'<br>';
?>

例题:{ }取变量值

<?php
    $name = 'tom';
    echo '$name是我的名字','<br>';
    echo "{$name}是我的名字",'<br>';
    echo "${name}是我的名字",'<br>';
?>

输出特殊字符

<?php
    echo '<a href="https://www.php.net/" title="PHP官网">PHP官网</a>','<br>';
    echo '<a href=\'https://www.php.net/\' title=\'PHP官网\'>PHP官网</a>','<br>';
    echo '文件保存在c:\\';   //文件保存在c:\
?>

字符串定界符

  1. <<<开头,后面跟的是标识符,符标识必须前后一致
  2. 字符串定界符的结束符必须顶格写,前面不能有任何的空白字符
  3. 字符串定界符分为两种,heredoc(双引号),nowdoc(单引号)
<?php
// heredoc
$name = 'tom';
echo <<<ABC
$name <br>
<strong>锄禾日当午</strong>
<em>汗滴禾下土</em>
<u>汗滴禾下土</u>
<a href="https://www.php.net/" title="PHP官网">PHP官网</a>
<hr>
ABC;

// nowdoc
echo <<<'ABC'
$name <br>
<strong>锄禾日当午</strong>
<em>汗滴禾下土</em>
<u>汗滴禾下土</u>
<a href='https://www.php.net/' title='PHP官网'>PHP官网</a>
ABC;
?>

2、复合类型

  • 数组

在PHP中数组有两种形式,索引数组和关联数组

  1. 索引数组:用整数做下标,默认从0开始,后面依次加1
  2. 关联数组:用字符串做下标,通过=>符号将下标和值关联起来

例题:数组的声明

<?php
    //1、索引数组的声明
    $stu=array('tom','berry','ketty');
    print_r($stu);
    echo '<hr>';
    echo $stu[0],'<br>';
    echo $stu[1],'<br>';
    echo $stu[2],'<hr>';
    echo "<hr>";
    //2、关联数组
    $emp=array('name'=>'李大海','sex'=>'男','age'=>19);
    print_r($emp);
    echo '<hr>';
    echo $emp['name'],'<br>';
    echo $emp['sex'],'<br>';
    echo $emp['age'];
?>

短数组语法,可以直接通过中括号声明数组

<?php
    $stu=['tom','berry','ketty'];
    var_dump($stu);
?>

二维数组的声明

<?php
    $stu=[
        ['name'=>'tom','sex'=>'男','age'=>22],
        ['name'=>'berry','sex'=>'女','age'=>23]
    ];
    var_dump($stu);
?>

游戏案例

<?php
//王者荣耀  用到了字符串、整型
$heros = [
    "安琪拉" => [
        "皮肤" => ["暗夜萝莉", "玩偶对对碰", "魔法小厨娘"],
        "技能" => [
            "火球术" => [350, 390, 430],
            "混沌火种" => [130, 145, 160],
            "炽热光辉" => [700, 1050, 1400],
        ],
        "语音" => ["知识就是力量", "一不小心就干掉了个大家伙!", "生命就像人家的魔法师~涂涂改改又是一年!"]
    ],
    "亚瑟" => [

    ]
];
?>
  • 对象
    对象(Object)可以用于存储数据。在 PHP 中对象必须声明。首先必须使用 class 关键字声明类对象。类是可以包含属性和方法的结构。然后在类中定义数据类型,在实例化的类中使用数据类型。
    在支持面向对象的语言中,可以把各个具体事物的共同特征和行为抽象成一个实体,称之为一个“类”,而对象是类使用 new 关键字实例化后的结果。
<?php
    class Car  //使用 class 声明一个类对象
    {
        var $color;
        function car($color="black") {
            $this->color = $color;
        }
        function getColor() {
            return $this->color;
        }
    }
    $car = new Car();
    $car->car('red');
    echo $car->getColor();
?>

3、特殊类型

在 PHP 中,有用来专门提供服务或数据的数据类型,它不属于上述标准数据类型中的任意一类,因此也被称为特殊数据类型,主要包括 NULL 和资源数据类型。

  • NULL 在 PHP 中NULL是一种特殊的数据类型,它只有一个值,即 NULL,表示空值(变量没有值),需要注意的是它与空格的意义不同。

当满足下列条件时,变量的值为 NULL:

  1. 变量被指定为 NULL 值;
  2. 变量在没有被赋值前,默认值为 NULL;
  3. 使用 unset() 函数删除一个变量后,这个变量值也为 NULL。
<?php
    $var1=NULL;              	//直接赋值为NULL
    $var2;                  	//未赋值
    $var3="value";
    unset($var3);              	//被销毁
    var_dump($var1);          	//输出NULL    
    var_dump($var2);          	//输出NULL    
    var_dump($var3);          	//输出NULL   
?> 

提醒:在PHP中 null和NULL是一样的,不区分大小写

  • 资源类型 在 PHP 中资源(Resource)同样是一种特殊的数据类型。它主要描述一个 PHP 的扩展资源,例如一个数据库查询(Query)、一个打开的文件句柄(fopen)或一个数据库连接(Database Connection)以及字符流(stream)等扩展类型。
    但是我们并不能直接操作这个变量类型,只能通过专门的函数来使用。
header("content-type:text/html;charset=utf-8");
$file = fopen("test.txt", "rw");//打开test.txt文件
var_dump($file);

4、类型转换

php中变量的数据类型通常不是开发人员设定的,而是根据该变量使用的上下文在运行时决定的。

<?php
    $a = 1;
    var_dump($a);  //int(1)
    //运算后
    $a = $a +2.0;
    var_dump($a); //float(3)
?>

数据类型转换分为自动类型转换和强制类型转换。

1、自动类型转换:当提供的类型和需要的类型不一致的时候会自动进行类型转换。常见有3种转换,分别为转换成布尔型、转换成整型和转换成字符串型。

<?php
    //转换成布尔型
    var_dump(0 == false);
    var_dump(3.14 == false);
    var_dump('abc' == false);
    var_dump(NULL == false);

    //转换成整型
    var_dump('888php' == 888);
    var_dump('php888' == 888);
    var_dump(true + 1);

    //转换成字符串型
    var_dump('true is'. true);
    var_dump('3');
    var_dump('3.14'.15926);
?>

2、强制类型转换

就是在要转换的数据或变量之前加上(数据类型)即可

强转类型 功能描述
(bool) 强转为布尔型
(string) 强转为字符串型
(int) 强转为整型
(float) 强转为浮点型
(array) 强转为数组
(objec) 强转为对象
<?php
    $num1='12';
    //string(2) "12" int(12) float(12) 
    var_dump($num1,(int)$num1,(float)$num1);  
?>

其他类型和布尔之间的转换

规则:0、空为假,非0非空为真

<?php
    var_dump((bool)'abc');	echo '<br>';		//bool(true)  
    var_dump((bool)'');		echo '<br>';		//bool(false) 
    var_dump((bool)'0');	echo '<br>';		//bool(false) 
    var_dump((bool)'0.0');	echo '<br>';		//bool(true) 
    var_dump((bool)'00');	echo '<br>';		//bool(true) 
    var_dump((bool)'false');	echo '<br>';	//bool(true) 
    var_dump((bool)'null');	echo '<br>';		//bool(true) 
    var_dump((bool)1);		echo '<br>';		//bool(true) 
    var_dump((bool)0);		echo '<br>';		//bool(false) 
    var_dump((bool)-10);		echo '<br>';	//bool(true) 
    var_dump((bool)0.0);		echo '<br>';	//bool(false) 
    var_dump((bool)array());	echo '<br>';	//bool(false) 
    var_dump((bool)array(1));	echo '<br>';	//bool(true) 
    var_dump((bool)array(false));	echo '<br>';//bool(true) 
    var_dump((bool)null);	echo '<br>';	    //bool(false) 
?>

常用取整方法

<?php
    //直接取整,舍弃小数,保留整数intval()
    echo intval(10.1);
    echo "<hr>";

    //四舍五入取整round()
    echo round(10.1);
    echo "<br>";
    echo round(10.6);
    echo "<br>";
    echo round(3.14159, 2);
    echo "<hr>";

    //向上取整,有小数就加1,ceil()
    echo ceil(10.1);
    echo "<hr>";

    //向下取整floor()
    echo floor(10.1);
    echo "<br>";
    echo floor(10.6);
?>

三、变量与常量

掌握变量与常量的定义与使用

1、变量

变量就是临时存储值的容器,它可以储存数字、文本、或者一些复杂的数据等。PHP中由计算机操作系统分配好具体的内存空间后,自动将变量与真正的内存地址映射对应。

变量的命名规则
以 $ 符号开头
字母、数字、下划线,第一个字符必须是字母或者下划线

<?php
    //合法变量名
    $a=1;
    $a12_3=1;
    $_abc=1;
    //非法变量名
    $123=1;
    $12Ab=1;
    $a.r=1;
    $好=1;
    $*a=1;
?>

因为 PHP 是一种弱类型的语言,所以使用变量前不用提前声明,变量在第一次赋值时会被自动创建,这个原因使得 PHP 的语法和C语言、Java 等强类型语言有很大的不同。
声明 PHP 变量必须使用一个美元符号“$”后面跟变量名来表示,然后再使用“=”给这个变量赋值。如下所示:

<?php
    //变量初始化
    $a = 1;
    $b = "abc";
    $c = true;
    echo $a.', '.$b.', '.$c;
?>

在 PHP 中,为一个变量赋值的方式有三种,分别是直接赋值、拷贝赋值和引用赋值。

<?php
    // 直接赋值
    $name = "PHP基础";
    echo $name;

    //拷贝赋值
    $a = 100;
    $b = $a;    // 将$a的值复制一份,传给$b
    $a = 200;   // 重新为 $a 赋值
    echo '$a = '.$a.', $b = '.$b;

    //引用赋值
    $a = 100;
    $b = &$a;   // 将$a的地址复制一份,传给$b
    $a = 200;   // 重新为 $a 赋值
    echo '$a = '.$a.', $b = '.$b;

    // 只有命名过的变量才可以引用赋值
    // 错误用法
    $c = &(25*5);
?>

变量的作用域 变量的作用范围(可以被使用的范围)称为变量作用域,变量必须在其有效范围内使用,如果超出有效范围,变量就会失去其意义。按作用域可以将 PHP 变量分为全局变量和局部变量两种。

1、局部变量 局部变量就是在函数的内部定义的变量,只能在定义的函数内使用。局部变量会在函数调用结束时自动销毁。

<?php
    function example(){
        $a = "PHP基础学习";  // 在函数内定义变量 a
        echo "局部变量 a 的值为:".$a."<br>";
    }
    example();
    if($a){                  // 在函数外部调用 $a,如果 $a 存在则会打印下面的内容
        echo "在函数外部调用函数内的局部变量 a,其值为:".$a;
    }
?>

静态变量是一个特殊的局部变量。静态变量在初始化之后,会在程序运行期间会一直存在。
使用static 变量 = 值;

<?php
    function demo(){
        static $a;  //定义静态变量
        $b = 0;
        $a++;
        $b++;
        echo '第 '.$a.' 次运行 demo 函数, 局部变量 $b 的值为:'.$b.'<br>';
    }
    demo();
    demo();
    demo();
    demo();
?>

2、全局变量 全局变量就是定义在所有函数以外的变量,其作用域是当前源码的任何地方。在程序运行期间全局变量会一直存在,只有程序结束运行时才会被销毁

<?php
    $a = "PHP基础学习";      // 在函数外部定义全局变量 a
    function example(){
        if($a){
            echo "在函数内部调用全局变量 a,其值为:".$a;
        }
    }
    example();
    echo "在函数外部调用全局变量 a,其值为:".$a;
?>

在函数中使用全局变量必须使用global关键字先声明,global 关键字只能用来引用函数外部的全局变量,在引用时不能直接赋值,赋值和声明语句需要分开写.

<?php
    $a = 1;
    $b = 2;
    $c = 3;
    function demo(){
        global $a, $b;
        echo "变量 a:".$a;
        echo "<br>变量 b:".$b;
        echo "<br>变量 c:".$c;
    }
    demo();
?>

与 global 关键字功能类似的还有 $GLOBALS, $GLOBALS 是一个预定义的超全局数组,其中包含了全局作用域中的所有可用变量,变量的名字就是数组的键。 $GLOBALS 中并不包含函数中的局部变量和静态变量。

<?php
    $a = 1;
    $b = 2;
    $c = 3;
    $name = 'PHP基础';
    function demo(){
        static $str = 'PHP 学习';
        echo "变量 a:".$GLOBALS['a'];
        echo "<br>变量 b:".$GLOBALS['b'];
        echo "<br>变量 c:".$GLOBALS['c'];
    }
    demo();
    var_dump($GLOBALS);
?>

检查变量是否存在 要检查一个变量是否存在,可使用isset()函数。若存在,返回true,否则返回false.

<?php
    $var1="";
    $var2=123;
    var_dump(isset($var1));            		//返回boolean true
    var_dump(isset($var2));            		//返回boolean true
?>

销毁变量 用unset()来销毁变量,销毁的是变量名,变量值由PHP垃圾回收机制销毁.

<?php
    $var1=123;
    unset($var1);
    var_dump($var1);            		//NULL
    var_dump($GLOBALS);
?>
  • 可变变量
    可变变量就是一个变量以另外一个变量的值作为变量名。这种语法形式是 PHP 的特殊语法,其他语言中很少见.
    可变变量使用时可能会出现非法变量名的情况。比如$a = 1,则$$a是非法的。
<?php
    $name="Tom";
    $$name=20;
    echo $$name;                   	//输出20
    echo "${$name}";               	//输出20
    echo $Tom;                     	//输出20
    echo ${"Tom"};                 	//输出20
    $name=123;                      //改变$name的值
?>

可变变量还可以用于数组。使用“{ }”将变量包裹可以让语义更明确,示例代码如下:

<?php
    //理解$$arr[0] 的结果
    $demo = 'PHP基础';
    $test = 'https://www.php.net/';
    $arr = array('demo', 'test');
    echo ${$arr[0]}.'<br>'.${$arr[1]}.'<br>';

    $arr2 = array('PHP 教程', 'PHP 可变变量');
    $str = 'arr2';
    echo ${$str}[0].'<br>'.${$str}[1];
?>
  • 预定义变量
    预定义变量又叫超全局变量,它们不需要提前声明就可以在所有的作用域中使用。通过这些预定义变量可以获取用户会话、用户操作系统的环境和本地操作系统的环境等信息。
    预定义变量 描述
    $GLOBALS 全局作用域中的全部可用变量
    $_SERVER 服务器和执行环境的信息
    $_REQUEST 包含了 $_GET,$_POST 和 $_COOKIE 的所有信息
    $_POST 通过 POST 方法提交的数据
    $_GET 通过 GET 方法提交的数据
    $_FILES 通过 POST 方式上传到服务器的文件数据
    $_ENV 通过环境方式传递给当前脚本的变量组成的数组
    $_COOKIE 通过 HTTP Cookies 方式传递给当前脚本的变量所组成的数组
    $_SESSION 当前脚本可用 SESSION 变量组成的数组
<?php
    var_dump($_COOKIE);

    //$_SERVER["SERVER_PORT"]服务端口号
    //$_SERVER["SERVER_NAME"]域名
    //$_SERVER['REMOTE_ADDR']浏览当前页面的用户的 IP 地址
    //$_SERVER['DOCUMENT_ROOT']当前运行脚本所在的文档根目录
    var_dump($_SERVER); 
?>
  • 外部变量
    在程序中定义或自动产生的变量叫内部变量,而由HTML表单、URL或外部程序产生的变量叫外部变量,主要是$_GET,$_POST,$_REQUEST这三个预定义变量.
    课本案列
<!DOCTYPE html>
<html lang="en">
<head>
    <title>外部变量演示</title>
</head>
<body>
    <form action="" method="post">
        学号:<input type="text" name="XH"><br/>
        姓名:<input type="text" name="XM"><br/>
        <input type="submit" name="postmethod" value="POST方法提交">
    </form>
    <form action="" method="get">
        性别:<input type="radio" name="SEX" value="男">
            <input type="radio" name="SEX" value="女"><br/>
        专业:<select name="ZY">
                <option>计算机应用技术</option>
                <option>软件技术</option>
                <option>数字媒体开发</option>
            </select><br/>
            <input type="submit" name="getmethod" value="GET方法提交">
    </form>
</body>
</html>
<?php
    //使用isset()函数判断是否是POST方法提交
    if(isset($_POST['postmethod'])){
        $xh = $_POST['XH'];
        $xm = $_POST['XM'];
        echo "接收POST变量:<br/>";
        echo "学号:".$xh."<br/>";
        echo "姓名:".$xm."<br/>";
        echo "<hr>";
    }
    //使用isset()函数判断是否是GET方法提交
    if(isset($_GET['SEX'])){
        $sex = $_GET['SEX'];
        $zy = $_GET['ZY'];
        echo "接收GET变量:<br/>";
        echo "性别:".$sex."<br/>";
        echo "专业:".$zy."<br/>";
        echo "<hr>";
    }
    echo "接收REQUEST变量:<br/>";
    echo "学号:".@$_REQUEST['XH']."<br/>";
    echo "姓名:".@$_REQUEST['XM']."<br/>";
    echo "性别:".@$_REQUEST['SEX']."<br/>";
    echo "专业:".@$_REQUEST['ZY']."<br/>";
?>

2、常量

常量就是不能改变的量,PHP 中常量一旦被定义,就不能被修改或取消定义。

与变量相比,常量具有以下几个特点:

  1. 常量前面没有美元符号($);
  2. 常量只能用 define() 和 const 定义;
  3. 常量的作用域是全局的;
  4. 常量一旦被定义就不能被重新定义或者取消定义。

定义常量

<?php
    define('WebSite', 'PHP官网');
    const url = 'https://www.php.net/';  //不能在函数、循环、if语句之内用const来定义
    echo WebSite.'<br>';
    echo url;
?>

获取常量的值
想要获取常量的值,除了可以直接使用常量名外,还可以使用 constant() 函数,使用函数和直接使用常量名的效果是一样的。

<?php
    define('WebSite', 'PHP官网');
    const url = 'https://www.php.net/';
    $website = 'WebSite';
    $url = 'url';
    echo constant($website).'<br>';
    echo constant($url);
?>

判断常量是否存在 要判断一个常量是否已经定义,使用 defined() 函数,已定义则返回 true,未定义则返回 false。

<?php
    define('WebSite', 'PHP官网');
    const url = 'https://www.php.net/';
    var_dump(defined('WebSite'));
    echo '<br>';
    var_dump(defined('url'));
?>
  • 预定义常量
    预定义常量顾名思义也就是 PHP 中预先定义好的常量,使用这些预定义常量可以帮助我们来获取一些 PHP 中的信息,比如,我们可以使用预定义常量来获取当前电脑的操作系统,当前使用的 PHP 版本信息等等。另外需要注意的是预定义常量是区分大小写的。

    预定义常量 描述
    PHP_VERSION 当前 PHP 的版本号
    PHP_OS 当前 当前的操作系统名称
    PHP_EOL 系统换行符,Windows 是(\r\n),Linux 是(\n),MAC 是(\r)
    PHP_INT_MAX 当前 PHP 支持的最大整数
    PHP_INT_MIN 当前 PHP 支持的最小整数
    PHP_EXTENSION_DIR PHP 的扩展目录
    TRUE 布尔类型的 true
    FALSE 布尔类型的 false
    NULL Null
  • 魔术常量 魔术常量属于特殊的预定义常量,这些常量可以根据它们的使用位置而变化。魔术常量通常以两个下划线__开头,并以两个下划线__结尾。魔术常量不区分大小写

    魔术常量 描述
    __LINE__ 文件中的当前行号。
    __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
    __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。
    __FUNCTION__ 当前函数的名称。匿名函数则为 {closure}。
    __CLASS__ 当前类的名称。类名包括其被声明的作用域(例如 Foo\Bar)。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
    __TRAIT__ Trait 的名字。Trait 名包括其被声明的作用域(例如 Foo\Bar)。
    __METHOD__ 类的方法名。
    __NAMESPACE__ 当前命名空间的名称。
    ClassName::class 完整的类名。
<?php
    echo "当前文件的路径:".__FILE__;
    echo "<br/>当前的行数:".__LINE__;
    echo "<br/>当前PHP的版本信息:".PHP_VERSION;
    echo "<br/>当前的操作系统:".PHP_OS;
    echo "<br/>当前的操作系统:".php_os;
    echo "<br/>当前的行数:".__line__;
?>

四、运算符与表达式

掌握运算符和表达式的使用

运算符是指通过一个或多个表达式来产生另外一个值的某些符号,如“+”、“%”、“.”等都是运算符。

1、算术运算符

算术运算符是处理四则运算(加、减、乘、除四种运算)的符号,在数字的处理中应用得最多。常用的算术运算符如下表所示。

名称 操作符 举例
加法运算 + $a+$b
减法运算 - $a-$b
乘法运算 * $a*$b
除法运算 / $a/$b
取余数运算 % $a%$b
取反运算 - -$a
<?php
    $a=10;
    $b=3;
    echo $num=$a+$b;                 	//加法,$num值为13
    echo $num=$a-$b;                	//减法,$num值为7
    echo $num=$a*$b;                	//乘法,$num值为30
    echo $num=$a/$b;                	//除法,$num值为3.333333…
    echo $num=$a%$b;                	//取模,$num值为1
    echo $num=-$a;                    	//取反,$num值为-10
?>

2、赋值运算符

赋值运算符是把基本赋值运算符“=”右边的值赋给左边的变量,最基本的赋值运算符是“=”,用于对变量进行赋值操作,而其他运算符可以和赋值运算符“=”联合使用,构成组合赋值运算符。

操作 符号 举例 展开形式 意义
赋值 = $a = 1 $a = 1 将右边表达式的值赋给左边的变量
+= $a += 1 $a = $a + 1 相加并把值赋给左边的变量
-= $a -= 1 $a = $a - 1 相减并把值赋给左边的交量
*= $a *= 1 $a = $a * 1 相乘并把值赋给左边的变量
/= $a /= 1 $a = $a / 1 相除并把值赋给左边的变量
拼接字符 .= $a .= ‘1’ $a = $a .‘1’ 将右边的字符追加到左边
取余数 %= $a %= 1 $a = $a % 1 求模,并将结果赋给左边的变量
<?php
    $a=10;
    $b=3;
    echo $num=$a+$b;        	//将$a+$b的结果值赋给$num,$num值为13
    echo $num=($c=6)+4;        	//$c的值为6,$num的值为10
    echo $a+=6;            		//等同于$a=$a+6,$a赋值为16
    echo $b-=2;            		//等同于$b=$b-2,$b赋值为1
    echo $a*=2;            		//等同于$a=$a*2,$a赋值为32
    echo $b/=0.5;            	//等同于$b=$b/0.5,$b赋值为2
    
    $string="连接";
    //等同于$string=$string."字符串",$string赋值为"连接字符串"
    echo $string.="字符串";    	
?>

3、位运算符

位运算符是指将二进制位从低位到高位对齐后进行运算。专门针对数字0和1进行操作。

运算符 运算 例子 结果
& 按位与 $a & $b 将$a和$b中都为1的位设为1
| 按位或 $a | $b 将$a和$b中为1的位设为1
~ 按位非 ~$a 将$a为1的位设为0, 为0的设为1
^ 按位异或 $a ^ $b 将$a和$b中不同位设为1
« 左移 $a « $b 将$a的位向左移动$b次
» 右移 $a » $b 将$a的位向右移动$b次
<?php
    $m = 8;
    $n = 12;
    echo '$m = '.$m.', $n = '.$n.'<br>';
    echo '$m & $n = '.($m & $n).'<br>';
    echo '$m | $n = '.($m | $n).'<br>';
    echo '$m ^ $n = '.($m ^ $n).'<br>';
    echo '~ $m = '.(~$m).'<br>';
    echo '$m << $n = '.($m << $n).'<br>';
    echo '$m >> $n = '.($m >> $n);
?>

4、比较运算符

比较运算符就是对变量或表达式的结果进行大小、真假等比较,如果比较结果为真,则返回 true;如果为假,则返回 false。

我们要重点区分一下“等于”和“全等”,等于==只是对两个变量的值进行了比较运算,而全等===不仅会对运算符两边表达式的值进行比较,而且还会对数据类型进行比较,只有两边的值和数据类型都相等时,运算结果才是 TRUE。

<?php
    $a = 10;
    $b = '10';
    if($a == $b){
        echo '$a 和 $b 的值相等!<br>';
        if($a === $b){
            echo '$a 和 $b 的类型也相等!<br>';
        }else{
            echo '$a 和 $b 的类型不相等!<br>';
        }
    }else{
        echo '$a 和 $b 的值不相等!<br>';
    }
?>

5、逻辑运算符

符号 描述
&& 短路与:如果前面的条件不满足,后面的条件就不用计算了
|| 短路或
!

“&&”或“and” 逻辑与

<?php
    $age = 21;
    if($age >= 18 && $age <= 25){
        echo '符合当兵条件!';
    }else{
        echo '不符合当兵条件!';
    }
?>

“||”或“or” 逻辑或

<?php
    $age = 21;
    if($age < 18 || $age > 25){
        echo '不符合当兵条件!';
    }else{
        echo '符合当兵条件!';
    }
?>

“!” 逻辑非

<?php
    $age = 21;
    if(!($age < 18 || $age > 25)){
        echo '符合当兵条件!';
    }else{
        echo '不符合当兵条件!';
    }
?>

6、错误控制运算符

PHP的错误控制运算符使用@符号表示,把它放在一个PHP表达式之前,将忽略该表达式可能产品的任何错误信息。

<?php
    echo @$a;            		//变量$a未定义,不加@会显示NOTICE信息
    $a = "Hello!";
    echo $a;            		//输出"Hello!"
    $b = @test();        		//忽略调用test()函数时产生的错误信息
    $con = @mysql_conncet("localhost","username","pwd");	//忽略连接mysql数据库出错产生的错误信息
?>

7、条件运算符

条件运算符 又是 三元运算符,功能与“if else”语句一致,它可以在一行中书写,代码精练、执行效率更高。在 PHP 程序中恰当地使用三元运算符能够让脚本更为简洁、高效。 语法:表达式?值1:值2
表达式的值为true,返回值1,否则返回值2

练习

<?php
    $num=11;
    echo $num%2?'奇数':'偶数';
    echo "<hr/>";
    //消费满100减10的优惠程序
    $sj_cost = 102;
    $zh_cost = $sj_cost >100 ? $sj_cost -10 : $sj_cost;
    echo "实际消费".$sj_cost."元,请缴费". $zh_cost."元";

同时三元运算符还可以嵌套使用,示例如下所示例:

<?php
    $a = 10;
    $b = 6;
    $c = 12;
    $x = $a>$b ? ($a<$c ? $c-$a : $a-$c) : ($b<$c ? $c-$b : $b-$c);
    echo '$x ='.$x;
?>

嵌套使用的三元运算符虽然可以节省很多代码,但是可读性不太好,日后代码维护起来也很不方便,所以像这种情况我们尽量使用 if else 语句来实现。

8、递增/递减运算符

递增、递减有两个形式,一种是++$,一种是$++。这两者的主要区别在于运算过程,前者是先把变量的值加1,再将新值赋给变量,后者是先返回变量的值,再将变量中的值加1.

++前置:先自增再运算
后置++:先运算再自增

练习

<?php
$num=10;
$num++;
echo $num;	//11
$num=10;
echo $num++;   //10
$num=10;
echo ++$num;   //11

练习

<?php
$num=5;
echo (++$num)+(++$num)+(++$num);	//21

$num=5;
echo ($num++)+($num++)+($num++);	//18

9、字符串运算符

字符串运算符只有一个,即英文的句号“.”,它可以将两个字符串连接起来,拼接成一个新的字符串。其他语言字符串连接是"+",PHP 里的“+”只能用作赋值运算符,而不能用作字符串运算符。

<?php
    $a="Hello ";
    $b="World";
    echo $a.$b;                			//输出'Hello World'
    $a.= "World";                       //与赋值运算符组合
    echo $a;                		    //输出'Hello World'
?>

10、其他运算符

例子 名称 结果
$a + $b 联合 $a 和 $b 的联合。
$a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 true。
$a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 true。
$a != $b 不等 如果 $a 不等于 $b 则为 true。
$a <> $b 不等 如果 $a 不等于 $b 则为 true。
$a !== $b 不全等 如果 $a 不全等于 $b 则为 true。
<?php
$a = array("a" => "苹果", "b" => "香蕉");
$b = array("a" => "梨子", "b" => "橘子", "c" => "樱桃");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);

$a += $b; // Union of $a += $b is $a and $b
echo "Union of \$a += \$b: \n";
var_dump($a);
?>

11、运算符优先级和结合性

  • 同一行的运算符具有相同的优先级
  • 左结合方向表示同级运算符的执行顺序为从左到右
  • 右结合方向则表示执行顺序为从右到左
  • 圆括号()优先级别最高。
<?php
$x = 4;
echo @"计算 4 - 1的结果是: " . $x-1 . ",这是后面的部分<br>";
echo @(("计算 4 - 1的结果是: " . $x) - 1) . ",这是后面的部分<br>";
echo "计算 4 - 1的结果是: " . ($x-1) . ",这是后面的部分<br>";
?>

1< 2 < 3这样的表达式,在数学上是成立的,但是在PHP中是非法的,正确的表达式写法是 1 < 2 && 2 < 3

在我们熟悉了 PHP 运算优先级的前提下,最好在书写运算符的时候,以小括号来标记优先级,这样可以使我们的代码可读性更强,也是一个良好的编程习惯。

12、表达式

在PHP中,任何有值的内容都可以理解为表达式。

<?php
    //表达式
    $a = 1;
    $b = $a;
    var_dump($a);

    //非表达式
    //break;
    //for;
    //class;
?>

五、综合案例

1、获取用户登录表单中的用户名和密码,如果用户名为"admin",密码为"123456",则提示登录成功

<!DOCTYPE html>
<html lang="en">
<head>
    <title>用户登录</title>
</head>
<body>
    <form action="" method="post">
    <fieldset>
        <legend>用户登录表单</legend>
        用户名:<input type="text" name="username"/>
        密码:<input type="password" name="password"/>
        <input type="submit" name="submit" value="登录">
        <input type="reset" name="submit2" value="重置">
    </fieldset>
    </form>
</body>
</html>
<?php
if(isset($_POST['submit'])){
    $username = $_POST['username'];
    $password = $_POST['password'];
    if($username == 'admin' && $password == '123456'){
        echo "<script>alert('登录成功')</script>";
    } else {
        echo "<script>alert('登录失败')</script>";
    }
}
?>

2、计算圆形和梯形面积,要求分别使用POST方法和GET方法接收圆的半径和梯形的上底、下底、高

<!DOCTYPE html>
<html lang="en">
<head>
    <title>面积计算</title>
</head>
<body>
    <form action="" method="post">
        请输入圆的半径:<input type="text" name="R"><br/>
        <input type="submit" name="postmethod" value="POST方法提交">
    </form>
    <form action="" method="get">
        请输入梯形的上底:<input type="text" name="A"><br/>
        请输入梯形的下底:<input type="text" name="B"><br/>
        请输入梯形的高:<input type="text" name="H"><br/>
        <input type="submit" name="getmethod" value="GET方法提交">
    </form>
</body>
</html>
<?php
    define("PI", 3.1415926);
    if(isset($_POST['postmethod'])){
        $r = $_POST['R'];
        $C_area = PI * $r * $r;
        echo "接收POST变量:<br/>";
        echo "圆的面积为:".$C_area."<br/>";
    }

    if(isset($_GET['getmethod'])){
        $a = $_GET['A'];
        $b = $_GET['B'];
        $h = $_GET['H'];
        $T_area = ($a + $b) * $h /2.0;
        echo "接收GET变量:<br/>";
        echo "梯形的面积为:".$T_area."<br/>";
    }
?>

关注微信公众号,与我交流吧~

分享