Bootstrap

Web后端-PHP基础学习

PHP学习

  • 【学习网址】
  1. (http://www.php.cn/code/4800.html)
  2. (http://www.w3school.com.cn/php/?tdsourcetag=s_pcqq_aiomsg)
  • 【视频网址】(https://study.163.com/course/courseLearn.htm?courseId=1004572025#/learn/video?lessonId=1049055320&courseId=1004572025)
  • 【PHP手册】(www.php.net)

基础教程

简介
  • 开源脚本语言,在服务器上执行
  • 生成动态页面内容
  • 创建,打开,读取,写入,删除以及关闭服务器上的文件
  • 接受表单数据,发送取回cookie
  • 运行于各种平台,兼容几乎所有服务器
基础结构
  • 语法以 <?php 开头,以 ?>结尾
<?php
// 此处是 PHP 代码
?>
  • PHP文件通常包含HTML标签以及一些PHP脚本代码
  • 语句结束后需要使用 ; 结尾

注释
  • 不要在注释里面添加注释
  • 三种注释
<?php
// 这是单行注释

# 这也是单行注释(shell风格)

/*
这是多行注释块
它横跨了
多行
*/
?>
  • PHP中,所有用户定义的函数,类和关键词对大小写不敏感而所有变量则敏感

变量
  • 变量以 $ 符号开头,其后是变量的名称
  • 变量名称必须以字母或下划线开头
  • 变量名称不能以数字开头
  • 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
  • 变量名称对大小写敏感($y 与 $Y 是两个不同的变量
  • 变量类型
    int 整型 bool 布尔 float 浮点
    string 字符 array 数组object 对象
    null 空 resource 资源 scalar 为标量
    numeric 数值类型 callable 是否为函数
  • 打印变量无需引号,可使用双引号但不能使用单引号
  • 若把另一个值赋给现在的变量,新值会重写旧值
  • PHP没有创建变量的命令,变量会在首次为期赋值时被创建
  • PHP不需要声明数据类型,可以根据它的值自动转化
  • 也可以在函数内部变量前加global来显示局部变量
  • 通常函数完成执行后,会删除所有变量,若不想删除局部变量,在首次声明变量是使用static关键词

输出语句
  • Echo能输出多个字符串,print只能输出一个字符串并始终返回1
echo语句(有无括号均可用)
  • 显示字符串(字符串能包含HTML标记)
<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";
?>
  • 显示变量
<?php
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");

echo $txt1;
echo "<br>";
echo "Study PHP at $txt2";
echo "My car is a {$cars[0]}";
?>
print同上

数据类型
  • 字符串
  1. 字符串是字符序列
  2. 可以是引号内的任何文本
  • 注意:
  1. 双引号解析变量,单引号不解析
  2. 双引号里插入变量,变量后若有英文或中文,它会把这个字符和变量拼接起来,视为一整个变量,一定要在变量后加特殊字符分开,或者用大括号把变量包起来。
  3. 双引号能解析转义字符,单引号仅能解析\和\’
  4. 单引号效率更高
  5. 单双引号能互插,双引号当中插入单引号,单引号中插入变量,变量会被解析
  6. 拼接字符“.”
  7. 定界符声明字符功能类似双引号
  8. 引号内又有引号的需要在有问题引号前加\
  • 整数
  1. 整数至少有一个数字
  2. 不能包含逗号和空格
  3. 不能有小数点
  4. 正负均可
  5. 可以使用十进制(重点掌握)、十六进制(0x)或八进制(0)
  • 浮点数:是有小数点或煮熟形式的数字
  • 逻辑:用于条件测试,true or false
  • 数组:在一个变量里存储多个值。如$cars=array("Volvo","BMW","SAAB") 会一个简单的声明
  • 对象:存储数据和有关如何处理数据的信息数据类型
  1. PHP中必须明确地声明对象

  2. 首先声明类(包含属性和方法的结构),然后在类中定义数据类型(使用class关键词)

  • NULL值
  1. 表示变量无值,它是数据类型NULL唯一可能的值
  2. 标示变量是否为空。也用于区分空字符串和空值数据库。
  3. 可以通过把值设置为NULL
  4. 一个变量没有给任何值
  5. 可使用unset()将变量销毁掉
  6. 补充函数:
    empty()可以向括号中间传入一个变量。这个变量的值如果为false或者为null的话,返回true。
    isset()可以向括号中间传入一个或者多个变量,变量与变量间用逗号分开。只要有有一个变量为null,则返回false。否则,则返回true。
  • 默写级别 判断数据类型:gettype()获得变量类型,var_dump()输出类型和值
    数据类型名称is_int 是否为整型 is_bool 是否为布尔 is_float 是否是浮点
    is_string 是否是字符 is_array 是否是数组is_object 是否是对象
    is_null 是否为空 is_resource 是否为资源 is_scalar 是否为标量
    is_numeric 是否为数值类型 is_callable 是否为函数
  • [布尔值的自动转换和其他强制转换](http://www.php.cn/code/992.html)
字符串函数
strlen()
  • 返回字符串的长度,以字符计。

  • 常用于循环和其他函数,在确定字符串何时结束很重要

str_word_count()
  • 对字符串中 单词进行计数
strrev()
  • 反转字符串
str_replace()
  • 用一些字符串替换另一些字符

  • 语法

    str_replace("world","kitty","hello world")

strops()
  • 用于检索字符串内指定的字符或文本

  • 找到则返回首个匹配的字符位置,未找到,则返回FALSE

  • 语法

    strops("hello world!","world")


PHP常量
  • 单个值的标识符,在脚本中无法改变值
  • 有效的常量名以字符或下划线开头(常量名称前没有$符号),贯穿整个脚本
设置PHP常量
  • 使用define(“name”,“value”,“bool”)函数,它使用三个参数
  1. 收个参数定义常量的名称,尽量全大写
  2. 第二个参数定义常量的值
  3. 可选的第三个参数规定常量名是否对大小写不敏感。默认为false。

PHP运算符
  • 基本运算符+ - * /,赋值=
  • 字符串运算符
    【.】串接 $txt1 = "Hello" $txt2 = $txt1 . " world!"
    【.=】串接赋值$txt1 = "Hello" $txt1 .= " world!"
递增/递减运算符
运算符名称描述
++$x前递增$x 加一递增,然后返回 $x
$x++后递增返回 $x,然后 $x 加一递增
–$x前递减$x 减一递减,然后返回 $x
$x–后递减返回 $x,然后 $x 减一递减
PHP比较运算符
运算符名称例子结果
==等于$x == $y如果 $x 等于 $y,则返回 true。
===全等(完全相同)$x === $y如果 $x 等于 $y,且它们类型相同,则返回 true。
!=不等于$x != $y如果 $x 不等于 $y,则返回 true。
<>不等于$x <> $y如果 $x 不等于 $y,则返回 true。
!==不全等$x !== $y如果 $x 不等于 $y,或它们类型不相同,则返回 true。
>大于$x > $y如果 $x 大于 $y,则返回 true。
<小于$x < $y如果 $x 小于 $y,则返回 true。
>=大于或等于$x >= $y如果 $x 大于或者等于 $y,则返回 true.
<=小于或等于$x <= $y如果 $x 小于或者等于 $y,则返回 true。
PHP逻辑运算符
运算符名称例子结果
and$x and $y如果 $x 和 $y 都为 true,则返回 true。
or$x or $y如果 $x 和 $y 至少有一个为 true,则返回 true。
xor异或$x xor $y如果 $x 和 $y 有且仅有一个为 true,则返回 true。
&&$x && $y如果 $x 和 $y 都为 true,则返回 true。
|| x ∥ ∥ x\|\| xy至少有一个为true,返回true
!!$x如果 $x 不为 true,则返回 true。
PHP数组运算符

运算符名称例子结果显示结果
+联合$x + $y$x 和 $y 的联合(但不覆盖重复的键)
==相等$x == $y如果 $x 和 $y 拥有相同的键/值对,则返回 true。
===全等$x === $y如果 $x 和 $y 拥有相同的键/值对,且顺序相同类型相同,则返回 true。
!=不相等$x != $y如果 $x 不等于 $y,则返回 true。
<>不相等$x <> $y如果 $x 不等于 $y,则返回 true。
!==不全等$x !== $y如果 $x 与 $y 完全不同,则返回 true。
条件语句
  • if 语句 - 如果指定条件为真,则执行代码
  1. if (条件) {
    当条件为 true 时执行的代码;
    }
  • if…else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
  1. if (条件) {
    条件为 true 时执行的代码;
    } else {
    条件为 false 时执行的代码;
    }
  • if…elseif…else 语句 - 选择若干段代码块之一来执行
  1. if (条件) {
    条件为 true 时执行的代码;
    } elseif (condition) {
    条件为 true 时执行的代码;
    } else {
    条件为 false 时执行的代码;
    }
PHPswitch语句
  • 原理
  1. 对表达式进行一次计算
  2. 把表达式值与case的值比较
  3. 若匹配则执行与case关联的代码
  4. 执行后.break语句组织代码跳入下一个case中继续执行
  5. 若无case为真,则用default语句

PHPwhile循环
  • 只要条件为真,就会执行代码
PHP do…while
  • 先执行一次代码,然后检查条件,若条件为真则重复循环
for循环
  • 适用于以前确定了脚本运行的次数

  • 语法
    for (init counter(初始化循环计数器的值); test counter(评估,若值TURE,则继续,否则结束); increment counter(增加循环计数器的值)) {

    code to be executed;
    }

foreach循环
  • 只用于循环数组,并用于遍历数组的每个值对

  • 语法
    foreach ($array as $value) {

    code to be executed;
    }每一次循环,数组元素都会被赋值给$value变量,直到最后一个元素

<?php 
$colors = array("red","green","blue","yellow"); 

foreach ($colors as $value) {
  echo "$value <br>";
}
?>
自定义函数
  • 以function 开头

  • 语法
    function functionName() {

    被执行的代码;
    }

  1. 函数名以字母和下划线开头
  2. 函数名对大小写不敏感
函数参数
  • 参数类似变量
  • 它被定义在函数名后,括号内部,多个参数用逗号隔开
<?php
function familyName($fname) {
  echo "$fname Zhang.<br>";
}

familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>

结果:
Li Zhang.
Hong Zhang.
Tao Zhang.
Xiao Mei Zhang.
Jian Zhang.

默认参数值

调用没有参数的函数,参数会取默认值

函数返回值
  • 如需使用返回值,使用return语句
<?php
function sum($x,$y) {
  $z=$x+$y;
  return $z;
}

echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

数组
  • 数组在单个变量里存储多个值
  • 可以通过引用标号来访问某值
PHP中创建数组
  • 语法 array();
  • 类型
  1. 索引数组 带有数字索引
    自动分配(从开始索引):$cars=array(“Volvo”,“BMW”,“SAAB”);
    手动分配
    $cars[0]=“Volvo”;
    $cars[1]=“BMW”;
    $cars[2]=“SAAB”;
获取数组长度
  • count()函数
  • 例子
<?php
$cars=array("Volvo","BMW","SAAB");
echo count($cars);
?>
遍历索引数组
  • for循环
  • 例子
<?php
$cars=array("Volvo","BMW","SAAB");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) {
  echo $cars[$x];
  echo "<br>";
}
?>
关联数组 带有指定键
  • 创建

    方法一:
    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"
    方法二:

  $age['Peter']="35";
  $age['Ben']="37";
  $age['Joe']="43";
  • 例子
<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
遍历关联数组
  • Foreach
<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");

foreach($age as $x=>$x_value) {
  echo "Key=" . $x . ", Value=" . $x_value;
  echo "<br>";
}
?>
  1. 多维数组 包含一个或多个数组
数组排序
  • sort() - 以升序对数组排序

  • rsort() - 以降序对数组排序

  • asort() - 根据值,以升序对关联数组进行排序

  • ksort() - 根据键,以升序对关联数组进行排序

  • arsort() - 根据值,以降序对关联数组进行排序

  • krsort() - 根据键,以降序对关联数组进行排序
    语法: 某 函 数 ( 某函数( (数组名)

PHP超全局变量
  • 预定义变量,在一个脚本的全部作用域都可以用

  • 变量如下

  • $GLOBALS(用于在PHP脚本中的任意位置访问全局变量)

  • $_SERVER(保存关于报头、路径和脚本位置的信息)

  • $_REQUEST(用于收集HTML表单移交的数据)

  • $_POST(广泛用于收集提交 method=“post” 的 HTML 表单后的表单数据。)

  • $_GET(可用于收集提交 HTML 表单 (method=“get”) 之后的表单数据,
    也可以收集 URL 中的发送的数据)

  • $_FILES

  • $_ENV

  • $_COOKIE

  • $_SESSION

PHP面向对象

  • 是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
  • 对象的三个特性
    1. 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
    2. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
    3. 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
基础
内容
  • − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
  • 对象 − 是类的实例。
  • 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
  • 成员函数 − 定义在类的内部,可用于访问对象的数据。
  • 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
  • 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
  • 子类 − 一个类继承其他类称为子类,也可称为派生类。
  • 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
  • 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
  • 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
  • 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
  • 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
  • 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
创建
  • 通过car类创建了一个对象

$mercedes = new Car ();

类的定义
  • 语法格式如下

    <?php
    //类使用 class 关键字后加上类名定义。
    class phpClass 
    //类名后的一对大括号({})内可以定义变量和方法。
      {
      var $var1;//类的变量使用 var 来声明, 变量也可以初始化值。
      var $var2 = "constant string";
      //函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
    }
    ?>
    
  • 实例

    <?php
    class Site {
      /* 成员变量 */
      var $url;
      var $title;
      
      /* 成员函数 */
    function setUrl($par){
         $this->url = $par;//变量 $this 代表自身的对象。
      }
      
      function getUrl(){
      	echo $this->url . PHP_EOL;
      }
      
      function setTitle($par){
         $this->title = $par;
      }
      
      function getTitle(){
         echo $this->title . PHP_EOL;//PHP_EOL 为换行符。
      }
    }
    ?>
    
创建对象

$runoob = new Site;

  • 调用成员

    • 对象的成员方法只能操作该对象的成员变量

       <?php
      class Site {
        /* 成员变量 */
        var $url;
        var $title;
        
        /* 成员函数 */
        function setUrl($par){
           $this->url = $par;
        }
        
        function getUrl(){
           echo $this->url . PHP_EOL;
        }
        
        function setTitle($par){
           $this->title = $par;
        }
        
        function getTitle(){
           echo $this->title . PHP_EOL;
        }
      }
      
      $runoob = new Site;
      $taobao = new Site;
      $google = new Site;
      
      // 调用成员函数,设置标题和URL
      $runoob->setTitle( "菜鸟教程" );
      $taobao->setTitle( "淘宝" );
      $google->setTitle( "Google 搜索" );
      
      $runoob->setUrl( 'www.runoob.com' );
      $taobao->setUrl( 'www.taobao.com' );
      $google->setUrl( 'www.google.com' );
      
      // 调用成员函数,获取标题和URL
      $runoob->getTitle();
      $taobao->getTitle();
      $google->getTitle();
      
      $runoob->getUrl();
      $taobao->getUrl();
      $google->getUrl();
      ?> 
      
构造函数
  • 构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

  • 语法

    void __construct ([ mixed $args [, $... ]] )
    
    如:通过构造方法来初始化 $url 和 $title 变量
    function __construct( $par1, $par2 ) 
    {
       $this->url = $par1;
       $this->title = $par2;
    }
    
    实例
    $runoob = new Site('www.runoob.com', '菜鸟教程');
    $taobao = new Site('www.taobao.com', '淘宝');
    $google = new Site('www.google.com', 'Google 搜索');
    
    // 调用成员函数,获取标题和URL
    $runoob->getTitle();
    $taobao->getTitle();
    $google->getTitle();
    
    $runoob->getUrl();
    $taobao->getUrl();
    $google->getUrl(); 
    
析构函数
  • 当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数

  • 语法

    void __destruct ( void )
    
    例子
    <?php
    class MyDestructableClass {
       function __construct() {
           print "构造函数\n";
           $this->name = "MyDestructableClass";
       }
    
       function __destruct() {
           print "销毁 " . $this->name . "\n";
       }
    }
    
    $obj = new MyDestructableClass();
    ?>
    
继承
  • 格式

    class Child extends Parent {
       // 代码部分
    }
    例子
    <?php 
    // 子类扩展站点类别
    class Child_Site extends Site {
       var $category;
    
        function setCate($par){
            $this->category = $par;
        }
      
        function getCate(){
            echo $this->category . PHP_EOL;
        }
    }
    
重写
  • 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

    function getUrl() {
       echo $this->url . PHP_EOL;
       return $this->url;
    }
       
    function getTitle(){
       echo $this->title . PHP_EOL;
       return $this->title;
    }
    
访问控制
  • 通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的
    • **public(公有):**公有的类成员可以在任何地方被访问。
    • **protected(受保护):**受保护的类成员则可以被其自身以及其子类和父类访问。
    • **private(私有):**私有的类成员则只能被其定义所在的类访问。
属性的访问控制
  • 类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

  • 例子

    <?php
    /**
     * Define MyClass
     */
    class MyClass
    {
        public $public = 'Public';
        protected $protected = 'Protected';
        private $private = 'Private';
    
        function printHello()
        {
            echo $this->public;
            echo $this->protected;
            echo $this->private;
        }
    }
    
    $obj = new MyClass();
    echo $obj->public; // 这行能被正常执行
    echo $obj->protected; // 这行会产生一个致命错误
    echo $obj->private; // 这行也会产生一个致命错误
    $obj->printHello(); // 输出 Public、Protected 和 Private
    /**
     * Define MyClass2
     */
    class MyClass2 extends MyClass
    {
        // 可以对 public 和 protected 进行重定义,但 private 而不能
        protected $protected = 'Protected2';
    
        function printHello()
        {
            echo $this->public;
            echo $this->protected;
            echo $this->private;
        }
    }
    
    $obj2 = new MyClass2();
    echo $obj2->public; // 这行能被正常执行
    echo $obj2->private; // 未定义 private
    echo $obj2->protected; // 这行会产生一个致命错误
    $obj2->printHello(); // 输出 Public、Protected2 和 Undefined
    
    ?>
    
方法的访问控制
  • 类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

  • 例子

    /**
     * Define MyClass
     */
    class MyClass
    {
        // 声明一个公有的构造函数
        public function __construct() { }
    
        // 声明一个公有的方法
        public function MyPublic() { }
    
        // 声明一个受保护的方法
        protected function MyProtected() { }
    
        // 声明一个私有的方法
        private function MyPrivate() { }
    
        // 此方法为公有
        function Foo()
        {
            $this->MyPublic();
            $this->MyProtected();
            $this->MyPrivate();
        }
    }
    
    $myclass = new MyClass;
    $myclass->MyPublic(); // 这行能被正常执行
    $myclass->MyProtected(); // 这行会产生一个致命错误
    $myclass->MyPrivate(); // 这行会产生一个致命错误
    $myclass->Foo(); // 公有,受保护,私有都可以执行
    
    
    /**
     * Define MyClass2
     */
    class MyClass2 extends MyClass
    {
        // 此方法为公有
        function Foo2()
        {
            $this->MyPublic();
            $this->MyProtected();
            $this->MyPrivate(); // 这行会产生一个致命错误
        }
    }
    
    $myclass2 = new MyClass2;
    $myclass2->MyPublic(); // 这行能被正常执行
    $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
    
接口
  • 使用接口(interface),可以指定某个类必须实现哪些方法

  • 通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

  • 接口中定义的所有方法都必须是公有,这是接口的特性。

  • 要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

  • 例子

    <?php
    
    // 声明一个'iTemplate'接口
    interface iTemplate
    {
        public function setVariable($name, $var);
        public function getHtml($template);
    }
    
    
    // 实现接口
    class Template implements iTemplate
    {
        private $vars = array();
      
        public function setVariable($name, $var)
        {
            $this->vars[$name] = $var;
        }
      
        public function getHtml($template)
        {
            foreach($this->vars as $name => $value) {
                $template = str_replace('{' . $name . '}', $value, $template);
            }
     
            return $template;
        }
    }
    
常量
  • 类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号

  • 定值

  • 自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。

  • 例子

    <?php
    class MyClass
    {
        const constant = '常量值';
    
        function showConstant() {
            echo  self::constant . PHP_EOL;
        }
    }
    
    echo MyClass::constant . PHP_EOL;
    
    $classname = "MyClass";
    echo $classname::constant . PHP_EOL; // 自 5.3.0 起
    
    $class = new MyClass();
    $class->showConstant();
    
    echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
    ?>
    

更多面向对象的知识

PHP表单

表单处理
  • Post
<html>
<body>

<form action="welcome.php" method="post">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>

</body>
</html>
当用户填写此表单并点击提交按钮后,表单数据会发送到名为 "welcome.php" 的 PHP 文件供处理。表单数据是通过 HTTP POST 方法发送的。
  • Get
<html>
<body>

<form action="welcome_get.php" method="get">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>

</body>
</html>
  • 注意 处理PHP表单时需要验证
  • GET VS POST
  1. 二者都创建数组,包含键(表单控件的名称)值对(用户输入的数据)
  2. 都被视作$_GET $_POST都是超全局变量,即无需考虑作用域,无需任何特殊代码
  3. $_GET通过URL参数传递到当前脚本的变量数组
  4. $_POST通过HTTP POST传递
何时用GET
  • GET发送的信息对任何人都可见(所有变量名和值显示在URL上)。它对发送的信息数量也有限制,更易于添加到书签
  • 注意 不要用于发送敏感数据
何时用POST
  • POST发送的信息是不可见的(会被嵌入HTTP请求的主体中),对数量无限制
  • 它支持高阶功能
表单验证
  • 部分代码解释

    • $_SERVER[“PHP_SELF”]变量,返回当前执行脚本的文件名
    • htmlspecialchars()函数把特殊字符转换为HTML实体(意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 &gt)
  • 通过PHP验证表单数据

    1. 通过 PHP 的 htmlspecialchars() 函数传递所有变量。

      如果用户试图在文本字段中提交以下内容
      <script>location.href('http://www.hacked.com')</script>
      代码不会执行,因为会被保存为转义代码
      &lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;
      
    2. 通过 PHP trim() 函数 ,去除用户输入数据中不必要的字符(多余的空格,制表符,换行)

      trim(string,charlist)

      • 如果省略charlist,则会移出下列字符

      • “\0” - NULL

      • “\t” - 制表符

      • “\n” - 换行

      • “\x0B” - 垂直制表符

      • “\r” - 回车

      • " " - 空格

    3. 通过 PHP stripslashes() 函数,删除用户输入数据中的反斜杠

      function test_input($data) {
        $data = trim($data);//去除多余字符
        $data = stripslashes($data);//删除斜杠
        $data = htmlspecialchars($data);//转义
        return $data;
      }
      
  • 部分验证代码

    • preg_match()检索字符串的模式,若存在则返回true

高级教程

日期函数
1. date(format,timetamp)
d(月日) m(月) y(年) 1(日英文)
h(时) i(分) s(秒) a(am/pm)
2. mktime()创建时间
mktime(hour,minute,second,month,day,year)
3. strtotime()创建日期
strtotime(time,now)
include
  • 获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中

  • 通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。

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

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

    include 'filename';
    require 'filename';
    
文件
函数
  • readfile()读取文件

  • fopen(“文件名”,“r读/w写”)打开文件

  • fclose()关闭文件

  • fread()读取文件

    • 第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数

      fread($myfile,filesize(""));

  • fgets()从文件读取单行

  • feof()检查是否已到达 “end-of-file” (EOF)

    • 遍历未知长度的数据
  • fgetc()函数用于从文件中读取单个字符。

  • fwrite()写入

    • 第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串
cookie
  • cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件

  • 创建

    • setcookie()

    • setcookie() 函数必须位于 <html> 标签之前。

      setcookie(name, value, expire, path, domain);

  • 取回cookie值

    • $_COOKIE变量用于取回值
Sessions
  • 用于存储有关用户会话的信息,或更改用户会话的设置。

  • Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。

  • 创建

    • session_start()

    • 函数必须位于<html>标签之前

      <?php session_start(); ?>
      
      <html>
      <body>
      
      </body>
      </html>
      
  • 存取

    • $_SESSION
  • 终结

    • unset() 用于释放指定的session量
    • session_destroy()彻底终结

PCRE模式语法

  • PCRE支持的正则表达式和寓意
分隔符
  • 可以是任意非字母数字,非反斜线,非空白字符

  • 经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。

  • 例子

    /foo bar/
    #^[^0-9]$#
    +php+
    %[a-zA-Z0-9_-]%
    
  • 若想在模式内使用分隔符,使用反斜线转义

  • 需要将一个字符串放入模式中使用时,可以用 preg_quote() 函数对其进行转义

  • 可以在结束分隔符后面增加模式修饰符

元字符
常用元字符
\一般用于转义字符
^断言目标的开始位置(或在多行模式下是行首)
$断言目标的结束位置(或在多行模式下是行尾)
.匹配除换行符外的任何字符(默认)
[]开始 ,结束字符类
?作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。
|开始一个可选分支
()子组的开始,结束标记
*0 次或多次匹配
+1 次或多次匹配
{}自定义量词开始,结束标记
模式中方括号内的部分称为"字符类"。 在一个字符类中仅有以下可用元字符:
\转义字符
^仅在作为第一个字符(方括号内)时,表明字符类取反
-标记字符范围
转义序列
转义序列
\a响铃字符(十六进制 07)
\cx“control-x”,x 是任意字符
\e转义 (十六进制 1B)
\f换页 (十六进制 0C)
\n换行 (十六进制 0A)
\p{xx}一个符合 xx 属性的字符
\P{xx}一个不符合xx属性的字符
\r回车 (十六进制 0D)
\t水平制表符 (十六进制 09)
\xhhhh十六进制编码的字符
\dddddd八进制编码的字符,或者后向引用
特殊强调
  • \cx的确切效果如下: 如果x是一个小写字母,它被转换为大写。接着, 将字符的第6位(十六进制 40,右数第一个位为第0位)取反。 比如*\cz成为十六进制的1A,\c{*成为十六进制3B, *\c;*成为十六进制7B。

  • \040 空格的另外一种用法

  • \11 可能是后向引用,也可能是制表符

  • \7 始终是后向引用

  • \011 总是一个制表符

  • 反斜线的其他用法

    反斜线的第三种用法
    \d任意十进制数字
    \D任意非十进制数字
    \h任意水平空白字符(since PHP 5.2.4)
    \H任意非水平空白字符(since PHP 5.2.4)
    \s任意空白字符
    \S任意非空白字符
    \v任意垂直空白字符(since PHP 5.2.4)
    \V任意非垂直空白字符(since PHP 5.2.4)
    \w任意单词字符
    \W任意非单词字符
    反斜线的第四种用法
    \b单词边界
    \B非单词边界
    \A目标的开始位置(独立于多行模式)
    \Z目标的结束位置或结束处的换行符(独立于多行模式)
    \z目标的结束位置(独立于多行模式)
    \G在目标中首次匹配位置
Unicode属性
子组
  • 通过圆括号分隔界定,并且可以嵌套。

  • 作用

    • 可选分支局部变化:

      比如,模式*cat(arcat|erpillar|)*匹配 “cat”, “cataract”, “caterpillar” 中的一个,如果没有圆括号的话,它匹配的则是 “cataract”, “erpillar” 以及空字符串。

    • 将子组设定为捕获子组(向上面定义的). 当整个模式匹配后,目标字符串中匹配子组的部分将会通过 pcre_exec()()ovector 参数回传给调用者。 左括号从左至右出现的次序就是对应子组的下标(从 1 开始), 可以通过这些下标数字来获取捕获子模式匹配结果。

重复/量词
  • 通过量词指定的,可以紧跟在下面元素之后的

    • 单独字符
    • 元字符
    • 字符类
    • 后向引用
    • 子组
  • 一般的重复量词指定了一个最小数值和一个最大数值的匹配次数, 通过花括号包裹两个数字,两个数字之间用逗号隔开的语法定义

  • 单字符量词

    *等价于 {0,}
    +等价于 {1,}
    ?等价于 {0,1}
后向引用
  • 在一个字符类外面, 反斜线紧跟一个大于 0 (可能还有一位数)的数字就是一个到模式中之前出现的某个捕获组的后向引用。
;