Apache配置
安装配置(这里以2.4版本为例)
- 官网下载安装包(若官网下载十分缓慢推荐地址:http://8dx.pc6.com/xjq6/ApacheHTTPServer2433.zip)
- 解压到指定文件夹,修改配置文件httpd.conf(路径:conf --> httpd.conf)
- ServerRoot "你的安装目录" (注意:这里路径使用反斜杠
/
) - Listen 80 (若出现端口冲突则更改当前的端口号)
- ServerName 服务名称 (localhost即可,端口可不带)
- DocumentRoot "你的安装目录/htdocs" (htdos为你的网络文件夹名称)
- ServerRoot "你的安装目录" (注意:这里路径使用反斜杠
- 配置为系统服务
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中可以将虚拟主机分为两类
- 基于IP的虚拟主机:也就是一台电脑使用多个IP,每个IP对应一个网站
- 原理:一台电脑配置多个网卡
- 基于域名的虚拟主机,单个IP制作多个网站,给每个网站不同的名字(虚拟主机名)
- 基于IP的虚拟主机:也就是一台电脑使用多个IP,每个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 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
- 可以省略末尾的
?>
,让其自动判断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
- 代码装载:从脚本文件中将代码读取出来进行编译,将编译的结果放置在代码段(字节码)
- 代码执行:从代码段中按照一定的顺序执行代码,执行
$a = 1
在栈区开辟一块内存存储$a
,在数据段中开辟一块内存保存值1
然后将其所在的内存位置赋给a
变量;执行$b = $a
在栈区开辟一块内存存储$b
,取出$a
的值将其保存在数据段,将所在值的内存地址赋给$b
- 脚本执行结束,系统会回收所占有的内存(栈区、代码段)
-
引用传递
- 将变量保存值的内存地址传递给另一个变量(两个变量指向的是同一个值的内存地址)
- 示例:
$a = 1; $b = &$a
- 代码装载:从脚本文件中将代码读取出来进行编译,将编译的结果放置在代码段(字节码)
- 代码执行:从代码段中按照一定的顺序执行代码,执行
$a = 1
在栈区开辟一块内存存储$a
,在数据段中开辟一块内存保存值1
然后将其所在的内存位置赋给a
变量;执行$b = &$a
,将$a
对应的值的内存地址赋给$b
- 脚本执行结束,系统会回收所占有的内存(栈区、代码段)
常量
- 常量值被定义后,在脚本的其他任何地方都不能被改变。
- 常量是一个简单值的标识符。该值在脚本中不能改变。
- 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
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
- 整型:int/integer,系统分配四个字节存储,标识整数类型(有前提)
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
- 转换为NULL使用
is_type()
:返回一个布尔值,用于查看指定数据是否为某类型的数据(bool类型不能使用echo
查看,需要使用var_dump
)gettype(变量名)
:获取类型,得到的是该类型对应的字符串settype(变量名,类型)
:设定变量的类型empty()
:判断数据是否为空(并非NULL),为空返回true,否则返回falseisset()
:判断数据存储的变量本身是否存在,存在返回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() 函数的第一个必需参数 format 规定了如何格式化日期/时间。
-
示例:
date("Y/m/d")
-
参考
format
字符说明 返回值例子 日 --- --- d 月份中的第几天,有前导零的 2 位数字 01 到 31 D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun j 月份中的第几天,没有前导零 1 到 31 l("L"的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天) S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六) z 年份中的第几天 0 到 365 星期 --- --- W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周) 月 --- --- F 月份,完整的文本格式,例如 January 或者 March January 到 December m 数字表示的月份,有前导零 01 到 12 M 三个字母缩写表示的月份 Jan 到 Dec n 数字表示的月份,没有前导零 1 到 12 t 给定月份所应有的天数 28 到 31 年 --- --- L 是否为闰年 如果是闰年为 1,否则为 0 o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003 Y 4 位数字完整表示的年份 例如:1999 或 2003 y 2 位数字表示的年份 例如:99 或 03 时间 --- --- a 小写的上午和下午值 am 或 pm A 大写的上午和下午值 AM 或 PM B Swatch Internet 标准时 000 到 999 g 小时,12 小时格式,没有前导零 1 到 12 G 小时,24 小时格式,没有前导零 0 到 23 h 小时,12 小时格式,有前导零 01 到 12 H 小时,24 小时格式,有前导零 00 到 23 i 有前导零的分钟数 00 到 59> s 秒数,有前导零 00 到 59> u 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 示例: 654321 时区 --- --- e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores I 是否为夏令时 如果是夏令时为 1,否则为 0 O 与格林威治时间相差的小时数 例如:+0200 P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00 T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。 Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200 完整的日期/时间 --- --- 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关键字让函数返回一个值
- 可以在指定形参的时候为其赋一个初始值(指定初始值的参数需放在最后)
- PHP 函数准则:
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 定义,则被视为公有。
- PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
-
接口
-
使用接口(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调用类的内部静态成员,或者是类之间调用就要用两个冒号(:。