PHP 学习笔记
PHP 简介
PHP 语言(PHP:Hypertext Preprocessor)是一种开源脚本语言, 由PHP解析器在服务器上执行
PHP:Hypertext Preprocessor 全称前的 PHP 不可省略, PHP缩写是一种递归缩进的写法
PHP 常用运行环境架构
php 主要是用于支持WEB服务的脚本语言, 为了运行 php 通常需要安装 web 服务器 php 和数据库工具, 一般的有以下几种架构组合
- LAMP:Linux,Apache,MySQL,PHP
- LNMP:Linux,Nginx,MySQL,PHP
- WAMP:Windows,Apache,MySQL,PHP
LNAMP: Linux,Nginx+Apache,MySQL,PHP 通过Nginx代理转发, 提高并发能力
HTTP:Hypertext Transfer Protocol, 超文本传输协议; 是 web 服务的一种基础协议, 对于 PHP 学习来说非常重要 HTTP详解
- HTTP 连接四步工作: 建立连接,发送请求,给出应答,关闭连接
- 常见状态码:200,400,401,403,404,500,503
MySQL: 是一种小型开源数据库(现在也支持很大的数据内容了), 和开源的 php 是一种非常完美的组合, MySQL学习笔记
PHP 环境搭建
php 编码规范:DRY原则, Do not repeat Yourself
- 命名规则:
- 变量, 有意义的英文单词,之间可用_连接
- 函数, 同上,运用小驼峰,首词小写,后面每词首字母大写
- 类, 同上,运用大驼峰,首词大写,后面每词首字母大写
- 书写规范(PSR2):
- 注意缩进和留白
- 嵌套要缩进,避免3层以上嵌套,
- 各功能区空行留白
- 参数间逗号(,)后空一格
PHP 书写规范详见()[]
- 验证不可少:
- 前端要验证,后端也要验证,输出也要验证
- 合理使用缓存机制,适当使用框架
PHP 基本语法
PHP 脚本在服务器上执行, 然后将纯 HTML 结果发送回浏览器.
php的标记风格(插标)
1. XML风格
<?php
// PHP 代码
?>
2. shell(脚本)风格
<script language="php">
// PHP 代码
</script>
3. 简短风格 //需要在php.ini里更改short_open_tag = off 为on
<?
// PHP 代码
?>
4. ASP标记风格 //需要在php.ini里更改asp_tags = off 为on
<%
// PHP 代码
%>
PHP 指令分隔符
PHP 需要在每个语句后用分号结束指令
PHP 注释: php 支持多种常见注释方式
// c++风格
# shell风格
/* c多行注释风格 */
PHP 常量
常量, 用于存储程序中不变的数据, 使用函数define()来声明, 声明后值不可改变, 常量名必须以下划线或字母开始,不需要$符, 区分大小写,一般全字母大写
bool define(sting $name,mixed $value [, bool $case_insensitive = false ]);
- name:必选参数, 常量名称, 即标志符.
- value:必选参数, 常量的值.
- case_insensitive :可选参数, true or false,true对大小写不敏感,反之则反,默认false
define(FILENAME,'huwhois'); //定义常量FILENAME,值为huwhois,对大小写敏感
使用函数defined()来判断是否定义为常量
defined(FILENAME); //判断FILENAME是否定义为常量了,返回值为true or false
php常见的预定义常量:
echo "__FILE__,当前文件的路径:".__FILE__.'<br>';
echo "__LINE__,当前PHP程序的行数:".__LINE__.'<br>';
echo "PHP_VERSION,当前PHP的版本:".PHP_VERSION.'<br>';
echo "PHP_OS,当前PHP使用的操作系统:".PHP_OS.'br';
echo "Boolean值:TRUE FALSE<br>";
echo "E_ERROR,php错误的级别代码:".E_ERROR.'<br>';
echo "E_WARNING,警告的级别代码:".E_WARNING.'<br>';
echo "E_ERROR,语法解析有潜在问题处的级别代码:".E_PARSE.'<br>';
echo "E_NOTICE,该常量为发生不寻常,但不一定是错误处的级别代码:".E_NOTICE.'<br>';
PHP 变量
用于存储程序中值可以改变的数据, 是一种存储数据的容器.
$name [= value];
- 注意事项:
- 变量名前要加$符
- 变量名必须以字母或下划线开头,后面可跟字母/下划线/数字
- 变量名区分大小写
- 变量名不允许与系统内建变量/函数/常量等同名
变量赋值方式:
PHP 没有声明变量的命令, 变量在第一次赋值给它的时候被创建
-
直接赋值,使用赋值号 = :
-
传值赋值,将一个变量的值赋值给另一个变量(传一个副本)
-
引用赋值,将一个变量的内存空间和另一个变量共享
$a = 5; echo $a.'<br/>'; // 5 $b=$a; echo $b.'<br/>'; // 5 $a=5; $c=&$a; echo $c.'<br/>'; // 5 /* 若$c值改变了,$a也跟值一起变 */ $c = $a*2; echo $c.'<br/>'; // 10 echo $a.'<br/>'; // 10 echo $b.'<br/>'; // 5 /* 使用unset()函数销毁其中一个时, 另一个不受影响, 即有福同享,有难不当*/ unset($c); echo $a.'<br/>'; // Notice: Undefined variable: a echo $c.'<br/>'; // 10
php 中变量不需要特殊声明, 直接拿出来用就可以, 但常常会用到赋空字符串/数组初始化变量, 以方便程序运行
变量的作用域
即变量起作用的范围,主要是根据他们的声明方式和位置决定的
- 局部变量,声明在某范围的变量,只在其声明范围内起作用,如函数体里的内部变量
$a = 'aaaa'; function test($a) { $a = 'bbbb'; echo $a.'<br/>'; } test($a); // 'bbbb' echo $a.'<br/>'; // 'aaaa' /* 引用赋值可将局部变量的影响传出来 */ $a = 'aaaa'; function test(&$a) { $a = 'bbbb'; echo $a.'<br/>'; } test($a); // 'bbbb' echo $a.'<br/>'; // 'bbbb'
- 全局变量,使用关键字global定义,可在广泛范围内使用
php 超级全局变量, 又称预置变量,系统定义的,可直接使用,以数组形式存储相关信息c,php预置变量,又称超级全局变量,系统定义的,可直接使用,以数组形式存储相关信息,详见数组
-
静态变量,使用关键字static定义,制作用在函数域内,函数结束后不会释放,而会保存最后一次调用的值,等待函数下次被调用时使用(详解)
-
可变变量,即多个$组在一起,变量名由其他变量的值确定
$test = 'abc'; $abc = '123456'; echo $$test; // '123456'
可变变量的语法形式是php特殊的语法, 其他语言中少见(目前没见到过), 很好用, 一个变量的变量名可以动态的设置和使用.
- 函数和类的方法中, 超全局变量不能用作可变变量.
- $this变量也是一个特殊变量, 不能被动态引用.
PHP数据类型
标量数据类型:
类型 | 中文名称 | 说明 |
---|---|---|
Boolean | 布尔型 | TRUE or FALSE (true false) |
String | 字符串型 | ‘’ or “” 之间 //单独占一行,且前后不能有多余的空格 |
Integer | 整型(int) | 有符号整数 php中没有无符号整数 |
Float | 浮点型 | 浮点型数(有小数点或者E) |
单引号(‘’), 不解析变量, 把变量名原样输出(理论上速度比双引号快); 双引号(“”)解析变量,输出变量值, eg:
$test = 'abc';
echo '$test'.'<br/>'; // '$test'
echo "$test".'<br/>'; // 'abc'
界定符: 相当于多行双引号(“”), '<<<'加指定的开始标记符和结束符之间的字符都可以看做一个双引号里
$test01 = <<<FFF
testest
abcd
12141242412
$test
FFF;
echo $test01.'<br/>'; // 'testest abcd 12141242412 abc'
结束符必须和开始标记想同, 且单独占一行,且前后不能有多余的空格
- 转义字符,’ \n \r \t " \% …
- php 识别 ‘’
- 字符串多引号嵌套:
复合数据类型:
类型 | 中文名称 | 说明 |
---|---|---|
array | 数组 | 一组数据的集合(可以是任何数据,包括数组),组成要素,索引(下标/键名)———元素 |
object | 对象 | 类的一个实例化 |
- 数组赋值(声明)
- 使用array()关键字直接赋值
- 追加赋值
- -php5.4 后可直接用 [] 声明数组
$arr=array(1,2,3,'bb'); //不指定键名,索引从0开始 $arr[] = 1; $arr[] = 2; $arr[] = 3; $arr[] = 'bb'; $arr=arry('key0'=>'value0','key1'=>'value1'...tec) //指定键名 $arr['key0']='value0'; $arr['key1']='value1'; //同上 /* php5.4 开始可以使用 [] 替代array() */ $arr = ['a', 1, 'b', 'exit']; $arr = ['key0'=>'value0','key1'=>'value1'];
数组打印输出不能用echo, 而是用print_r, 也可以用var_dump等打印变量详细信息;
-
多维数组,即数组里面的元素也是数组,
$arr1=( array("a"=>"aaaa","b"=>"bbbb"); array("c"=>"cccc","d"=>"dddd"); ) $arr1['a']['a']="aaaa"; $arr1['a']['b']="bbbb"; $arr1['a']['c']="cccc"; $arr1['a']['d']="dddd";
-
数组合并
- "+"运算符:若前后数组有重复键名,则前者保留,后面数组的同键名值,直接去掉
array_merge($ar1,$ar2,....$arn)
,若前后数组有重复键名,则后面覆盖前面的,同+相反
根据数组索引(key)的数据类型分为两类,索引数组(键名全为整型),关联数组(包括混合数组)
-
特殊数组,预定义变量,又名超级全局变量,是以数组形式存储的系统预定义变量
$GLOBALS
全局作用域中可用的全部变量, PHP 在名为$GLOBALS[index]
的数组中存储了所有全局变量.变量的名字就是数组的键.$_SERVER
保存关于报头、路径和脚本位置信息的超级全局变量$_REQUEST
存储$_POST
和$_GET
的所有变量$_POST
存储表单 post 提交的值$_GET
存储get 提交的值(包括表单和地址栏/链接)$_FILES
存储上传的文件提交到当前脚本的数据$_COOKIE
取得用户浏览器中Cookie中存储的数据$_SESSION
存储当前脚本会话的session变量$_ENV
存储当前WEB环境变量
php对象是类的实例化, 在面对对象编程的学习中会详细介绍
特殊数据类型:
类型 | 中文名称 | 说明 |
---|---|---|
resource | 资源 | 保存外部资源的一个引用的变量,如打开文件/图形画布等 |
null | 空值 | 没有赋初始值的变量 |
-
| - | 赋值为null的变量
-
| - | 被内置函数unset()处理了的变量
数据类型的转换
- 自动转换: PHP 是 若类型语言, 标量数据类型参与类型时, PHP 解析器会根据实际情况自动转换
- 强制转换:使用PHP运算符或内置函数强制改变变量数量类型
- 函数:
- intval($var), 强制转换为整型(取整)
- floatval($var), 强制转换为浮点型
- stringval($var), 强制转换为字符型
- settype($var,type),type为目标数据类型
- unset($var), 转为null,销毁变量
- 运算符:
- (int/integer)$var;
- (float)$var;
- (string)$var;
- (bool/boolean)$var;
- (array)$var;
- (object)$var;
- 函数:
- 类型检测:
- is_bool($var);
- is_int($var);
- is_float($var);
- is_string($var);
- is_array($var);
- is_object($var);
- is_null($var);
- is_numeric($var), 判断变量是否为数字(字符型的数字也是)
var_dump($var); //打印变量的详细属性
instanceof: php 没有 typeof 运算符, 可以使用 instanceof 检测是否某类型, instanceof 也可以检测变量是否属于某 class
PHP 运算符
运算符,即变量执行算术/逻辑运算的符号,也成操作符
类型 | 运算符 | 说明 | 结合方向
-|-|-|-|-
算术运算符 | + - * / % ** |非数值型参与运算时PHP先转换为数值型|从左到右(左联)
递增/递减 | ++ – | 变量先做其他运算,再自加 | 从右到左(右联)
字符串运算符| . |连接两字符串| 左连
赋值运算符|= += -= *= /= %= .=|左边为变量名,右面右表达式或常量|右联
比较运算符|==
===
!=
<>
!==
>
<
>=
<=
??
|又称关系运算符或条件运算符,用于判断操作数的关系,返回布尔值(TRUE or FALSE)|无
逻辑运算符|and && or ||
not ! xor(亦或)|用来判断逻辑表达式的真假,操作数为boolean,返回也是boolean|左
三目运算符|:?| exp1?exp2:exp3 //exp1为真则执行exp2否则执行exp3|左
递增/递减运算符
例子 | 名称 | 效果 |
---|---|---|
++$a | 前加 | $a 的值加一, 然后返回 $a . |
$a++ | 后加 | 返回 $a , 然后将 $a 的值加一. |
–$a | 前减 | $a 的值减一, 然后返回 $a . |
$a– | 后减 | 返回 $a , 然后将 $a 的值减一. |
一个简单的示例脚本: |
<?php
echo "<h3>Postincrement</h3>";
$a = 5;
echo "Should be 5: " . $a++ . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";
echo "<h3>Preincrement</h3>";
$a = 5;
echo "Should be 6: " . ++$a . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";
echo "<h3>Postdecrement</h3>";
$a = 5;
echo "Should be 5: " . $a-- . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";
echo "<h3>Predecrement</h3>";
$a = 5;
echo "Should be 4: " . --$a . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";
?>
在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++;
将把$a
变成’AA’,而在 C 中,a = ‘Z’; a++; 将把 a 变成 ‘[’(‘Z’ 的 ASCII 值是 90,‘[’ 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化
运算符优先级
一般地: 运算符优先>级特殊运算符>算术运算符>比较运算符>逻辑运算符>赋值符
-
运算符优先级相同则由运算符的结合方向决定运算先后
-
没有结合行的同级运算符不能对一个操作数使用, eg: 1< 2 > 3; 不合法
-
圆括号有最高优先级,适当加圆括号可是运算表达式更清晰
优先级: clone new > [ > ** > ++ – ~ (int) (float) (string) (array) (object) (bool) @ > instanceof > ! > * / % > + - . > << >> > < <= > >= > == != === !== <> <=> > & > ^ > | > && > || > ?? > ?: > = += -= *= **= /= .= %= &= |= ^= <<= >>= > and > xor > or
PHP 函数
函数, 被命名的独立代码块, 可能一个有返回结果
PHP 流程控制
流程控制,即程序执行的顺序控制(执行跳过选择等)
顺序结构,按先后从上到下执行,语句只执行一次
分支结构,根据条件判断执行那些语句块
单分支, if(expression){
statement
}
多分支, if(expression){
statement1
}else{
statement2
}
多重分支,if(expression1){
statement1
}elseif(expression2){
statement2
}......else{ statement3}
分支嵌套, if(expression0){
if(expression1){
statement1
}
}else{
if(expression2){
statement2
}
}
多分支选择
switch(exoression){ //表达式为整型或字符
case 常量1; statement1;
break;
case 常量2; statement2;
break;
case 常量3; statement3;
break;
case 常量4; statement4;
break;
...
default; statementn;
break;
}
循环结构
循环结构主要有条件表达式和执行语句组成,且必须有结束条件
-
while, 条件循环,常用于循环次数不知的时候
while(expression){ statement; //必须要有结束条件 }
while循环也可以嵌套多层,但一般不会嵌套多层
-
do while循环基本同while,但至少会在判断前执行一次体内语句
do{ statement; }while(expression);
-
for循环, 计数循环
for (initalization,con-expr,++/-- ){ statememt; }
-
foreach循环,一般用来遍历数组和对象,配合关键字as使用
for($aaray as $key=>$val){ echo $key.'-----'.$val; }
使用循环写乘法口诀
$i=1;
while($i<10){
$j=1;
while($j<=$i) {
echo $j.'*'.$i.'='.$j*$i;
$j++;
}
echo "\n";
$i++;
}
for($i=1;$i<10;$i++) {
$j=1;
for($j;$j<=$i;$j++){
echo $j.'*'.$i.'='.$j*$i;
}
echo "\n";
}
break && continue
break 跳出当前循环,执行循环外语句
continue 跳过本次循环,执行下一次循环
PHP 自定义函数
函数定义
PHP使用关键字 function 来声明函数
function fuc_name( arguments ){
函数体
return r_value;
}
- 函数命名:
- 以字母下划线开头,后面可跟字母数字下划线
- 不可与系统函数名重名
- 函数名不区分大小写
- 函数需要先定义才调用
- 函数只有调用时才会执行,return的值给调用的地方
- 参数列表(arguments)由0个/一个/多个表达式组成,之间用逗号隔开
形参是函数定义时,函数名后面跟着的参数;
实参是函数调用时,函数名后面跟着的参数
- 参数传递方式
- 按值传递,参数把函数外变量值的副本(即复制)给函数体用,函数体内操作不会改变函数外的变量
- 按引用传递,参数把函数外变量的内存地址共享给函数体使用,函数体内操作会改变外部的变量
- 默认值传递,即给形参设置默认值, 当没对应实参传进来时, 函数调用默认值, 有默认值的形参必须放到参数列表最后, 默认值必须是常量表达式
- 自定义传参,函数定义时不给形参, 调用时函数参数数量不定,函数体类通过以下函数获取参数列表(数组)
- func_num_args(); 返回参数个数
- func_get_arg(n); 返回参数指定位置的参数值
- func_get_args(); 返回包含所有参数的数组
$test1 = 'aa'; $test2 = 'bb'; function value($a){ $a .= 'tttt'; echo '$a'.'<br/>'; } echo $test1.'<br/>'; value($test1); echo $test1.'<br/>'; function quote(&$b){ $b .= 'test'; echo $b.'<br/>'; } echo $test2.'<br/>'; quote($test2); echo $test2.'<br/>'; function sortNumber(){ $array=func_get_args(); var_dump($array); } $test=sortNumber(1,2,3,4,5); /* 运行结果 */ aa aatttt aa bb bbtest bbtest E:\www\test.php:24: array (size=5) 0 => int 1 1 => int 2 2 => int 3 3 => int 4 4 => int 5
递归函数,在函数体内调用函数本身
function sunm($a){
if($a>0){
return $a+sum($a-1);
}
}
sum(100); 求0到100的和
function test($n){
echo $n;
if($n>0){
test($n-1);
}
ehco $n;
}
test(5);
嵌套函数
嵌套函数, 是指在一个函数体内又同事调用一个或多个函数, 形成函数内外嵌套的关系, 先调用外部函数, 才能调用内部函数, 内部函数不调用, 不执行
function start(){
echo "正在开机...\n";
function boot(){
echo "正在加载引导程序...\n";
}
function welcome($user){
echo "欢迎使用本系统\n";
}
}
start();
boot();
welcome("aaa");
php内置函数库,即内置函数
PHP 有很多标准的函数和结构,还有一些函数需要和特定地 PHP 扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。例如,要使用 image 函数中的 imagecreatetruecolor(),需要在编译 PHP 的时候加上 GD 的支持。或者,要使用 mysql_connect() 函数,就需要在编译 PHP 的时候加上 MySQL 支持。有很多核心函数已包含在每个版本的 PHP 中如字符串和变量函数。调用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 加载了那些扩展库。–PHP 手册<语言参考>
常用的内置函数
- empty(), 检查一个变量是否为空,空返回true,非空返回false
- isset(), 检测一个变量是否被设置及值时候不为null,非空为true,空或null为false
- print_r(), 格式化打印标量(一般用来打印数组)
- unset(), 销毁一个变量
- var_dump(), 打印变量相关信息(位置,类型,值,长度等)
数组函数
array_merge($ar1,$ar2,....$arn)
, 数组合并 若前后数组有重复键名,则后面覆盖前面的,同+相反
eg: $a=['a'=>1,'b'=>2,'c'=>3];
$b=['c'=>4,'d'=>5,'f'=>6];
var_dump(array_merge($a,$b));
D:\PHP04\www\test.php:41:
array (size=5)
'a' => int 1
'b' => int 2
'c' => int 4
'd' => int 5
'f' => int 6
- range(low,high,step),在low和high之间创建步长为step的数组
eg: $aa=range(1,9,2);
var_dump($aa);
D:\PHP04\www\test.php:42:
array (size=5)
0 => int 1
1 => int 3
2 => int 5
3 => int 7
4 => int 9
in_array($var,$array)
,检测$array
中值是否有$var
array_key_exists($key,$array)
,检测$array
中键是否有$key
数组遍历
数组的遍历, 是编程语言中的重要一环, PHP 一般使用 foreach 遍历数组
-
foreach()函数, 仅用于遍历数组和对象, 配合关键字as使用, 有两种形式
foreach($arr as $val){ foreach($val as $k=>$v){ statement; } }
foreach 不支持用“@”来抑制错误信息
-
each()函数,以混合数组的方式返回当前数值指针指向元素的键值对(键名和值),并将指针向后走一步(最后超出时返回false)
$arr = array('aa'=>'aaaaa', 'bb'=>'bbbb'); vardump(each($arr)); /* 运行结果 */ E:\www\test.php:119: array (size=4) 1 => string 'aaaaa' (length=5) 'value' => string 'aaaaa' (length=5) 0 => string 'aa' (length=2) 'key' => string 'aa' (length=2)
相关函数
current(),当前指针指向的值 next(),当前指针的下一个值 prev(),当前指针的后一个值 end(),最后一个元素的值 reset(),将指针重新定向到第一个值
- list(),将一个数组的值按先后顺序批量赋给list的参数
list($a,$b)=array(1,2,3); //数组必须是以0开始的数组 /* list和explode获取文件后缀名 */ $filename="huaji.jpg"; list($name,$type)=explode('.',$filename); echo $name.'<br/>'; // huaji echo $type.'<br/>'; // jpg
- while list each配合来遍历数组
while(list($k,$v)=each($arr)){ // each() 指针最后无元素时会返回false, 结束循环 echo $k.'=>'.$v; }
字符串函数
-
strlen()
int strlen ( string $string )
返回字符串长度, 计空格(包括首尾空格), 英文单字母返回1字符长度, 汉字在不同的编码情况下返回长不同, utf8每字3个, gb2312(或是gbk)下2长度
-
mb_strlen()
mixed mb_strlen (string $str [, string $encoding = mb_internal_encoding()])
返回指定字符编码的字符串长度(未指定则使用内部默认字符串), 计空格(包括首尾空格), 多字节的字符被计为1, 即英文字母和汉字都返回1字符长度(utf8,gbk 下都是).
/* UTF-8 */ $test = 'php编程'; var_dump($test); var_dump(strlen($test)); var_dump(mb_strlen($test)); /* 结果*/ E:\www\test.php:5:string 'php编程' (length=9) E:\www\test.php:175:int 9 E:\www\test.php:176:int 5 /* GB2312 */ header("Content-type: text/html; charset=gb2312"); //php 默认编码方式为utf-8 $test = 'php编程'; var_dump($test); var_dump(strlen($test)); var_dump(mb_strlen($test)); E:\www\test.php:6:string 'php编程' (length=7) E:\www\test.php:7:int 7 E:\www\test.php:8:int 5
-
trim()
string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
去除字符串收尾的空字符(包括空格/换行等), character_mask
可选参数, 过滤字符也可由 character_mask 参数指定. 一般要列出所有希望过滤的字符, 也可以使用 “…” 列出一个字符范围, 不指定第二个参数,trim() 将去除这些字符:- " " (ASCII 32 (0x20)), 普通空格符。
- “\t” (ASCII 9 (0x09)), 制表符。
- “\n” (ASCII 10 (0x0A)), 换行符.
- “\r” (ASCII 13 (0x0D)), 回车符.
- “\0” (ASCII 0 (0x00)), 空字节符.
- “\x0B” (ASCII 11 (0x0B)), 垂直制表符.
-
substr
string substr ( string $string , int $start [, int $length ] )
从指定位置
$start
,按指定长度$length
,截取出一段字符- 开始位置,
$start
$start
>= 0, 则从开头(左)数(0为左开始)$start
< 0, 则从结尾处(右)数(-1为右开始)$start
>$strlen($string)
, 将返回 FALSE
- 截取长度, $length
- 无$length, 则从start截取值尾
- $length值为 0 false 或 null, 返回一个空字符串
- length > 0, 即截取length长度, 超过字符串尾部的部分舍去
- length < 0, string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起). 如果 start 不在这段文本中, 那么将返回 FALSE
echo substr('abcdef', 1); // bcdef echo substr('abcdef', 1, 3); // bcd echo substr('abcdef', 0, 4); // abcd echo substr('abcdef', 0, 8); // abcdef echo substr('abcdef', 2, -1); // cde echo substr('abcdef', 2, -4); // [false] echo substr('abcdef', -1, 1); // f
也可以使用中括号访问字符串中的单个字符(字符串就像单个字符组成的数组)
$string = 'abcdef'; echo $string[0]; // a echo $string[3]; // d echo $string[strlen($string)-1]; // f
- 开始位置,
-
strstr
string strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] )
返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串, $before_needle省略值为false, 为true时截取前面的部分
echo strstr("abcdef.jpg", '.'); // .jpg echo strstr("abcdef.jpg", '.', true); // adcdef
-
stristr(),同上,但strstr()区分大小写,而stristr()不区分大小写
-
str_replace
mixed substr_replace (mixed $string , mixed $replacement , mixed $start [, mixed $length])
- 使用 replacement子字符串替换 string 的副本中由 start 和可选的 length 参数限定范围的字符串;
- 此函数区分大小写
- start
- 如果 start 为正数,替换将从 string 的 start 位置开始。
- 如果 start 为负数,替换将从 string 的倒数第 start 个位置开始。
- length
- 如果设定了这个参数并且为正数,表示 string 中被替换的子字符串的长度。
- 如果设定为负数,它表示待替换的子字符串结尾处距离 string 末端的字符个数。
- 如果没有提供此参数,那么它默认为 strlen( string ) (字符串的长度).
- 如果 length 为 0,那么这个函数的功能为将 replacement 插入到 string 的 start 位置处。
$var = 'ABCDEFGH:/MNRPQR/'; echo "Original: $var<hr />\n"; /* 这两个例子使用 “bob” 替换整个 $var。*/ echo substr_replace($var, 'bob', 0) . "<br />\n"; echo substr_replace($var, 'bob', 0, strlen($var)) . "<br />\n"; /* 将 “bob” 插入到 $var 的开头处。*/ echo substr_replace($var, 'bob', 0, 0) . "<br />\n"; /* 下面两个例子使用 “bob” 替换 $var 中的 “MNRPQR”。*/ echo substr_replace($var, 'bob', 10, -1) . "<br />\n"; echo substr_replace($var, 'bob', -7, -1) . "<br />\n"; /* 从 $var 中删除 “MNRPQR”。*/ echo substr_replace($var, '', 10, -1) . "<br />\n";
也可用于处理数组
$input = array('A: XXX', 'B: XXX', 'C: XXX'); // A simple case: replace XXX in each string with YYY. echo implode('; ', substr_replace($input, 'YYY', 3, 3))."\n"; // A more complicated case where each replacement is different. $replace = array('AAA', 'BBB', 'CCC'); echo implode('; ', substr_replace($input, $replace, 3, 3))."\n"; // Replace a different number of characters each time. $length = array(1, 2, 3); echo implode('; ', substr_replace($input, $replace, 3, $length))."\n";
-
strpos($str1, $str2, [, int $offset = 0 ])
, 返回$str2
在$str1第一次出现的位置 -
strrpos($str1, $str2, [, int $offset = 0 ])
, 返回$str2
在$str1
最后一次出现的位置 -
str_pad($str1, $length, $str2)
,使用指定字符$str2
填充原字符串$str1
到[‘PP’]指定长度 -
strcmp($str1,$str2)
,比较两字符串大小(二进制\ASCII码),如果$str1
小于$str2
返回 -1; 如果$str1
大于$str2
返回 1;如果两者相等,返回 0。 -
strtoupper(),将字符串转成大写
-
strtolower(),将字符串转成小写
-
ucwords(),将字符串的每个单词首字母大写
-
ucfirst(),将字符串的首个单词首字母大写
-
count_chars($str,[0|1|2|3|4]),统计 string 中每个字节值(0…255)出现的次数, 可使用多种模式返回结果
日期时间型函数
-
time(),返回当前Unix的时间戳
-
date(),格式化一个本地时间
string date(string $format [, int $timestamp = time() ]);
$format为输出格式,后面的time,为指定时间戳,省略则为当前时间戳
$forma格式及作用(区分大小写)
d - 一个月中的第几天(从 01 到 31)
D - 星期几的文本表示(用三个字母表示)
j - 一个月中的第几天,不带前导零(1 到 31)
l('L' 的小写形式)- 星期几的完整的文本表示
N - 星期几的 ISO-8601 数字格式表示(1表示Monday[星期一],7表示Sunday[星期日])
S - 一个月中的第几天的英语序数后缀(2 个字符:st、nd、rd 或 th。与 j 搭配使用)
w - 星期几的数字表示(0 表示 Sunday[星期日],6 表示 Saturday[星期六])
z - 一年中的第几天(从 0 到 365)
W - 用 ISO-8601 数字格式表示一年中的星期数字(每周从 Monday[星期一]开始)
F - 月份的完整的文本表示(January[一月份] 到 December[十二月份])
m - 月份的数字表示(从 01 到 12)
M - 月份的短文本表示(用三个字母表示)
n - 月份的数字表示,不带前导零(1 到 12)
t - 给定月份中包含的天数
L - 是否是闰年(如果是闰年则为 1,否则为 0)
o - ISO-8601 标准下的年份数字
Y - 年份的四位数表示
y - 年份的两位数表示
a - 小写形式表示:am 或 pm
A - 大写形式表示:AM 或 PM
B - Swatch Internet Time(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 中新增的)
e - 时区标识符(例如:UTC、GMT、Atlantic/Azores)
I(i 的大写形式)- 日期是否是在夏令时(如果是夏令时则为 1,否则为 0)
O - 格林威治时间(GMT)的差值,单位是小时(实例:+0100)
P - 格林威治时间(GMT)的差值,单位是 hours:minutes(PHP 5.1.3 中新增的)
T - 时区的简写(实例:EST、MDT)
Z - 以秒为单位的时区偏移量。UTC 以西时区的偏移量为负数(-43200 到 50400)
c - ISO-8601 标准的日期(例如 2013-05-05T16:34:42+00:00)
r - RFC 2822 格式的日期(例如 Fri, 12 Apr 2013 12:01:05 +0200)
U - 自 Unix 纪元(January 1 1970 00:00:00 GMT)以来经过的秒数
- strtotime,将能识别的字符串时间格式转为时间戳
echo 'strtotime("now")当前时间戳:'.strtotime("now").'<br>';
echo 'strtotime("2018/03/28 12:23:45")2018/03/28 12:23:45时间戳:'.strtotime("now").'<br>';
echo 'strtotime("10 September 2000")2000-09-10时间戳:'.strtotime("now").'<br>';
echo 'strtotime("+1 week")一个星期后的时间戳:'.strtotime('+1 week').'<br>';
echo 'strtotime("next Thursday")下个星期四的时间戳'.strtotime('next Thursday').'<br>';
以上结果可以用于 date() 时间格式化输出:
echo '昨天的这个时间点'.date("Y-m-d H:i:s",strtotime('-1 day')).'<br>';
PHP 中设置时区
PHP 默认时区设置是 UTC (国际标准时), 即格林威治时间, 使用 date(“Y-m-d H:i:s”,strtotime(‘now’)) 得到的时间比本地时区晚8小时, 要正常显示本地时间需要设置 php 时区
-
修改php.ini, 在[Date]下找到中找到data.timezone =去掉注释,即去掉它前面的;号, 然后设置 data.timezone = “Asia/Shanghai” (或者 date.timezone =“PRC” 没有就添加), 重启 Apache 即可.
-
PHP5以上版本可在程序代码中使用函数ini_set() 或者 date_default_timezone_set()
ini_set('date.timezone','Asia/Shanghai'); if (function_exists(date_default_timezone_set)) { date_default_timezone_set("Etc/GMT");//这是格林威治标准时间,得到的时间和默认时区是一样的 date_default_timezone_set("Etc/GMT+8");//这里比林威治标准时间慢8小时 date_default_timezone_set("Etc/GMT-8");//这里比林威治标准时间快8小时 date_default_timezone_set('PRC'); //设置中国时区 date_default_timezone_set('Asia/Shanghai'); //设置中国时区 } /*一些常用的时区标识符说明:*/ Asia/Shanghai – 上海 Asia/Chongqing – 重庆 Asia/Urumqi – 乌鲁木齐 Asia/Hong_Kong – 香港 Asia/Macao – 澳门 Asia/Taipei – 台北 Asia/Singapore – 新加坡
- microtime(),返回当前时间戳及其微秒数
function microtime_float(){ list($usecond,$time)=explode(' ',microtime()); return $time=(float)$usecond+(float)$time; } $time_start=microtime_float(); //开始时间 echo microtime_float()."<br>"; /* sleep for a while 休眠一下,替代中间一段执行过程 */ usleep(1000); //单位微妙 $time_end=microtime_float(); //结束时间 echo microtime_float()."<br>"; $time=$time_end-$time_start; //计算时间差 echo "sleep in $time seconds"."<br>";
PHP 数学函数
- abs(),取绝对值
- ceil(),进一取整
- floor(),去未取整
- round(),四舍五入
- fmod(),浮点取余
mt_rand($min,$max)
,在$min,$max
生成随机数,整型随机数,比老的 rand()更好快更好- max(),min()求数组中的最大最小数
其他函数
- is_numeric(),检测变量是否为数字,或纯数字字符串
- md5(),加密,计算字符串的md5散列值
- number_format(),格式化输出数字,财务用
- htmlspecialchars();
- htmlspecialchars_decode();
- urlencode($string),对字符进行浏览器地址栏编码
- urldecode($ue_string),对字符进行浏览器地址栏解码
- json_encode() & json_decode()
- gettype(), 获取变量类型