PHP基础

Apache配置

安装配置(这里以2.4版本为例)

  • 官网下载安装包(若官网下载十分缓慢推荐地址:http://8dx.pc6.com/xjq6/ApacheHTTPServer2433.zip)
  • 解压到指定文件夹,修改配置文件httpd.conf(路径:conf --> httpd.conf)
    • ServerRoot "你的安装目录" (注意:这里路径使用反斜杠 /
    • Listen 80 (若出现端口冲突则更改当前的端口号)
    • ServerName 服务名称 (localhost即可,端口可不带)
    • DocumentRoot "你的安装目录/htdocs" (htdos为你的网络文件夹名称)
  • 配置为系统服务httpd.exe -k install

查看当前使用模块

  • 在bin目录下使用httpd.exe -M 查看当前使用的模块
    • static:静态加载(随apache启动加载,之后可以直接使用)
    • share:动态加载(按需加载)

验证配置文件是否有效

  • 在bin目录下使用httpd.exe -t 查看当前使用的模块
  • Syntax OK :可以使用(并非无任何异常)

配置默认站点

  • 让Apache确定服务器上访问的位置(也就是网络文件夹所在位置)
    • 相关配置文件:httpd.conf 中的 DocumentRoot字段
  • 为方便使用为对应文件夹取别名
    • 相关配置文件:httpd.conf 中的 ServerName字段(端口号可以在listen字段中配置)
  • 实现DNS域名解析(通常默认站点是本地DNS:host文件)
    • 修改本地DNS域名解析(本地host文件路径:C:\Windows\System32\drivers\etc)

Tip:凡是涉及到配置修改动作时,完成后务必检查配置文件是否有效,并重启服务

Tip:一般默认的localhost对应的就是127.0.0.1

PHP配置

安装配置(这里以7.1.4版本为例)

  • 默认apache是不能直接解析php文件的,所以我们需要安装php来解析php文件

  • 下载压缩包文件(若官网下载十分缓慢推荐地址:http://jvniu.jb51.net:81/201704/tools/php-7.1.4-Win32-VC14-x64.zip)

  • 解压到指定文件夹

  • 复制一份文件 php.ini-development ,并将其名称改为 php.ini ,修改其配置

    • extension_dir = "你的安装路径" (前面的分号去掉)
  • 在apache中使用,修改apache中的配置文件 httpd.conf(路径:conf --> httpd.conf)

    • 在末尾加上

      LoadModule php7_module 你的php所在路径/php7apache2_4.dll
      PHPIniDir "你的php所在路径"
      AddType application/x-httpd-php .php .html .htm
      
  • 在apache的 bin 目录下使用httpd.exe -t 验证是否有误(Syntax OK 可以使用)

  • 连接mysql,只需引入响应模块,也就是去除 extension=php_mysqli.dll 前的分号启用

  • 配置时区:date.timezone = PRC

虚拟主机

什么是虚拟主机

  • Virtual Machine,简单的说就是并非真实存在的主机,但是可以实现真实主机的相应功能
  • 通俗来说:虚拟主机就是将计算机中的不同文件夹进行不同的命名,然后可以实现让服务器(Apache)根据用户的需求从不同的文件夹(网站)中读取不同的内容。
  • 在Apache中可以将虚拟主机分为两类
    1. 基于IP的虚拟主机:也就是一台电脑使用多个IP,每个IP对应一个网站
      • 原理:一台电脑配置多个网卡
    2. 基于域名的虚拟主机,单个IP制作多个网站,给每个网站不同的名字(虚拟主机名)

PHP初识

初识

  • PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
  • 可以嵌入到HTML中
  • PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
  • PHP 脚本在服务器上执行。
  • PHP 可免费下载使用。
  • PHP 是一门弱类型语言

PHP文件

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

PHP可以做什么

  • PHP 可以生成动态页面内容
  • PHP 可以创建、打开、读取、写入、关闭服务器上的文件
  • PHP 可以收集表单数据
  • PHP 可以发送和接收 cookies
  • PHP 可以添加、删除、修改您的数据库中的数据
  • PHP 可以限制用户访问您的网站上的一些页面
  • PHP 可以加密数据

PHP代码标记

  • ASP标记(基本弃用):<% php代码 %>
  • 短标记(基本弃用):
  • 脚本标记:
  • 标准标记(常用):

基础语法

个人感觉编程语言总的来说都有一定的相似性,有过一门或者几门编程语言的学习基础的话,再接触学习新语言就会快很多(这里只是粗略整理PHP的相关知识)

规则

  • PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
  • 可以省略末尾的?> ,让其自动判断php代码的结束(避免产生较多空行)

注释

  • 单行注释使用 // ···
  • 多行注释使用 /* ··· */

变量

  • 变量是用于存储信息的"容器"
  • 示例:$x=5; $z=$x+$y; echo $z;
  • 与代数类似,可以给 PHP 变量赋予某个值(x=5)或者表达式(z=x+y)。
  • 变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。
  • PHP 变量规则:
    • 变量以 $ 符号开始,后面跟着变量的名称
    • 变量名必须以字母或者下划线字符开始
    • 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
    • 变量名不能包含空格
    • 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
  • 删除变量:unset()
  • 变量作用域
    • local
    • global
    • static
    • parameter

Tip:在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。

Tip:在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问

Tip:PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。

Tip:当一个函数完成时,它的所有变量通常都会被删除。若需要保留某局部变量使用static 关键字

Tip:$a = 'b'; $b = 'bb'; $$a = 'bb'

Tip:参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的,作为函数声明的一部分

  • 预定义变量
    • $_GET 获取所有表单以get方式提交的数据
    • $_POST post方式提交的数据
    • $_REQUEST get和post方式提交的数据
    • $_GLOBALS 所有全局变量
    • $_SERVER 服务器信息
    • $_SESSION session会话数据
    • $_COOKIE cookie会话数据
    • $_ENV 环境信息
    • $_FILES 用户上传文件信息

变量传值

  • 了解内存

    • 栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快
    • 代码区:存储程序的内存部分(不执行)
    • 数据段:存储普通数据(全局区和静态区)
    • 堆区:存储复杂数据,大但是效率低
  • 值传递

    • 将变量保存的值复制一份,然后将新的值传递给另外一个变量保存(两个变量相互独立没有关系)
    • 示例:$a = 1; $b = $a
      1. 代码装载:从脚本文件中将代码读取出来进行编译,将编译的结果放置在代码段(字节码)
      2. 代码执行:从代码段中按照一定的顺序执行代码,执行$a = 1 在栈区开辟一块内存存储$a ,在数据段中开辟一块内存保存值1 然后将其所在的内存位置赋给a 变量;执行$b = $a 在栈区开辟一块内存存储$b ,取出 $a 的值将其保存在数据段,将所在值的内存地址赋给$b
      3. 脚本执行结束,系统会回收所占有的内存(栈区、代码段)
  • 引用传递

    • 将变量保存值的内存地址传递给另一个变量(两个变量指向的是同一个值的内存地址)
    • 示例:$a = 1; $b = &$a
      1. 代码装载:从脚本文件中将代码读取出来进行编译,将编译的结果放置在代码段(字节码)
      2. 代码执行:从代码段中按照一定的顺序执行代码,执行$a = 1 在栈区开辟一块内存存储$a ,在数据段中开辟一块内存保存值1 然后将其所在的内存位置赋给a 变量;执行$b = &$a ,将 $a 对应的值的内存地址赋给$b
      3. 脚本执行结束,系统会回收所占有的内存(栈区、代码段)

常量

  • 常量值被定义后,在脚本的其他任何地方都不能被改变。
  • 常量是一个简单值的标识符。该值在脚本中不能改变。
  • 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。

Tip: 常量在整个脚本中都可以使用,默认为全局变量。

  • 设置常量,使用 define() 函数,语法:define ( string $name , mixed $value [, bool $case_insensitive = false ] )

    • 该函数有三个参数:
      • name:必选参数,常量名称,即标志符。
      • value:必选参数,常量的值。
      • case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
    • 示例:define('PI', 3.14); 或者 const PII = 3;
  • 系统常量:简要了解这里不再赘述

  • 几个魔术常量:

    • __ DIR__:当前被执行脚本所在绝对路径

    • __ FILE__:当前被执行脚本所在绝对路径+当前文件名

    • __ LINK__:当前所属行数

    • __ NAMESPACE__:当前所属命名空间

    • __ CLASS__:当前所属类

    • __ METHOD__:当前所属方法

数据类型

  • 基本数据类型
    • 整型:int/integer,系统分配四个字节存储,标识整数类型(有前提)
      • 整数必须至少有一个数字 (0-9)
      • 整数不能包含逗号或空格
      • 整数是没有小数点的
      • 整数可以是正数或负数
      • 整型可以用四种格式来指定:十进制, 十六进制( 前缀0x )、八进制(前缀为 0)、二进制(前缀0b)。
    • 浮点型:float/double,系统分配八个字节存储,表示小数或者整型存不下的整数(不能保存精确数值)
      • 浮点数是带小数部分的数字,或是指数形式
    • 字符串:string,系统根据实际长度分配,表示字符串(引号包裹)
    • 布尔值:bool/Boolean,true或者false

Tip:默认PHP输出数值都会转换为十进制输出,但是提供了进制转换的一些函数

  • 复合数据类型
    • 对象类型:object,存放对象
    • 数组类型:array,存放多个数据
  • 特殊数据类型
    • 资源类型:resource,存放资源数据(PHP外部数据)
    • 空类型:NULL(不能运算)
      • 可以通过设置变量值为 NULL 来清空变量数据

类型转换

  • 自动转换:系统根据自身的需求自己判定,自动转换
  • 强制转换:根据自己所需的类型将目标数据转换
  • 函数比较
表达式 gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null; NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE
  • 松散比较==
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE
1 TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
-1 TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
"1" TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
array() FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
"php" TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
  • 严格比较===
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
1 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
-1 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
"1" FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
array() FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
"php" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
  • 强制类型转换:(数据类型)需要转换的数据或者变量,示例:$a = '1.1.1abc'; echo (float)$a
    • 转换为NULL使用(unset)$a
  • is_type() :返回一个布尔值,用于查看指定数据是否为某类型的数据(bool类型不能使用echo 查看,需要使用var_dump
  • gettype(变量名) :获取类型,得到的是该类型对应的字符串
  • settype(变量名,类型) :设定变量的类型
  • empty():判断数据是否为空(并非NULL),为空返回true,否则返回false
  • isset():判断数据存储的变量本身是否存在,存在返回true,否则返回false

运算符

  • 算术运算符

    运算符 名称 描述 实例 结果
    x + y x 和 y 的和 2 + 2 4
    x - y x 和 y 的差 5 - 2 3
    x * y x 和 y 的积 5 * 2 10
    x / y x 和 y 的商 15 / 5 3
    x % y 模(除法的余数) x 除以 y 的余数 5 % 2 10 % 8 10 % 2 1 2 0
    - x 取反 x 取反 -2
    a . b 并置 连接两个字符串 "Hi" . "Ha" HiHa
    • PHP7+ 版本新增整除运算符 intdiv()
  • 赋值运算符

    运算符 等同于 描述
    x = y x = y 左操作数被设置为右侧表达式的值
    x += y x = x + y
    x -= y x = x - y
    x *= y x = x * y
    x /= y x = x / y
    x %= y x = x % y 模(除法的余数)
    a .= b a = a . b 连接两个字符串
  • 递增递减运算符

    运算符 名称 描述
    ++ x 预递增 x 加 1,然后返回 x
    x ++ 后递增 返回 x,然后 x 加 1
    -- x 预递减 x 减 1,然后返回 x
    x -- 后递减 返回 x,然后 x 减 1
    • 使用时注意! $a = 1; $b = $a++; // $b = 1$c = ++$a; // $c = 3
  • 比较运算符

    运算符 名称 描述 实例
    x == y 等于 如果 x 等于 y,则返回 true 5==8 返回 false
    x === y 绝对等于 如果 x 等于 y,且它们类型相同,则返回 true 5==="5" 返回 false
    x != y 不等于 如果 x 不等于 y,则返回 true 5!=8 返回 true
    x <> y 不等于 如果 x 不等于 y,则返回 true 5<>8 返回 true
    x !== y 绝对不等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5" 返回 true
    x > y 大于 如果 x 大于 y,则返回 true 5>8 返回 false
    x < y 小于 如果 x 小于 y,则返回 true 5<8 返回 true
    x >= y 大于等于 如果 x 大于或者等于 y,则返回 true 5>=8 返回 false
    x <= y 小于等于 如果 x 小于或者等于 y,则返回 true 5<=8 返回 true
  • 逻辑运算符

    运算符 名称 描述 实例
    x and y 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 and y > 1) 返回 true
    x or y 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x6 or y5) 返回 true
    x xor y 异或 如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x6 xor y3) 返回 false
    x && y 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 && y > 1) 返回 true
    x || y 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x5 || y5) 返回 false
    ! x 如果 x 不为 true,则返回 true x=6 y=3 !(x==y) 返回 true
  • 数组运算符

    运算符 名称 描述
    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
  • 位运算符

    例子 名称 结果
    $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
    $a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
    $a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
    ~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
    $a << $b Shift left(左移) 将 a 中的位向左移动 ​b 次(每一次移动都表示“乘以 2”)。
    $a >> $b Shift right(右移) 将 a 中的位向右移动 b 次(每一次移动都表示“除以 2”)。
  • 三元运算符(expr1) ? (expr2) : (expr3)

    • 对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
    • 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
    • ($b) ? $c = 1 : $c = 0; 等价于 $c = ($b) ? 1 : 0;

Tip:PHP_EOL 是一个换行符,兼容更大平台。

  • 组合比较符

    • PHP7+ 支持组合比较符(combined comparison operator)也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。
    • 语法格式:$c = $a <=> $b;
      • 如果 $a > $b, 则 $c 的值为 1
      • 如果 $a == $b, 则 $c 的值为 0
      • 如果 $a < $b, 则 $c 的值为 -1
  • 运算符优先级

    • 下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。
    结合方向 运算符 附加信息
    clone new clone 和 new
    [ array()
    ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减
    instanceof 类型
    ! 逻辑运算符
    * / % 算术运算符
    + – . 算术运算符和字符串运算符
    << >> 位运算符
    == != === !== <> 比较运算符
    & 位运算符和引用
    ^ 位运算符
    | 位运算符
    && 逻辑运算符
    || 逻辑运算符
    ? : 三元运算符
    = += -= *= /= .= %= &= |= ^= <<= >>= => 赋值运算符
    and 逻辑运算符
    xor 逻辑运算符
    or 逻辑运算符
    , 多处用到

Tip:我们通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。

Tip:错误抑制符@ :在可能发生错误的代码前使用该符号并将其使用括号包裹

If···Else语句

  • 条件语句用于根据不同条件执行不同动作。

  • if 语句 - 在条件成立时执行代码

  • if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码

  • if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块

  • if 语句用于仅当指定条件成立时执行代码

    • 语法示例:

      if (条件)
      {
          条件成立时要执行的代码;
      }
      
  • 在条件成立时执行一块代码,条件不成立时执行另一块代码,请使用 if....else 语句。

    • 语法示例:

      if (条件)
      {
      条件成立时执行的代码;
      }
      else
      {
      条件不成立时执行的代码;
      }
      
  • 在若干条件之一成立时执行一个代码块,请使用 if....elseif...else 语句。

    • 示例语法:

      if (条件)
      {
          if 条件成立时执行的代码;
      }
      elseif (条件)
      {
          elseif 条件成立时执行的代码;
      }
      else
      {
          条件不成立时执行的代码;
      }
      

Switch语句

  • switch 语句用于根据多个不同条件执行不同动作。

  • 希望有选择地执行若干代码块之一,请使用 switch 语句。

    • 语法示例:

      switch (n)
      {
      case label1:
          如果 n=label1,此处代码将执行;
          break;
      case label2:
          如果 n=label2,此处代码将执行;
          break;
      default:
          如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
      }
      
    • 工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。

For循环

  • 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。

  • 语法示例:

    for (初始值; 条件; 增量)
    {
        要执行的代码;
    }
    
    • 参数:
      • 初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。
      • 条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
      • 增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。

While循环

  • while 循环将重复执行代码块,直到指定的条件不成立。

  • 语法示例:

    while (条件)
    {
        要执行的代码;
    }
    
  • do...while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。

  • 语法示例:

    do
    {
        要执行的代码;
    }
    while (条件);
    

Tip:continue在循环结构中使用会跳过再次之后的代码进行新一轮循环

Tip:break在循环结构中使用会结束循环

在HTML中的嵌套写法

  • 示例代码,九九乘法表

        

Echo和Print

  • 在 PHP 中有两个基本的输出方式: echo 和 print。

  • echo 和 print 区别:

    • echo - 可以输出一个或多个字符串
    • print - 只允许输出一个字符串,返回值总为 1
  • echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。

Tip:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

  • print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。

Tip:在print输出的字符串中同时输出变量,该变量需要使用{}包裹

时间相关函数

  • date() :可把时间戳格式化为可读性更好的日期和时间。

  • 语法:string date ( string $format [, int $timestamp ] )

    • date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。
      • d - 代表月中的天 (01 - 31)
      • m - 代表月 (01 - 12)
      • Y - 代表年 (四位数)
  • 示例:date("Y/m/d")

  • 参考

    format 字符 说明 返回值例子
    --- ---
    d 月份中的第几天,有前导零的 2 位数字 0131
    D 星期中的第几天,文本表示,3 个字母 MonSun
    j 月份中的第几天,没有前导零 131
    l("L"的小写字母) 星期几,完整的文本格式 SundaySaturday
    N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
    S 每月天数后面的英文后缀,2 个字符 stndrd 或者 th。可以和 j 一起用
    w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
    z 年份中的第几天 0365
    星期 --- ---
    W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
    --- ---
    F 月份,完整的文本格式,例如 January 或者 March JanuaryDecember
    m 数字表示的月份,有前导零 0112
    M 三个字母缩写表示的月份 JanDec
    n 数字表示的月份,没有前导零 112
    t 给定月份所应有的天数 2831
    --- ---
    L 是否为闰年 如果是闰年为 1,否则为 0
    o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
    Y 4 位数字完整表示的年份 例如:19992003
    y 2 位数字表示的年份 例如:9903
    时间 --- ---
    a 小写的上午和下午值 ampm
    A 大写的上午和下午值 AMPM
    B Swatch Internet 标准时 000999
    g 小时,12 小时格式,没有前导零 112
    G 小时,24 小时格式,没有前导零 023
    h 小时,12 小时格式,有前导零 0112
    H 小时,24 小时格式,有前导零 0023
    i 有前导零的分钟数 0059>
    s 秒数,有前导零 0059>
    u 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 示例: 654321
    时区 --- ---
    e 时区标识(PHP 5.1.0 新加) 例如:UTCGMTAtlantic/Azores
    I 是否为夏令时 如果是夏令时为 1,否则为 0
    O 与格林威治时间相差的小时数 例如:+0200
    P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00
    T 本机所在的时区 例如:ESTMDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。
    Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -4320043200
    完整的日期/时间 --- ---
    c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
    r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
    U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time()
  • time() :返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数

  • microtime() :获取微秒级别的时间

数组

  • 数组是一个能在单个变量中存储多个值的特殊变量。

  • array() 函数用于创建数组

  • 在 PHP 中,有三种类型的数组:

    • 数值数组 - 带有数字 ID 键的数组
    • 关联数组 - 带有指定的键的数组,每个键关联一个值
    • 多维数组 - 包含一个或多个数组的数组
  • 数值数组

    • 示例:$a = array('Tom', 'Jack', 'Alice'); echo $a[0], $a[1], $a[2];
    • 示例2:$a[] = 1
    • 获取数组长度 count()
  • 关联数组

    • 关联数组是使用您分配给数组的指定的键的数组。

    • 示例:$a = array('name'=>'Tom', 'age'=>12, 'id'=>001); $a['mark'] = true; echo $a['name'];

    • 遍历关联数组

              foreach($a as $x=>$x_value)
              {
                  echo $x.'对应值为:'.$x_value;
                  echo '
      '; }
  • 常用函数

    • list() 函数用于在一次操作中给一组变量赋值。(只用于数字索引的数组。)

      • 语法:list(*var1,var2...*)
      参数 描述
      var1 必需。第一个需要赋值的变量。
      var2,... 可选。更多需要赋值的变量。
    • reset() 函数将内部指针指向数组中的第一个元素,并输出。

      • 相关的方法:
        • current() - 返回数组中的当前元素的值。
        • end() - 将内部指针指向数组中的最后一个元素,并输出。
        • next() - 将内部指针指向数组中的下一个元素,并输出。
        • prev() - 将内部指针指向数组中的上一个元素,并输出。
      • 语法:reset(*array*)
    • count() 函数返回数组中元素的数目。

      • 语法:count(*array,mode*);
      参数 描述
      array 必需。规定要计数的数组。
      mode 可选。规定函数的模式。可能的值:0 - 默认。不计算多维数组中的所有元素。1 - 递归地计算数组中元素的数目(计算多维数组中的所有元素)。
    • array_push() 函数向数组尾部插入一个或多个元素。

      • 语法:array_push(*array,value1,value2...*)
      参数 描述
      array 必需。规定一个数组。
      value1 必需。规定要添加的值。
      value2 可选。规定要添加的值。
    • array_pop() 函数删除数组中的最后一个元素。

      • 语法:array_pop(*array*)
    • array_shift() 函数用于删除数组中的第一个元素,并返回被删除的元素。

    • array_unshift()函数用于向数组插入新元素。新数组的值将被插入到数组的开头。

      • 语法:array_unshift(*array,value1,value2,value3...*)
      参数 描述
      array 必需。规定数组。
      value1 必需。规定插入的值。
      value2 可选。规定插入的值。
      value3 可选。规定插入的值。
    • array_unique() 函数用于移除数组中重复的值。如果两个或更多个数组值相同,只保留第一个值,其他的值被移除。

      • 语法:array_unique(*array*)
      参数 描述
      array 必需。规定数组。
      sortingtype 可选。规定排序类型。可能的值:SORT_STRING - 默认。把每一项作为字符串来处理。SORT_REGULAR - 把每一项按常规顺序排列(Standard ASCII,不改变类型)。SORT_NUMERIC - 把每一项作为数字来处理。SORT_LOCALE_STRING - 把每一项作为字符串来处理,基于当前区域设置(可通过 setlocale() 进行更改)。
    • in_array() 函数搜索数组中是否存在指定的值。

      • 语法:bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
      参数 描述
      needle 必需。规定要在数组搜索的值。
      haystack 必需。规定要搜索的数组。
      strict 可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。
    • array_keys() 函数返回包含数组中所有键名的一个新数组。

      • 语法:array_keys(*array,value,strict*)
      参数 描述
      array 必需。规定数组。
      value 可选。您可以指定键值,然后只有该键值对应的键名会被返回。
      strict 可选。与 value 参数一起使用。可能的值:true - 返回带有指定键值的键名。依赖类型,数字 5 与字符串 "5" 是不同的。false - 默认值。不依赖类型,数字 5 与字符串 "5" 是相同的。
    • array_values() 函数返回包含数组中所有的值的数组。

  • 数组排序函数总结:

    • sort() - 对数组进行升序排列
    • rsort() - 对数组进行降序排列
    • asort() - 根据关联数组的值,对数组进行升序排列
    • ksort() - 根据关联数组的键,对数组进行升序排列
    • arsort() - 根据关联数组的值,对数组进行降序排列
    • krsort() - 根据关联数组的键,对数组进行降序排列
  • 参考

    函数 描述
    array() 创建数组。
    array_change_key_case() 返回其键均为大写或小写的数组。
    array_chunk() 把一个数组分割为新的数组块。
    array_column() 返回输入数组中某个单一列的值。
    array_combine() 通过合并两个数组(一个为键名数组,一个为键值数组)来创建一个新数组。
    array_count_values() 用于统计数组中所有值出现的次数。
    array_diff() 比较数组,返回两个数组的差集(只比较键值)。
    array_diff_assoc() 比较数组,返回两个数组的差集(比较键名和键值)。
    array_diff_key() 比较数组,返回两个数组的差集(只比较键名)。
    array_diff_uassoc() 比较数组,返回两个数组的差集(比较键名和键值,使用用户自定义的键名比较函数)。
    array_diff_ukey() 比较数组,返回两个数组的差集(只比较键名,使用用户自定义的键名比较函数)。
    array_fill() 用给定的键值填充数组。
    array_fill_keys() 用给定的指定键名的键值填充数组。
    array_filter() 用回调函数过滤数组中的元素。
    array_flip() 反转/交换数组中的键名和对应关联的键值。
    array_intersect() 比较数组,返回两个数组的交集(只比较键值)。
    array_intersect_assoc() 比较数组,返回两个数组的交集(比较键名和键值)。
    array_intersect_key() 比较数组,返回两个数组的交集(只比较键名)。
    array_intersect_uassoc() 比较数组,返回两个数组的交集(比较键名和键值,使用用户自定义的键名比较函数)。
    array_intersect_ukey() 比较数组,返回两个数组的交集(只比较键名,使用用户自定义的键名比较函数)。
    array_key_exists() 检查指定的键名是否存在于数组中。
    array_keys() 返回数组中所有的键名。
    array_map() 将用户自定义函数作用到给定数组的每个值上,返回新的值。
    array_merge() 把一个或多个数组合并为一个数组。
    array_merge_recursive() 递归地把一个或多个数组合并为一个数组。
    array_multisort() 对多个数组或多维数组进行排序。
    array_pad() 将指定数量的带有指定值的元素插入到数组中。
    array_pop() 删除数组中的最后一个元素(出栈)。
    array_product() 计算数组中所有值的乘积。
    array_push() 将一个或多个元素插入数组的末尾(入栈)。
    array_rand() 从数组中随机选出一个或多个元素,返回键名。
    array_reduce() 通过使用用户自定义函数,迭代地将数组简化为一个字符串,并返回。
    array_replace() 使用后面数组的值替换第一个数组的值。
    array_replace_recursive() 递归地使用后面数组的值替换第一个数组的值。
    array_reverse() 将原数组中的元素顺序翻转,创建新的数组并返回。
    array_search() 在数组中搜索给定的值,如果成功则返回相应的键名。
    array_shift() 删除数组中的第一个元素,并返回被删除元素的值。
    array_slice() 返回数组中的选定部分。
    array_splice() 把数组中的指定元素去掉并用其它值取代。
    array_sum() 返回数组中所有值的和。
    array_udiff() 比较数组,返回两个数组的差集(只比较键值,使用一个用户自定义的键名比较函数)。
    array_udiff_assoc() 比较数组,返回两个数组的差集(比较键名和键值,使用内建函数比较键名,使用用户自定义函数比较键值)。
    array_udiff_uassoc() 比较数组,返回两个数组的差集(比较键名和键值,使用两个用户自定义的键名比较函数)。
    array_uintersect() 比较数组,返回两个数组的交集(只比较键值,使用一个用户自定义的键名比较函数)。
    array_uintersect_assoc() 比较数组,返回两个数组的交集(比较键名和键值,使用内建函数比较键名,使用用户自定义函数比较键值)。
    array_uintersect_uassoc() 比较数组,返回两个数组的交集(比较键名和键值,使用两个用户自定义的键名比较函数)。
    array_unique() 删除数组中重复的值。
    array_unshift() 在数组开头插入一个或多个元素。
    array_values() 返回数组中所有的值。
    array_walk() 对数组中的每个成员应用用户函数。
    array_walk_recursive() 对数组中的每个成员递归地应用用户函数。
    arsort() 对关联数组按照键值进行降序排序。
    asort() 对关联数组按照键值进行升序排序。
    compact() 创建一个包含变量名和它们的值的数组。
    count() 返回数组中元素的数目。
    current() 返回数组中的当前元素。
    each() 返回数组中当前的键/值对。
    end() 将数组的内部指针指向最后一个元素。
    extract() 从数组中将变量导入到当前的符号表。
    in_array() 检查数组中是否存在指定的值。
    key() 从关联数组中取得键名。
    krsort() 对关联数组按照键名降序排序。
    ksort() 对关联数组按照键名升序排序。
    list() 把数组中的值赋给一些数组变量。
    natcasesort() 用"自然排序"算法对数组进行不区分大小写字母的排序。
    natsort() 用"自然排序"算法对数组排序。
    next() 将数组中的内部指针向后移动一位。
    pos() current() 的别名。
    prev() 将数组的内部指针倒回一位。
    range() 创建一个包含指定范围的元素的数组。
    reset() 将数组的内部指针指向第一个元素。
    rsort() 对数值数组进行降序排序。
    shuffle() 把数组中的元素按随机顺序重新排列。
    sizeof() count() 的别名。
    sort() 对数值数组进行升序排序。
    uasort() 使用用户自定义的比较函数对数组中的键值进行排序。
    uksort() 使用用户自定义的比较函数对数组中的键名进行排序。
    usort() 使用用户自定义的比较函数对数组进行排序。

函数

  • 创建函数

    function functionName($a, $b, ···)
    {
        // 要执行的代码
    }
    
    • PHP 函数准则:
      • 函数的名称应该提示出它的功能
      • 函数名称以字母或下划线开头(不能以数字开头)
      • 参数就在函数名称后面的一个括号内指定。
      • 可以通过return关键字让函数返回一个值
      • 可以在指定形参的时候为其赋一个初始值(指定初始值的参数需放在最后)

Tip:若在形参前加上& 意为将传入实参的内存地址赋值给该形参(注意!此时形参对应的是真实的实参数据,且只有变量能够被引用传值)

  • 可变函数:当一个变量所保存的值刚好是一个函数的名字,那么就可以使用该变量名() 的方式来调用对应的函数

  • 示例

            $a = 'fun1';
    
            function fun1()
            {
                echo __FUNCTION__;
            }
    
            fun1();
            $a();
    

Tip:将一个函数(函数名)作为参数传递给另一个函数区调用称之为回调过程,该函数被称之为回调函数

  • 匿名函数$a = function(){···}; ,调用方法同可变函数

  • 闭包closure:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及他们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)

    • 简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行完毕后没有被释放,是因为在函数内部还有对应的函数在引用(匿名函数)

    • 示例:

      // use将外部的变量(局部)保留给内部使用。注意!貌似不同于python和JavaScript
      
              function fun1()
              {
                  $a = 1;
      
                  $b = function() use($a)
                  {
                      echo $a;
                  };
      
                  return $b;
              }
      
              $closureVar = fun1();
              $closureVar();
      

错误

  • 错误分类
    • 语法错误:书写的代码不符合PHP规范,编译不通过,代码不会执行(Paesr error)
    • 运行时错误:代码编译通过,但是在执行的时候会出现一些条件不满足导致的错误(Runtime error)
    • 逻辑错误:代码不规范,出现一些逻辑性的错误,代码正常执行,但是得到的是错误的结果
  • 错误代号
    • E_PARSE:编译错误,代码不会执行
    • E_ERROR:fatal error,致命错误,会导致代码不能正确继续执行(会在出错误的位置停止)
    • E_WARNING:警告,不会影响代码的执行,但是可能得不到正确的结果
    • E_NOTICE:提示通知,不会影响代码的执行
  • 主动触发错误
    • trigger_error(提示信息)

字符串

  • 可以使用单引号或者双引号来定义一个字符串

    • 双引号中可以使用$ 前缀来输出变量(变量字符末尾需要添加空格与内容区分),或者使用{}包裹
  • 结构化定义(保留当前字符串的格式)

            $a = <<
  • 字符串转义

    • \'
    • \''
    • \r 回车(回到行首)
    • \n 新一行
    • \t 类似tab,输出4个空格
    • \$ 特定识别变量符号

Tip:在单双引号中所能识别的转义字符不同

  • 获取字符串长度strlen(),按照标准字符集统计(若需要指定特殊的字符集统需要使用mbstring模块)

  • 相关常用函数

    • implode() 函数返回一个由数组元素组合成的字符串。

      • 语法:implode(*separator,array)
      参数 描述
      separator 可选(但是推荐使用)。规定数组元素之间放置的内容。默认是 ""(空字符串)。
      array 必需。要组合为字符串的数组。
    • explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

      • 语法:explode(*separator,string,limit*)
      参数 描述
      separator 必需。规定在哪里分割字符串。
      string 必需。要分割的字符串。
      limit 可选。规定所返回的数组元素的数目。可能的值:大于 0 - 返回包含最多 limit 个元素的数组小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组0 - 会被当做 1, 返回包含一个元素的数组
    • str_split() 函数把字符串分割到数组中。

      • 语法:str_split(*string,length*)
      参数 描述
      string 必需。规定要分割的字符串。
      length 可选。规定每个数组元素的长度。默认是 1。
    • trim() 函数移除字符串两侧的空白字符或其他预定义字符。

      • ltrim() - 移除字符串左侧的空白字符或其他预定义字符。
      • rtrim() - 移除字符串右侧的空白字符或其他预定义字符
      • 语法:trim(*string,charlist*)
      参数 描述
      string 必需。规定要检查的字符串。
      charlist 可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:"\0" - NULL;"\t" - 制表符;"\n" - 换行;"\x0B" - 垂直制表符;"\r" - 回车" " - 空格
    • substr() 函数返回字符串的一部分。

      • 语法:substr(*string,start,length*)
      参数 描述
      string 必需。规定要返回其中一部分的字符串。
      start 必需。规定在字符串的何处开始。正数 - 在字符串的指定位置开始;负数 - 在从字符串结尾的指定位置开始;0 - 在字符串中的第一个字符处开始
      length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。正数 - 从 start 参数所在的位置返回;负数 - 从字符串末端返回
    • strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。

      • 语法:strstr(*string,search,before_search*)
      参数 描述
      string 必需。规定被搜索的字符串。
      search 必需。规定要搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
      before_search 可选。一个默认值为 "false" 的布尔值。如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。
    • strtolower() 函数把字符串转换为小写。

      • strtoupper() - 把字符串转换为大写
      • lcfirst() - 把字符串中的首字符转换为小写
      • ucfirst() - 把字符串中的首字符转换为大写
      • ucwords() - 把字符串中每个单词的首字符转换为大写
      • 语法strtolower(*string*)
      参数 描述
      string 必需。规定要转换的字符串。
    • ucfirst() 函数把字符串中的首字符转换为大写。

      • lcfirst() - 把字符串中的首字符转换为小写
      • ucwords() - 把字符串中每个单词的首字符转换为大写
      • strtoupper() - 把字符串转换为大写
      • strtolower() - 把字符串转换为小写
      • 语法:ucfirst(*string*)
      参数 描述
      string 必需。规定要转换的字符串。
    • strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

      • strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
      • stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
      • strripos() -查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
      • 语法:strpos(*string,find,start*)
      参数 描述
      string 必需。规定被搜索的字符串。
      find 必需。规定要查找的字符。
      start 可选。规定开始搜索的位置。
    • substr_replace() 函数把字符串的一部分替换为另一个字符串。

      • 语法:substr_replace(*string,replacement,start,length*)
      参数 描述
      string 必需。规定要检查的字符串。
      replacement 必需。规定要插入的字符串。
      start 必需。规定在字符串的何处开始替换。正数 - 在字符串的指定位置开始;负数 - 在从字符串结尾的指定位置开始;0 - 在字符串中的第一个字符处开始
      length 可选。规定要替换多少个字符。默认是与字符串长度相同。正数 - 被替换的字符串长度;负数 - 从字符串末端开始的被替换字符数;0 - 插入而非替换
    • printf() 函数输出格式化的字符串。

      • arg1、arg2、++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
      • 语法:printf(*format,arg1,arg2,arg++*)
      参数 描述
      format 在后面···
      arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
      arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
      arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。
      • 参数format:

      • 必需。规定字符串以及如何格式化其中的变量。

        可能的格式值:

        • %% - 返回一个百分号 %
        • %b - 二进制数
        • %c - ASCII 值对应的字符
        • %d - 包含正负号的十进制数(负数、0、正数)
        • %e - 使用小写的科学计数法(例如 1.2e+2)
        • %E - 使用大写的科学计数法(例如 1.2E+2)
        • %u - 不包含正负号的十进制数(大于等于 0)
        • %f - 浮点数(本地设置)
        • %F - 浮点数(非本地设置)
        • %g - 较短的 %e 和 %f
        • %G - 较短的 %E 和 %f
        • %o - 八进制数
        • %s - 字符串
        • %x - 十六进制数(小写字母)
        • %X - 十六进制数(大写字母)

        附加的格式值。必需放置在 % 和字母之间(例如 %.2f):

        • + (在数字前面加上 + 或 - 来定义数字的正负性。默认情况下,只有负数才做标记,正数不做标记)
        • ' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。例如:%'x20s(使用 "x" 作为填充))
        • - (左调整变量值)
        • [0-9] (规定变量值的最小宽度)
        • .[0-9] (规定小数位数或最大字符串长度)

    Tip:如果使用多个上述的格式值,它们必须按照上面的顺序进行使用,不能打乱。

    • sprintf() 函数把格式化的字符串写入一个变量中。
      • arg1、arg2、++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
      • 语法sprintf(*format,arg1,arg2,arg++*)
      • 参数同printf()
    • str_shuffle() 函数随机地打乱字符串中的所有字符。
      • 语法:str_shuffle(*string*)

面向对象

  • 在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。

  • 对象的主要三个特性:

    • 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
    • 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
    • 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
  • 定义语法

    class phpClass {
      var $var1;
      var $var2 = "constant string";
      
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
    }
    
    • 类使用 class 关键字后加上类名定义。
    • 类名后的一对大括号({})内可以定义变量和方法。
    • 类的变量使用 var 来声明, 变量也可以初始化值。
    • 函数定义类似 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;
      }
    }
    
    • 变量 $this 代表自身的对象。
    • PHP_EOL 为换行符。
  • 类创建后,我们可以使用 new 运算符来实例化该类的对象$google = new Site;

  • 在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量$google->setTitle( "Google 搜索" ); $google->setUrl( 'www.google.com' ); $google->getTitle(); $google->getUrl();

  • 构造函数

    • 构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

    • 上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量

      function __construct( $par1, $par2 ) {
         $this->url = $par1;
         $this->title = $par2;
      }
      
    • 这样就可以省略set相关的函数了

      class Site {
        /* 成员变量 */
        function __construct( $par1, $par2 ) {
           $this->url = $par1;
           $this->title = $par2;
        }
        
        /* 成员函数 */  
        function getUrl(){
           echo $this->url . PHP_EOL;
        }
        
        function getTitle(){
           echo $this->title . PHP_EOL;
        }
      }
      
  • 析构函数

    • 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。

    • 示例

         function __destruct() {
             print "销毁 " . $this->name . "\n";
         }
      
  • 继承

    • PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承

    • 示例

      class Child extends Parent {
         // 代码部分
      }
      
    • 示例

      class Child_Site extends Site {
         var $category;
      
          function setCate($par){
              $this->category = $par;
          }
        
          function getCate(){
              echo $this->category . PHP_EOL;
          }
      }
      
  • 访问控制

    • PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
      • public(公有):公有的类成员可以在任何地方被访问。
      • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
      • private(私有):私有的类成员则只能被其定义所在的类访问。
      • 如果用 var 定义,则被视为公有。
  • 接口

    • 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

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

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

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

    • 示例

      // 声明一个'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)。

    • 示例

      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 起
      
  • 抽象类

    • 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

      定义为抽象的类不能被实例化。

      被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

      继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

    • 示例

      abstract class AbstractClass
      {
       // 强制要求子类定义这些方法
          abstract protected function getValue();
          abstract protected function prefixValue($prefix);
      
          // 普通方法(非抽象方法)
          public function printOut() {
              print $this->getValue() . PHP_EOL;
          }
      }
      
      class ConcreteClass1 extends AbstractClass
      {
          protected function getValue() {
              return "ConcreteClass1";
          }
      
          public function prefixValue($prefix) {
              return "{$prefix}ConcreteClass1";
          }
      }
      
      class ConcreteClass2 extends AbstractClass
      {
          public function getValue() {
              return "ConcreteClass2";
          }
      
          public function prefixValue($prefix) {
              return "{$prefix}ConcreteClass2";
          }
      }
      
      $class1 = new ConcreteClass1;
      $class1->printOut();
      echo $class1->prefixValue('FOO_') . PHP_EOL;
      
      $class2 = new ConcreteClass2;
      $class2->printOut();
      echo $class2->prefixValue('FOO_') . PHP_EOL;
      
      // 输出内容
      // ConcreteClass1
      // FOO_ConcreteClass1
      // ConcreteClass2
      // FOO_ConcreteClass2
      
    • 此外,子类方法可以包含父类抽象方法中不存在的可选参数。

      abstract class AbstractClass
      {
          // 我们的抽象方法仅需要定义需要的参数
          abstract protected function prefixName($name);
      
      }
      
      class ConcreteClass extends AbstractClass
      {
      
          // 我们的子类可以定义父类签名中不存在的可选参数
          public function prefixName($name, $separator = ".") {
              if ($name == "Pacman") {
                  $prefix = "Mr";
              } elseif ($name == "Pacwoman") {
                  $prefix = "Mrs";
              } else {
                  $prefix = "";
              }
              return "{$prefix}{$separator} {$name}";
          }
      }
      
      $class = new ConcreteClass;
      echo $class->prefixName("Pacman"), "\n";
      echo $class->prefixName("Pacwoman"), "\n";
      
      // 输出
      // Mr. Pacman
      // Mrs. Pacwoman
      
  • Static关键字

    • 声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

      静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

      由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

      静态属性不可以由对象通过 -> 操作符来访问。

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

  • Final关键字

    • PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
  • 调用父类的构造方法

    • PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()

Tip:在PHP中双冒号(::)操作符是一种范围解析操作符,又作用域限定操作符。它是对类中的方法的静态引用,可以访问静态、const和类中重写的属性与方法。php调用类的内部静态成员,或者是类之间调用就要用两个冒号(:。

你可能感兴趣的:(PHP基础)