美文网首页MG名冠沐汐技术博客
20170812PHP学习(一)基础语法

20170812PHP学习(一)基础语法

作者: cndaqiang | 来源:发表于2017-08-13 09:57 被阅读51次

    PHP(一)基础语法

    本来就是学习笔记,就不说废话了

    参考

    PHP 手册
    陈惠贞 , 陈俊荣.PHP 7&MySQL跨设备网站开发[M].北京:清华大学出版社,2017
    PHP 教程
    PHP 教程
    PHP中变量的作用范围
    PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理

    简介

    PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。

    PHP 能做很多事。PHP不仅是生成网页,了解更多参考PHP 手册,我主要用来开发网站。

    搭建环境: 网页服务器Apache+PHP7+数据库MySQL
    搭建方法:WAMP

    PHP文件

    • PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
    • PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器,用户看不到php代码
    • PHP 文件的默认文件扩展名是 ".php"

    用文本编辑器创建,拓展名为php的文件,浏览器打开127.0.0.1/...


    创建hello.php

    <?php
    echo hello world
    ?>
    

    1.php标记

    当解析一个文件时,PHP 会寻找起始和结束标记,例如 <?php 和 ?>,而标记之外的内容会被PHP解析器忽略,例如PHP与html混写时,被PHP解析器忽略的部分直接输给浏览器,由浏览器表达

    开始和结束的种类

    1
    <?php
    php代码
    ?> 
    
    2.  
    <script language="php">
    php代码
    </script>
    
    3.  
    <? 
    php代码 
    ?>
    
    4.  
    <%
    php代码
     %> 
    

    注:

    1. 种类1和2总是可以用的,而且推荐使用<?php PHP代码 ?>
    2. php标记和php代码之间最好以空格或回车隔开
    3. 短标记(种类3)仅在通过php.ini配置文件中的指令 short_open_tag打开后才可用,或者在 PHP 编译时加入了 **--enable-short-tags选项。
      ASP风格标记(种类 4)仅在通过php.ini配置文件中的指令 asp_tags打开后才可用。

    2.分号(指令分隔符)

    同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。
    注:

    1. 在一段php代码段(<?php 代码1;代码2;代码3;?>)最后一个代码后面的分号;可省略,即省略代码3后面的分号;
    2. 在php文件的末尾,最后一个php结束标记可不写,但最后一个代码后面的分号必须写
      例如a.php内所有内容
    <?php echo hello; echo hello
    ?> 
    <?php echo hello; echo hello;
    

    3.注释

    PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释

    • 单行注释
    #注释内容
    //注释内容
    
    • 多行注释
    /*注释内容
    注释*/
    

    注:

    • 单行注释仅仅注释到行末或者当前的 PHP 代码块结束标志,也就是说单行注释 #与//能识别php结束标记,即如果注释所在行出现?>则意味着注释结束,同时该php段结束
      不过,</script> 标记在单行注释中不会跳出 PHP 模式。
    • 多行注释不支持嵌套,注释在遇到第一个*/就结束注释,例如
    <?php echo hello; echo hello;
    /* 注释1/* 注释2*/注释 3
    */
    #注释有效范围在第一个*/之间,也就是说注释1和注释2有效,注释3*/会被php解释器当作代码解释,极易发生错误
    ?>
    
    • 注释方式仅在php标记内有效,如果混写html代码时,php外用html注释方式
    <!--注释-->
    

    4.备注

    4.1 php与html的混写

    因为php只解释php标记内的内容,因此可以使 PHP 嵌入到 HTML 文档中去,由浏览器解释html标签

    • 混写示例
      index.php
    <!doctype html>
    <html>
        <head>
            <title>标题</title>
        </head>
        <body>
            <?php
                echo hello
            ?>
        </body>
    </html>
    
    • 使用条件的高级分离术
      PHP 将跳过条件语句未达成的段落,即使该段落位于 PHP 开始和结束标记之外,因此 PHP 会根据条件来忽略html代码。
      例pp.php
    <!doctype html>
    <html>
        <head>
            <title>标题</title>
        </head>
        <body>
            <?php
                if(1)  #if (1)一定成立
                {
            ?>
            <h6>成立部分会显示</h6> 
            <!--php标记外,用html注释方式-->
            <!--分代码两侧为php执行的部分,所以,这部分的html代码会被浏览器接收到-->
            <?php
                }
                else #else肯定不成立了
                {
            ?>
            <h6>不成立的部分不显示</h6>
            <!--php代码执行的部分,html代码也不会被浏览器接收-->
            <?php
                }
            ?>
        </body>
    </html>
    

    输出为

    • 在浏览器上查看网页源端代码时,不会查看到php的源代码,例如上述pp.php生成网页,在浏览器上右键查看源代码为
    <!doctype html>
    <html>
       <head>
           <title>标题</title>
       </head>
       <body>
                   <h6>成立部分会显示</h6> 
           <!--php标记外,用html注释方式-->
           <!--分代码两侧为php执行的部分,所以,这部分的html代码会被浏览器接收到-->
               </body>
    </html>
    

    4.2 php Manual的建议

    • 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图
    • 如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用 <?php ?> 标记以保持符合标准。

    数据类型

    如果想查看某个表达式的值和类型,用 var_dump()

    标量型

    1整数int

    • 十进制0或者非0开头, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)

    2浮点数float

    • 小数,例1.5
    • 指数,例1.5e5 1.5e5

    3布尔bool

    • TRUE或者true,False或flase

    4 字符串

    4.1 单引号
    '字母数字。。。等'
    

    注:

    1. 除\'代表引号,\\代表\,无其他转义字符
    2. 变量$X也不会被替换
    3. 可以录入多行,换行等于空格,如
    echo 'hello
    world'
    
    4.2 双引号
    "字符串 $变量名 等"
    

    1. 变量$X会被替换为变量本身值
    2. 支持转义字符
    3. 单引号不需要转义
    序列 含义
    \n 换行(ASCII 字符集中的 LF 或 0x0A (10))
    \r 回车(ASCII 字符集中的 CR 或 0x0D (13))
    \t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
    \v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
    \e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
    \f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
    \\ 反斜线
    \$ 美元标记
    \" 双引号
    \[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
    \x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
    4.3 heredoc 句法结构

    类似bash中的一样,如下,注结束定界符EOF所在行除了EOF(或者后面有个分号;)外不能有任何其他字符。
    其他语法与双引号"一样

    $y=<<<EOF
    hello
    EOF;
    
    4.4 nowdoc语法

    即在heredoc基础上在开始定界符EOF两侧加上单引号
    语法与单引号'一样

    $y=<<<'EOF'
    hello
    EOF;
    
    4.5 大括号{}的用法

    在双引号的语法中,可以替换变量$x的值

    • 当字符串和变量名相接时可以使用字符串${变量名}字符串结构或者字符串{$变量名}字符串
    • 但是 echo "hello${a}world"不会报错 echo hello${a}world会报错,所以加上引号
    • 只有$紧挨着{时才会被识别,否则正常输出{,可以用{\$来表达{$
    $f='hello';
    echo "{$f}</br>";
    echo "{ $f}</br>";  //{与$之间有空格
    echo "{\$f}</br>";   // \$转义
    

    结果为

    hello
    { hello}
    {$f}
    

    特殊类型

    1. NULL

    UNLL表示一个变量没有值,下列情况的变量被认为是NULL
    被赋值为NULL,尚未被赋值,被 unset()

    var_dump(null);
    var_dump(NULL);
    var_dump($no_define); //随便写的一个没定义的函数
    

    结果为NULL NULL NULL只有类型没有值
    NULL不区分大小写

    2. 资源

    对象

    在后面专门讲

    变量&数组

    1.变量

    • 变量名是区分大小写的
    • 不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型,而且可以随时改变变量的数值、类型
      $this 是一个特殊的变量,它不能被赋值

    1.1定义使用

    $变量名=值
    
    • 变量赋值使用过程中必须有$,即$变量名
    • &$变量名代表变量的地址
    • $$变量1代表以变量1的的值为变量名的变量,例
    $b1=hello;
    $$b1=world;
    echo $hello;    #显示为world,$$b1即为$hello
    

    1.2作用范围

    全局,局部在函数部分细说

    1.3 系统变量

    $this代表当前对象
    魔术变量,后面讲

    1.4 常量

    • 常量使用const 定义,const 常量名=值,定义和使用过程中都没有$,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用

    2数组

    • 数组大小无须声明
    • 数组元素类型不用相同

    2.1定义使用

    • 数组结构
    key key1 key2 key3 ... keyN
    值1 值2 值3 ... 值N

    默认key为0,1,2,3,...,N,与C语言相同$数组名[N],PHP可以自定义key$数组名[key],key为整数或字符串

    • 定义一维数组
    #使用array()函数定义
    $数组名=array(值1,值2,值3);
    $数组名=array(key1=>值1,key2=>值2,key3=>值3);
    
    #直接赋值
    $数组名[key]=值
    
    //例
    $myarray=array('shandong'=>'济南','beijing'=>'北京');
    $myarray['jiangsu']='南京';
    
    • 定义高维数组
      以二维为例
    $数组名=array(KEY1=>array(key1=>值11,key12=>值2,key13=>值3),KEY2=>array(key1=>值21,key2=>值22,key3=>值23))
    

    2.2数组函数

    查表就好了,略

    2.3备注

    对于高维数组,例如二维数组$myarray[0][1]与变量等价,$myarray[0]与数组等价,因此

    $darray[0][0]='hello';
    $darray[1]=100;
    $darray[1][0]=100; //这行是在编辑器里是第39行
    

    报错Warning: Cannot use a scalar value as an array in C:\AppServ\www\ar.php on line 39
    因为$darray[1]=100;这条代码说$darray[1]与变量等价了,那么就不能再利用$darray[1][0],应该和地址之类的有关吧,c语言的东西忘记了

    运算

    算数运算符

    直接算就好了。。。

    字符串运算符

    连接字符串.(就是这个点)

    $a=字符串a.字符串b
    

    .(点)和数字之间要用空格隔开

    比较运算符

    位元算符

    注意& |一个是位运算符,&& ||两个的是逻辑运算符

    逻辑运算符

    条件运算符

    条件表达式 ? 表达式1 : 表达式2
    

    条件表达式位true时返回表达式1的值,false为表达式2

    错误控制运算符@

    @命令
    

    就不会显示错误信息了
    但是@不能加在函数定义,类定义或流程控制等语句前面

    执行运算符-重音符`

    类似bash里面的`

    格式 `shell命令`
    

    $a=`ping 127.0.0.1`;
    echo $a;
    

    流程控制

    if

    表达式两端必须为括号(),即使表达式只有一个数字

    if (表达式)
    {
    命令;
    }
    elseif (表达式) //elseif可以有很多次,也可无
    {
    命令;
    }
    else    //最后为else,也可无
    {
    命令;
    }
    

    switch

    表达式两端必须为括号(),即使表达式只有一个数字
    注意每个case都跟着一个break,不然会执行到break为止

    switch (表达式)
    {
    case 值1:
    命令;
    break;    
    case 值2:
    命令;
    break;
    case 值3:
    命令;
    break;
    default:
    命令;
    }
    

    for

    for (初始条件;判断表达式;循环一次后操作)
    {
    命令;
    }
    

    foreach 结合数组使用

    foreach ($一维数组名 as $value)
    {
    命令
    }
    

    value会依次取遍一维数组里面的值,若是二维数组名,则value每次循环都为字符串Array
    value可自定义为其他变量名

    foreach ($数组名 as $key => $value)
    {
    命令
    }
    

    key和value会依次取一维数组里的key和值,key和值可自定义为其他变量名

    while

    while (表达式)
    {
    命令;
    }
    

    do..while

    while(表达式)最后别忘了分号;

    do
    {
    命令;
    }
    while(表达式);
    

    break continue exit()或者die()

    • break 结束循环
    • continue 返回循环开头
    • exit() 结束循环并返回,同时结束整个程序的执行,后面的代码也不继续执行了
      exit()参数为0~254的整数时,终止网页上不显示信息,整数代表错误码
      exit()参数为字符串时,终止并在网页上显示信息,'8'表示字符串,'表示数字
      exit('文件打开失败')
    • die()与exit()用法一样

    函数

    • 函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯

    1.定义

    function 函数名 ( 输入参数1,输入参数2):返回值类型
    //可无输入参数,可不写返回值类型
    {
    命令;
    return;      //  或return 返回值;
    }
    
    • 输入参数例$x,$y类似matlab,也可为地址&$z,类似c语言
    • 返回值类型(PHP7新功能),不写则默认返回return后面的值,如果写返回值类型,则进行格式转换
    • 函数默认执行到大括号结束处,如果要提早离开函数,可以早使用return语句

    function nam() :bool   //返回类型设置为bool型
    {
        return (int)1; //函数内部返回int型1
    }
    $han=nam();
    echo var_dump($han); 
    //var_dump()函数返回输入参数的类型和值
    //结果为bool(true)返回值类型已由int转为bool
    

    2. 函数的位置

    正常情况下,函数的定义和函数的调用是没有位置要求的
    但是当函数在一些可能不会被执行或者还没执行的{}内时:

    2.1 在函数内定义的函数

    • PHP 中的所有函数和类都具有全局作用域,可以在函数1内定义函数2,然后在其他地方调用这个函数,在函数1外定义函数2,也可以在函数1内调用函数2
    • 在函数1内定义函数2时,只有函数1被执行过一次,才能使用函数2,而且如果函数2的定义前已执行return命令,则依然无法定义
      也就是说,得让系统在执行函数1时”看到“函数2
    //此处可以调用函数nam,不能调用函数nam1
    $han=nam(10);
    //已执行过nam,系统已知道有个nam1函数,可以执行nam1函数了
    $han1=nam1(20);
    function nam($b) 
    {
        function nam1($a)
        {
            return $a;
        }
        return (int)$b;
    }
    

    2.1 在条件内定义函数

    • 当函数在条件判断的语句内定义式,只有在函数定义所在处被执行,才能调用函数,同时函数的调用也必定是在函数定义之后
    //此时系统没见过han1和han2都不可以调用
    if (false)
    {function han1()
        {return 'han1';
        }
    }
    else
    {function han2()
        {return 'han2';
        }
    }
    echo han1();//han1函数定义所在处未被执行,系统不认识han1(),执行失败
    echo han2();//han2函数的定义被系统看见了,调用正常
    

    3. 参数

    3.1 传值调用

    function han($a,$b);
    

    3.2 传址调用

    function han(&$a,&$b)
    //&为取地址符
    

    很类似c语言里的传值传址调用

    3.3 设置参数默认值

    即如果调用函数时未提供参数,默认的参数

    function han($a=默认参数)
    

    3.4 可变长参数列表

    • PHP5.6以后可以,不指定参数个数,输入的参数,变成一个数组,在函数内调用数组的每个元素,即可使用每个参数
    function han(...$a)
    //a为传入的所有参数构成的数组名
    //注意仅多了三个点...
    

    4. 变量的作用域,生存期

    4.1 局部变量

    • 在函数内定义和使用的变量,一般函数调用结束后就释放掉了,下次再调用函数跟第一次调用一样
    • 传递给函数的参量,调用后释放
    • 静态变量,函数调用后,静态变量的值不被释放,下次调用函数使用上次的值,定义语句static $a=值只在第一次调用函数时有效,变量的值一直保存
    function han()
    {static $a=0; //定义静态变量
    $a=$a+1;
    echo $a;
    }
    han();  //显示1
    han();  //显示2,说明静态变量a的值再调用后没有释放
    

    4.2 全局变量

    • 在函数外定义的变量
    • 在函数内调用全局变量 global $变量名
    <?php
    $a="hello,world";  //定义全部变量$a
    function hello()
    {global $a;  //调用全局变量$a
    echo $a;}
    hello();
    ?>
    

    5. 备注

    5.1 匿名函数

    从PHP5.3开始支持匿名函数
    格式

    $han = function($a)
    {
        echo $a;
    };   //注意这个分号;别漏了,这算是对变量han的定义,所以要有分号;结束
    $han('apple'); //使用$han调用
    

    猜测han指定为函数的地址之类的了,c语言地址的知识忘记了,不是很确定

    5.2 可变函数

    当某个变量后面跟着小括号()时,PHP会找出这个变量所代表的值,然后执行同名的函数

    function han()
    {echo 'hello';
    }
    $test="han";
    $test();  //注意因为$test才能说明test是变量,所以必须要有$
    

    内建函数

    查表吧

    常用函数

    echo
    • 格式 echo 字符串echo(字符串)
    • echo 是语言结构,没有返回值,不能作为表达式
    • echo 可以输出一个或多个字符串,例echo "hello","world";,但是echo()括号内好像只能接受一个字符串
    • 字符串里可包含html代码,例echo "hello<br>world",注意html代码要在字符串内部,或者两边有引号

    print

    • 格式 print 字符串print(字符串)
    • print是函数,字符串成功显示返回true,失败返回false,可以作为表达式
    • print 只允许输出一个字符串,例print "hello"."world";//而不能print "hello","world"
    • 字符串里可包含html代码

    var_dump()

    输出变量的类型、长度、数值
    长度为1的例如整数就不显示个数了
    如果是数组,则展示数组,元素数,key和值

    $a="hello";
    $b=array(1,2,3,4);
    $c=10;
    $e=array(array(1,2),array(3,4));
    var_dump($a);
    echo "<br>";
    var_dump($b);
    echo "<br>";
    var_dump($c);
    echo "<br>";
    var_dump($e);
    

    结果为

    histring(5) "hello" 
    array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
    int(10)
    hiarray(2) { [0]=> array(2) { [0]=> int(1) [1]=> int(2) } [1]=> array(2) { [0]=> int(3) [1]=> int(4) } } 
    

    include'文件' 和 require'文件'

    引入文件,等价于把引入文件的源代码复制粘贴到此处(在服务器执行它之前)

    include 和 require 语句是相同的,除了错误处理方面:

    • require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
    • include 只生成警告(E_WARNING),并且脚本会继续

    包含文件省去了大量的工作。可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,只需更新这个页头包含文件即可。

    对象

    类似c语言的结构体

    • 类 是对象的格式(模板),规定了具体哪些属性(变量)和方法(函数)
    • 对象 类的具体化,基于类创建的一种类型

    如果以汽车对比的话如图,不过我感觉学过c语言结构体的人马上就懂了


    1.类

    1. 1 格式

    定义

    class 类名  //子类的定义为 class 子类名 extends 父类名
    {
    属性的访问级别 $变量名=值;     //也可只定义不赋值
    方法的访问级别 function 函数名()  
          {
          函数体
          }
    const 常数名=值; //定义常数的方法,注意常数名前没有$,常数名习惯大写,使用时也没有$
    //还可以有构造函数,析构函数
    }
    

    1.2 说明

    • class 用于定义类
    • 属性 就是存放数据的变量
    • 方法 就是类内的函数
    • 类内的函数和类外的函数一样,变量也有局部和全局变量之分
    • 可在类外或者其他类内调用类内定义的变量/函数,使用::进行调用,能否调用由访问级别决定
    类名::函数名()
    
    • 访问级别 就是变量或者函数的作用域
    访问级别 作用域
    public或者var 任何程序代码访问
    protected 能被其所在类内访问,子类可以访问
    private 只能被其所在类内访问,子类不能访问

    变量必须指明访问级别,函数不指明则默认为public

    • 常量使用const 定义,const 常量名=值,定义和使用过程中都没有$,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用

    • 继承 在定义一个新类的时,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容,称这个新类继承了旧类

    • 父类 一个类被其他类继承,可将该类称为父类,或基类,或超类

    • 子类 一个类继承其他类称为子类,也可称为派生类

    • 一个类可以是一个类的父类,另一个类的子类

    • 子类可以继承父类的非私有(private)变量/函数

    • 如果子类对父类中出现的变量/函数重新定义,则使用子类的定义,称为覆盖,调用被覆盖的变量/函数可以父类名::变量/函数parent::变量/函数,就是正常的调用方法

    • PHP中子类最多只能继承一个父类
      定义方法

    class 子类名 extends 父类名
    {
    }
    
    • 特殊的类名
      自身 self
      父类 parent
      例调用类自身中的函数除了上述方法还可以
    parent::函数名()
    
    class lei
    {
        public $a=1;
        function han()     //类内函数,访问级别默认public
        {
            echo "</br>hello明</br>";
        }
        function test()
        {
            echo lei::PI; //调用类lei内的PI常数,也可以self::PI
            self::han();  //调用自身的han()函数
            echo lei::$a;//函数体内没有变量$a,需要lei::$a或者self::$a来调用类内的变量
        }
    }
    class zilei extends lei //创建继承lei的子类zilei
    {
    function test()      //重写test函数,使用zilei类时,以重定义的为准,不影响父类中的定义使用
      {
        echo hello;
        each parent::$a; //调用父类中的$a,也可以lei::$a
      }
    lei::test()  //调用lei内的test()函数
    

    2. 对象

    2.1 格式

    定义

    $对象名=new 类名(); //如果有输入参数在()内输入
    
    匿名定义,和匿名函数一样
    
    $对象名=new class(输入参数)
    {
    类语句;
    };     //这里的分号;要有,和匿名函数一样嘛
    

    也有类似可变函数,字符串()表示相应函数,new 字符串表示创建对象的定义方法

    使用

    $对象名->变量名=值;  //注意变量名前没有$
    $对象名->函数名();
    

    特殊的对象名:$this代表当前对象,可在类内使用

    3. 更多内容

    3.1 构造函数&析构函数

    • 构造函数是用来将对象初始化的函数,在创建对象时自动执行
      有无参数都可,参数是在__construct()里面定义的,不是在类名后面,没有返回值
    function __construct (输入参数)   //注意是两个下划线和construct
    {
    }
    
    • 析构函数是在释放对象时自动执行的函数
      没有参数,没有返回值
    function __destruct ()  //注意是两个下划线和construct
    {
    }
    
    class lei
    {
        public $name;
        function __construct($str)
        {
            $this->name=$str;   //$this代表当前对象
            echo "已成功创建名字为{$this->name}的对象</br>";
        }
        function __destruct()
        {
            echo "已成功释放对象";
        }
    }
    
    $duix=new lei("小明");
    $duix=NULL;
    

    运行结果

    已成功创建名字为小明的对象
    已成功释放对象
    

    3.2 抽象方法/抽象函数

    • 抽象类,如果类内定义了一个抽象函数,则他必须也定义为抽象类
    abstract class 抽象类名
    
    • 定义为抽象的类不能用于定义对象,会报错 Fatal error: Uncaught Error: Cannot instantiate abstract class 抽象类名
    • 抽象类内的抽象函数只能说明参数,不能有函数具体形式,即只能写abstract funtion 函数名(输入参数)后面不能再有{}包含的函数体,否则报错Abstract function 抽象类::抽象函数() cannot contain body
    • 抽象类内非抽象函数不受限制
    • 子类继承抽象类,子类内必须定义父类中的抽象函数,而且输入参数必须与抽象函数,访问级别和父类相同或着比父类更宽松,可以简单理解为写父类抽象函数的函数体

    abstract class chou   //定义抽象类
    {
        abstract function fun1($a,$b);   //抽象函数,不能有函数体
    }
    class zichou extends chou     //定义子类,父类是抽象类chou
    {
        function fun1($a,$b)      //必须定义与抽象函数相同的函数
        {
            echo "$a"."$b";
        }
    }
    

    3.3 final

    PHP 5 新增了一个 final 关键字。

    • 如果父类中的方法(函数)被声明为 final,则子类无法覆盖该方法
    final republic function 函数名()    //函数名前单词较多,别忘记了
    {函数体
    }
    
    • 如果一个类被声明为 final,则不能被继承。

    3.4 static

    • 在类内定义 static 变量便可以在类外访问,否则会报错
    • 函数无论是否static 都可被访问
      定义方法
    static 访问级别 $变量名
    static 访问级别 function 函数名()
    {
    }
    

    class lei
    {
       static public $hel=5;  //变量前参数多,容易漏写
       public $he=6;
       static  function fun()
       {
           echo hello1."<br>";
       }
       function fun2()
       {
           echo hello2."<br>";
       }
    }
    
    echo lei::$hel;
    echo lei::$he; //会报错,不能使用非static变量
    lei::fun();
    lei::fun2();
    

    3.4 接口(不知道干什么用的?)

    • 使用接口(interface),可以在接口中指定类必须包含的方法(函数)
    • 不能在接口内定义函数体,而且访问级别只能是public型,这是接口的特性
    • 只能在类中定义函数体,访问级别必须与接口内相同,因此只能public

    接口格式

    interface 接口名
    {
        public function 函数名();  //public可省略
    }
    

    使用接口的类

    class 类名 implements 接口1,接口2,接口3...      //可以有1到多个接口
    {
          function 函数名()      //必须有每个接口的函数
        {
            echo hello;
        }
            其他接口函数
    }
    

    interface jiekou   //定义接口jiekou
    {
        public function fun();   //接口函数
    }
    
    interface jiekou2   //定义接口jiekou2
    {
        function fun2();     //接口函数类型只能public或不写(就代表public)
    }
    class lei implements jiekou,jiekou2   //定义类lei,接口有jiekou,jiekou2
    {
        function fun()
        {
            echo hello;
        }
        function fun2()
        {
            echo world;
        }
    }
    

    命名空间 namespace

    变量、数组不受命名空间的影响
    类/函数/常量 须使用命名空间前缀(不带前缀表示当前命名空间)

    1. 简单认识命名空间

    1.1 文件夹&文件 命名空间&类/函数/常量

    • 命名空间类/函数/常量的关系类似与文件夹文件的关系,同一文件夹(命名空间)内文件(类/函数/常量)不能重名,而不同文件夹(命名空间)下可以重名
    • 我们可以通过 目录+文件名来使用某一文件如
    C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
    

    同样,我们也可以使用命名空间+类/函数/常量来使用某一命名空间的类/函数/常量

    • 如下代表根命名空间(全局空间)中的命名空间1中命名空间2内的类/函数/常量,与目录的绝对路径类似
    \命名空间1\命名空间2\类/函数/常量
    
    • 如下代表当前命名空间下面的命名空间1下的类/函数/常量,与目录的相对路径类似
    命名空间1\类/函数/常量
    
    • 如下代表当前命名空间下面的类/函数/常量
    类/函数/常量
    
    • 进入命名空间就像进入文件夹一样(不存在这一命名空间则自动创建),然后在这个命名空间(文件夹)下进行各种操作,例如创建类/函数/常量等

    1.2 PHP中的namespace 与 shell 里的 cd

    • 默认情况下(不使用namespace时),所有变量、数组,常量,类和函数,等都放在全局空间(理解为根命名空间)下

    • namespace类似与shell中的cd命名,可以使用namespce 切换命名空间,例进入某一目录cd \home\chen,对于命名空间 namespace 命名空间路径

    • 相对于cd而言 namespace 后面只能是绝对路径(命名空间的绝对地址),而且根目录(全局空间)不写斜杠\,默认开头就是全局空间下,不同于:命名空间中的类/函数/常量支持相对路径和绝对路径,而且使用类/函数/常量时根目录(全局空间)要加\

    namespace  命名空间1;  
    #   代表进入全局空间下的命名空间1,绝对路径
    namespace  命名空间1\命名空间2;  
    #   代表进入全局空间下的命名空间1下的命名空间2
    命名空间1\类/函数/常量 ,绝对路径
    #   当前命名空间下面的命名空间1下的类/函数/常量,相对路径类似
    \命名空间1\命名空间2\类/函数/常量 
    #   根命名空间(全局空间)中的命名空间1中命名空间2内的类/函数/常量,绝对路径
    
    
    • 要么不用namspace,所有类/函数/常量全在全局空间下面
    • 要么用namespace,则必须在文档的开头就使用namespace表示所在命名空间,且无法切换到全局空间创建使用类/函数/常量

    2. 语法

    在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,例declare(encoding='UTF-8'),其他所有代码包括空白符,html标签都不能出现在命名空间的声明之前。

    2.1 使用/切换命名空间格式

    分号法

    <?php
    namesapce 命名空间名1;
    php代码。。。
    namesapce 命名空间名2;
    php代码。。。
    ?>
    

    大括号法

    <?php
    namesapce 命名空间名1
    {
    php代码。。。
    }
    namesapce 命名空间名2
    {
    php代码。。。
    }
    ?>
    

    全局命名空间

    namespace
    {
    }
    
    • 使用大括号{表示或者分号;表示,两种方法不能混用,所以要使用全局命名空间只能使用大括号{表示法

    2.2 使用命名空间中的类/函数/常量

    注意:变量,数组不受命名空间影响

    格式:路径\类/函数/常量

    2.2.1 不写路径,表当前

    例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo,
    如果当前空间没有则为全局空间下类/函数/常量,即\类/函数/常量

    2.2.2 相对路径,当前下

    例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo

    2.2.3 绝对路径,\开头

    例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();,foo 被解析为\currentnamespace\foo

    3.别名/导入命名空间

    可以理解为建立了一个快捷方式,不过该快捷方式仅在该命名空间下有效
    仅支持给命名空间和类建立别名

    3.1 语法
    • user 路径\命名空间/类 as 别名
    • user 路径\命名空间/类,别名默认为命名空间/类的名字
    • user 路径\命名空间/类 as 别名,user 路径\命名空间/类,用逗号隔开多个别名语句
    <?php
    namespace hello\hi
    {
        $a=1;
        function han1()
        {
            echo hello;
        }
    }
    namespace 
    {
    use \hello\hi;    //别名,默认为hi
    hi\han1();  //使用hi替代\hello\hi
    }
    ?>
    

    3. 备注

    特殊的关键字

    namespace即可以切换命名空间,也表示当前命名空间的路径
    __NAMESPACE__魔术变量表示当前命名空间的名称(字符串)

    魔术变量

    __LINE__

    文件中的当前行号。

    __FILE__

    文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

    __DIR__

    文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
    它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

    __FUNCTION__

    函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

    __CLASS__

    类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
    在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起__CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__是调用 trait 方法的类的名字。

    __TRAIT__

    Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
    Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
    从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

    __METHOD__

    类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

    __NAMESPACE__

    当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

    显示时间

    1. 时间 date()

    date() 函数用于格式化时间/日期

    1.1 格式

    date("返回格式",指定时间戳)
    

    date()返回值类型为字符串,返回UNIX时间戳,从1970/1/1到当前或者指定的时间戳
    返回格式为单个字母,可连续写可用符号隔开
    指定时间戳,不写默认为当前时间

    1.2 返回格式

    参见date — 格式化一个本地时间/日期

    返回格式

    <?php
    echo date("TYmd l g:i:s A")
    ?>
    

    结果

    UTC20170822 Tuesday 12:01:50 PM
    

    显示的时UTC的时间,而我们处在东八区
    可以

    <?php
    date_default_timezone_set('Asia/Shanghai');
    echo date("TYmd l g:i:s A")
    ?>
    

    结果

    CST20170822 Tuesday 8:10:24 PM
    

    更多参考PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理

    相关文章

      网友评论

      本文标题:20170812PHP学习(一)基础语法

      本文链接:https://www.haomeiwen.com/subject/xbrjrxtx.html