1、基本语法

  1. <?php
  2. echo 'hello world';
  3. // 如果文档中只有PHP代码,结束标记要省略掉
    <?php
        echo "12345";
        // 如果文档中不只有PHP代码,要保证标记成对出现,可以出现在任意位置,出现多次都可以
        # 注释
        /*注释*/
    ?>
    /*
        PHP文档的组成:
            PHP代码,
            HTML,
            css,
            JavaScript/jquery
        PHP的语法规范:
            需要以;进行结束
        PHP的注释:
            //   c++风格
            #    shell风格 
        在源代码中看不到注释,只有在源文件中能看到 
    */

2、变量和数据类型

2.1 变量

    <?php
        // 1、什么是变量? - 在程序执行期间可以变化的量(通过变量保存值)
        // 2、声明变量 - 通过$符号加上一个变量名称来表示变量(可以声明一个,也可以声明多个)
        $username='szr';
        $age=23;
        $email='szr190@163.com';
        $tel=1210288348;
        $marry=true;
        $var;
        /*
            注意:
            (1)以字母或者下划线开始,不能出现特殊字符
            (2)最好含义明确
            (3)命名的时候最好遵守驼峰或者下划线命名法
            (4)严格区分大小写
            (5)出现变量重复,会进行覆盖
            (6)php是弱类型语言,变量可以不声明直接使用
        */ 
        // 驼峰
        $firstName;
        $FirstName;
        // 下划线
        $first_name;

        // 使用变量直接使用变量的名称即可

        // 可变变量的例子
        $i='j';
        $j='k';
        $k='hello world';
        echo $$$i;
    ?>

2.2 整型 / 浮点型 / 布尔型

    <?php
        // php中的数据类型
        /*
            8种主要数据类型
                标量类型(只能存储单一数据) - 整型、浮点型、布尔型、字符串型
                复合类型 - 数组(Array)、对象(Object)
                特殊类型 - 资源、空(null)
        */ 

        // 整型
        // $var=123;
        // $var = -12;
        $var = 0123;//涉及到了进制的转换
        $a = 12;
        echo $var;
        echo "<br/>";
        var_dump($var,$a);//打印变量的详细信息,可以一次打印一个或者多个

        // 浮点型
        // $float=12.3;
        // $float=-12.3;
        // 科学计数法的形式
        $float=2e3;//2乘以10的3次方 2000
        var_dump($float);

        // 布尔型
        // $bool=true;
        $bool=TRUE;
        var_dump($bool);
    ?>

2.3 字符串类型

    <?php
        // 设置文档类型和字符编码
        header('content-type:text/html,charset=utf-8');

        // 数据类型 - 字符串型
        // 定界符 '' ""
        // 单引号不解析变量,而双引号是解析变量的
        $num=1;
        $userName = 'king,$num';
        $email="1210288348@qq.com,$num"; 
        $string='';//空字符串也是字符串,length表示长度
        var_dump($userName);
        echo $userName,$email,$string;
        echo "<br/>";

        // 转义符
        /*
            \n(换行) \r(回车) \t(水平制表符) \' \" \\
        */ 
        $str='I\'am a boy student \\';
        var_dump($str);
        // 单引号只解析\'和\\,而双引号所有转义符都解析
        echo "<br/>";
        $name = 'szr';
        echo "我的名字是$name这是我";
        // {}的用法
        // {}可以将PHP中的变量扩成一个整体来解析
        echo "我的名字是{$name}这是我";//PHP在解析变量的时候会尽可能的往后取,认为越往后越合法
        echo "我的名字是${name}这是我";
        echo "<br/>";
        // {}可以对字符串中的指定字符做增删改查的操作
        // 下标从0开始
        $string='abcdef';
        echo $string{0};
        echo $string{3};
        echo "<br/>";
        // 修改的时候只能一对一的进行修改,不要对中文字符做操作
        $string{1}='z';
        echo $string;
        echo "<br/>";
        // 删除的时候相当于拿空字符串进行替换
        $string2='bcdfekhi';
        $string2{3}='';
        echo $string2;
        echo "<br/>";
        // 添加字符,一次添加一个
        $string3='abc';
        $string3{5}='d';//会有空格展示
        echo $string3;
    ?>

2.4 heredoc / nowdoc

    <?php
        // heredoc  - 相当于双引号 - 在结束名称之前不能有任何的输出
        // 用""来写
        $id=2;
        $username='jerry';
        $email='szr190@163.com';
        $str="<table border='1'>
            <tr>
                <td>编号</td>
                <td>用户名</td>
                <td>邮箱</td>
            <tr>
            <tr>
                <td>{$id}</td>
                <td>{$username}</td>
                <td>{$email}</td>
            <tr>
        </table>";

        // 用heredoc
        $str1 = <<<ET
    heredoc test!!!
    ET;
    echo $str1;

        $str2=<<<"TABLE"
        <table border='1'>
        <tr>
            <td>编号</td>
            <td>用户名</td>
            <td>邮箱</td>
        <tr>
        <tr>
            <td>{$id}</td>
            <td>{$username}</td>
            <td>{$email}</td>
        <tr>
    </table>
    TABLE;

    echo $str2;

    // nowdoc - 相当于单引号的作用 - 其余的用法和heredoc一致

2.5 复合类型 / 特殊类型

    <?php
        // 设置错误级别,E_ALL但是除了NOTICE
        error_reporting(E_ALL&~E_NOTICE);

        // 复合类型
        // 声明一个数组
        $arr=array();
        var_dump($arr);
        $arr=array('12','king',true,1.2);
        var_dump($arr);
        // 对象
        $obj=new stdClass();
        var_dump($obj);


        // 特殊类型
        // 资源(Resource) - 是需要数据库来操纵的
        // 空(null)
        // 1.变量未声明直接使用
        $var1;
        var_dump($var1);
        // 2.声明一个变量赋值为null
        // 3.经过unset()注销过的变量
        $var2=123;
        unset($var2);
        var_dump($var2);
    ?>

2.6 数据类型转换之自动转换

    <?php
        // PHP数据类型转换
        // 1、自动转换(隐式转换) - 程序会根据上下文环境自动进行转换
        // 其它类型转换成数值型
        $a=1+true;
        echo $a;//2
        echo "<br/>";
        $b=1+false;
        echo $b;//1
        echo "<br/>";
        $c=1+null;
        echo $c;//1
        echo "<br/>";
        $d=1+'3king';
        echo $d;//4
        echo "<br/>";
        $e=1+'2a3b4d';//只取到了合法部分
        echo $e;//3
        echo "<br/>";
        $f=1+'true';//需要以合法字符开始,否则直接置为0
        echo $f;//1

        echo "<br/>";
        // 其它类型转换成字符串型
        echo true;//1
        echo false;//空字符串
        echo null;//空字符串
        $arr=array();
        echo $arr;
            // 对象不能直接转换成字符串,会报致命错误

        echo "<br/>";
        // 其它类型转换成布尔型
        // 列举出哪些是假的情况,其余都是true
        if(""){
            echo "I am Jerry";
        }else{
            echo "I am Szr";
        }
        // 0 -> false
        // 0.0 -> false
        // 空字符串 '' "" '0' "0" -> false
        // null -> false
        // 空数组 -> false

    ?>

2.7 数据类型转换之临时转换

    <?php
        // 数据类型转换之临时转换,属于强制转换 - (不改变本身,只是临时)
        // 方式1:变量类型$变量名称
        $var = true;
        $res=(int)$var;
        var_dump($res);//1

        echo "<br/>";

        $var1=3.6;
        var_dump((string)$var1,(bool)$var1,(unset)$var1,(object)$var1);

        echo "<br/>";

        // 方式2:通过系统函数实现
        $var2=11;
        var_dump(floatval($var2),strval($var2));
        echo "<br/>";
    ?>

2.8 数据类型转换之永久转换

    <?php
        // 数据类型转换之永久转换,属于强制转换
        // settype($var,$type) - 设置变量的类型
        $v = 123;
        settype($v,'boolean');
        var_dump($v);

        // gettype($var) - 返回变量的类型
        $var = true;
        var_dump(gettype($var));

        echo "<br/>";
    ?>

2.9 函数库检测数据类型

        <?php
        // 通过变量函数库来检测变量的类型
        // is_init()
        // is_float()
        // is_string()
        // is_bool()
        // is_scalar() 检测是否是标量
        // is_null() 检测是否为空
        // is_array() 检测是否为数组
        // is_object() 检测是否是对象

        $var=0;
        var_dump(
            is_int($var),
            is_float($var),
            is_bool($var),
            is_null($var)
        );
    ?>

3、常量

3.1 系统常量和自定义常量

    <?php
        // 什么是常量 :是一个简单值的标识符,一旦定义在脚本定义期间是不可以改变的
        // 系统常量(拿来就可以直接使用的,系统提供的)
        echo PHP_VERSION;//版本
        echo "<br/>";
        echo PHP_OS;//运行系统
        echo "<br/>";
        echo PHP_INT_MAX;//整数的最大值
        echo "<br/>";
        // 自定义常量
        // 1、如何定义常量
        // (1)define($name,$value);
        /*
            需要注意:
                - 常量名称不加$
                - 默认区分大小写
                - 名称最好大写
                - 常量作用域是全局的
                - 在脚本期间是不能改变的
                - 可以是标量类型,也可以是数组
        */ 
        define('TEST',123);
        define('USERNAME','Jerry');
        // (2)const关键字定义常量
        const ZERO = 'Szr';
        const WEB_LOG_URL='http://szr190.com';
        echo ZERO;
        echo "<br/>";

        // 2、使用常量
        // (1) 直接使用常量的名称
        echo TEST;
        echo "<br/>";
        // (2) 使用constant获取常量的值
        echo constant('TEST');
        echo "<br/>";

        // 3、如何判断常量是否存在
        var_dump(defined('TEST'));

        // 4、获取所有已经定义的常量
        $var = get_defined_constants();
        print_r($var);
    ?>

3.2 魔术常量

    <?php
        // 魔术常量
        /*
            __LINE__ 得到当前的行号
            __FILE__ 得到当前文件的完整绝对路径和文件名
            __DIR__ 得到文件的完整绝对路径
        */ 
        echo __LINE__;
        echo "<br/>";
        echo __FILE__;
        echo "<br/>";
        echo __DIR__;
        echo "<br/>";
    ?>

3.3 $_POST

    <?php
        // 预定义变量
        // 1、概念:PHP提供给大家直接就可以使用的变量,所有的预定义变量都是全局变量
        // 2、分类
        /*
            $GLOBALS 超全局变量(包含以下所有的预定义变量)
            $_SERVERS 服务器和执行环境信息变量
            $_ENV 环境变量
            $_COOKIE
            $_SESSION
            $_FILES
            $_GET 主要接收以?形式传递的数据,像表单以get形式发送数据,包括像超链接典型的?形式传递参数
            $_POST 主要接收表单以post形式发送的数据
            $_REQUEST = $_POST + $_GET + $_COOKIE;
        */ 
        header('content-type:text/html;charset=utf-8');
        echo $_POST['username'];
        echo "<br/>";
        echo $_POST['password'];
        echo "<br/>";
        echo $_POST['email'];
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>注册页面</title>
    </head>
    <body>
        <form action="doReg.php" method="post">
            <table border="1" width="70%" cellpadding="0" cellspacing="0">
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="username" placeholder="请输入用户名"></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="password" placeholder="请输入密码"></td>
                </tr>
                <tr>
                    <td>邮箱:</td>
                    <td><input type="email" name="email" placeholder="请输入合法邮箱"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="立即注册"></td>
                </tr>
            </table>
        </form>
    </body>
    </html>

3.4 $_GET

    <?php
        // 接收以?传参的数据,需要以$_GET
        $key=$_GET['keywords'];
        echo $key;
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
    </head>
    <body>
        <h1>搜索</h1>
        <form action="doSearch.php" method="get">
            <input type="search" placeholder="请输入您要搜索的内容" name="keywords">
            <input type="submit" value="搜索">
        </form>
    </body>
    </html>

3.5 超链接参数传递

    <?php
        echo $_GET['username'];
        echo "<br/>";
        echo $_GET['age'];
        echo "<br/>";
        echo $_GET['a'];
        echo "<br/>";
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <a href="doTest.php?username=king&age=12&a=1&b=2&c=3">Test</a>
    </body>
    </html>

4、运算符

4.1 算术运算符

    <?php
        // 什么是表达式?只要是有值的东西都叫做表达式 
        // PHP运算符 - 算术运算符
        // + - * / % 
        $a=3;
        $b=5;
        echo $a+$b;
        echo "<br/>";
        echo $a-$b;
        echo "<br/>";
        echo $a*$b;
        echo "<br/>";
        echo $a/$b;
        echo "<br/>";
        echo $a%$b;
    ?>

4.2 递增递减运算符

    <?php
        // 递增递减运算符
        // 1、前缀形式 ++$var; --$var; 先加减,再执行
        $i=1;
        ++$i;
        echo $i;//2

        echo "<br/>";
        // 2、后缀形式 $var++; $var--; 先执行,再加减
        $j=5;
        $j--;
        echo $j;//4

        echo "<br/>";
        // 3、注意点
        // (1)浮点型是支持递增递减的
        $var = 1.2;
        $var++;
        echo $var;
        echo "<br/>";
        // (2)布尔型是不支持递增递减的
        $var1=true;
        $var++;
        echo $var1;//1
        echo "<br/>";
        // (3)null是支持递增的,但是不支持递减
        $var2=null;
        // $var2++;
        // echo $var2;//1
        $var2--;
        echo $var2;//null
        echo "<br/>";
        // (4)字符串是支持递增的,但是不支持递减
        $var3="a";
        // $var3++;
        // echo $var3;//b
        $var3--;
        echo $var3;
        echo "<br/>";

        // 4、ASCII值
        $str='a';
        // (1)根据字符得到相应的码值
        echo ord($str);//97
        echo "<br/>";
        // (2)根据码值得到相应的字符
        echo chr(98);//b
    ?>

4.3 字符连接符

    <?php
        // 字符连接符 .来连接字符串
        echo 'a'.'b'.'c';//abc

        echo "<br/>";
        $str1='g';
        $str2='h';
        $str3=$str1.$str2;
        echo $str3;//gh
    ?>

4.4 赋值运算符

    <?php
        // 赋值运算符
        // = += -= *= /= .= %=
        $a=1;
        $a+=2;
        echo $a;//3
        echo "<br/>";

        $username='szr';
        echo $username.'king';//szrking

        echo "<br/>";
        // mt_rand() 产生随机数
        echo mt_rand(1,10);
    ?>

4.5 比较运算符

    <?php
        // 比较运算符
        // 类型都是布尔类型,不是true就是false
        // 具体见图片(比较.png)
        var_dump(
            3>1,
            2<4,
            '2'==2,
            '2'===2,//需要类型也是一致的
            1<>2//不等于
        );
    ?>

4.6 逻辑运算符和错误抑制符

    <?php
        // 逻辑运算符 - 结果也是布尔类型
        // && and (与) - 都为true才为true
        // || - 一个为true就为true
        // !- 取反
        // xor - 异或(不同为) true xor true = false

        var_dump(
            true && true,
            true && false
        );

        var_dump(
            true || true,
            true ||false,
            false || false,
            true xor true//false
        );

        $i=1;
        $j=0;
        var_dump(
            !0,//true
            ++$absnndnsk && --$sdsfdf,//false
            --$i || --$j//true
        );

        // 错误抑制符 - @
        $var = 123;
        @settype($var,'king');
    ?>

4.7 三元运算符和优先级

    <?php
        // 三元运算符
        // exp1?exp2:exp3 如果exp1为true,执行?之后的exp2,否则执行:之后exp3

        echo 1>3?"yes":"no";//no

        // 运算符的优先级 - 通过()去改变;有短路的情况优先考虑短路情况
    ?>

5、流程控制

5.1 流程控制之条件语句

    <?php
        // 流程控制语句之条件语句
        if(1<3) echo "yes";
        echo "<br/>";
        if(4>5){
            echo "yyyy";
        }else if(5<4){
            echo "nnnn";
        }else{
            // if嵌套
            if(1==="1"){
                echo "ynynyn";
            }else{
                echo "111111";
            }
        }
    ?>

5.2 流程控制之switch case

    <?php
        // switch...case
        $var=12;
        switch($var){
            case 10:
                echo "111";
                break;
            case 11:
                echo "222";
                break;
            case 12:
                echo "333";
                break;
            default:
                echo "444";
        }
    ?>

5.3 流程控制之for循环

    <?php
        // for循环
        /*
            for(1;2;3){
                循环体;
            }
            1 - 初始化赋值,无条件的执行第一个表达式
            2 - 在每次循环开始前求值,看是否为true,若是执行循环体,否则循环结束
            3 - 做求值操作(增/减量操作)

            重复的事情或者有规律的事情要想到用循环
        */ 
        for($i=1;$i<=100;$i++){
            echo $i;//1-100
            echo "<br/>";
        }
        echo 'continue...<br/>';
        echo $i,"<br/>";//101

        // 输出h1-h6
        for($m=1;$m<=6;$m++){
            echo "<h{$m}>Hello PHP</h{$m}>";
        }

        // 输出1-100之间的奇数
        for($n=1;$n<=100;$n++){
            if($n%2==1){
                echo $n,"<br/>";
            }
        }

        // for循环的特殊形式

        // (1)死循环
        // for($s=1;$s>=0;$s++){
        //     echo $s,"<br/>";
        // }
        // 如果写了死循环可以通过break结束for语句
        for($s=1;$s>=0;$s++){
            if($s>10){
                break;
            }
            if($s==3){
                // continue 是跳过当次循环进入下一次,可以应用于for,while,do...while
                continue;//就是少了3
            }
            echo $s,"<br/>";
        }

        // (2)嵌套的for结构
        for($e=1;$e<=3;$e++){
            echo "外部循环执行第'.$e.'次<br/>";
            for($r=1;$r<=2;$r++){
                echo "内层循环执行第'.$r.'次<br/>";
            }
            echo "<hr/>";
        }

        // (3)for循环的第二种展现形式
        for($t=1;$t<=9;$t++):
        echo $t,"<br/>";
        echo "<hr/>";
    endfor;

        // (4)提取到外部的形式 - 当省略第二个表达式的时候永远为真,就又成为死循环了
        $u=1;
        for(;$u<=8;$u++){
            echo $u,"<br/>";
        }

    ?>

5.4 流程控制之while dowhile goto

    <?php
        // while
        /*
            while(条件){
                循环体;
            }
        */ 
        while(false){
            echo "Hello World <br/>";
        }

        // do...while
        /*
            do{
                无条件的先执行一遍循环体
            }while(条件);
        */ 
        do{
            echo "Hello World do <br/>";
        }while(false);

        // goto语句 - 是不可以跳进循环的,但是是可以跳出循环的
        echo "starting.......";
        echo "<hr/>";
        goto TEST;
        echo "this is a test<br/>";

        TEST:
        echo "Hello King";
    ?>