Php常用知识
Php常用知识
##################################################
# 注释
# 1.单行注释 //
# 2.多行注释 /**/
##################################################
# 变量
# 特别注意:变量名区分大小写
# 任何一个变量,有且只有4种对变量的操作
# 1.赋值
# 2.取值
# 3.判断变量 isset()
# 4.删除/销毁变量 unset()
# 预定义变量(只列出常用)
# 1.$_GET
# 2.$_POST
# 3.$_REQUEST
# 4.$_SERVER(只列出常用)
# 1.PHP_SELF: 表示当前请求的网页地址(不含域名部分)
# 2.SERVER_NAME: 表示当前请求的服务器名
# 3.SERVER_ADDR: 表示当前请求的服务器IP地址
# 4.DOCUMENT_ROOT:表示当前请求的网站物理路径(apache设置站点时那个)
# 5.REMOTE_ADDR: 表示当前请求的客户端的IP地址
# 5.SCRIPT_NAME: 表示当前网页地址
##################################################
# 常量
# 常量名推荐使用 "全大写"
define('常量名', 对应的常量值);
const 常量名 = 对应的常量值;
# 直接使用,注意:使用常量,前面不带"$"符号,也不能有引号
echo 常量名;
# 使用 constant() 函数以取值
echo constant("常量名")
# 判断一个常量是否存在 defined()
# 预定义常量
# 1.PHP_VERSION:表示当前php的版本信息
# 2.PHP_OS: 表示当前php运行所在的系统信息
# 3.PHP_INT_MAX:表示当前版本的php中的最大的整数值
# 4.M_PI: 表示圆周率π(一个有10多位小数的数)
# 魔术常量
# 1.__DIR__ 代表当前php网页文件所在的目录
# 2.__FILE__ 代表当前php网页文件本身的路径
# 3.__LINE__ 代表当前这个常量所在的行号
##################################################
# 数据类型
# 标量类型
# 1.字符类型 string
# 2.整数类型 integer
# 3.浮点数 float
# 4.布尔类型 boolean
# 复合类型
# 1.数组 array
# 2.对象 object
# 3.可调用 callable
# 特殊类型
# 1.空类型 null 有且只有一个数据可以使用
# 2.资源类型 resource
##################################################
# 整型
# 书写方式
# 十进制
$n1 = 123;
# 八进制
$n1 = 0123;
# 十六进制
$n1 = 0x1A3
# 二进制
$n1 = 0b101
# 进制的相互转换
# decbin decoct dechex
# bindec octdec hexdec
##################################################
# 浮点型
# 特别注意:浮点数不要随便做相等比较
# 如果要做比较先将浮点数转换为整数,然后再比较
# 书写方式
# 常规形式
$f1 = 0.1;
# 科学计数法形式
$f1 = 1.23e3;
##################################################
# 数组
# 旧版
$info = array('xxx', 18, 'zzz')
$info = array('xxx' => 'zzz', 'yyy' => 18)
# 新版
$info = ['xxx', 18, 'zzz']
$info = ['xxx' => 'zzz', 'yyy' => 18]
##################################################
# 空类型 NULL
# 只有一个值 null,不区分大小写
# 空值变量,isset() 判断的结果是false(即不存在)
$v = null
##################################################
# 类型判断
# gettype()
$v = 10;
$r = getype($v);
# settype()
$v = 10;
settype($v, 'string');
# var_dump() 输出变量完整信息
# is_int()/is_integer() 判断是否为整数类型
# is_float() 判断是否为浮点类型
# is_bool() 判断是否为布尔类型
# is_string() 判断是否字符类型
# is_array() 判断是否数组
# is_numeric() 判断是否为“数字”类型(含整数,小数,以及“纯数字字符串”)
# is_object() 判断是否对象
# isset() 判断一个变量是否存在,或变量中是否有数据
# empty() 判断是否为 "空的"。
##################################################
# 类型判断
# 1.自动转换
# 规律: 一个字符串当做数字,就会将该字符串的最前面的数字转换为数字值,如果没有,就为0转换为整数(直接保留整数部分)
$v1 = 1 + "3"; # 结果是4;
$v2 = 1 . "3"; # "."是字符串连接符,这里,1会被转换为字符串,结果是"13"
# 2.强制转换
##################################################
# 运算符
# @: 是错误抑制符
# 条件运算符: 数据1 ? 数据2 : 数据3
##################################################
# 流程控制
# switch
########################
# 实例: 给出任意年份和月份,输出该月的天数。
$year = 2008;
$month = 22;
switch($month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
echo "{$year}年{$month}月的天数为31天";
break;
case 4:
case 6:
case 9:
case 11:
echo "{$year}年{$month}月的天数为30天";
break;
case 2:
//如果是闰年
if( $year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
{
echo "{$year}年{$month}月的天数为29天";
}
else
{
echo "{$year}年{$month}月的天数为28天";
}
break;
default:
echo "没有该月份";
}
########################
# 实例: 公鸡5元一只,母鸡3元一只,小鸡1元3只,100元买了100只鸡,问各多少只?
########################
# 分析
#
# 如果公鸡1只,母鸡1只,小鸡1只,则总价为:...... 不对。
# 如果公鸡1只,母鸡1只,小鸡2只,则总价为:...... 不对。
# 如果公鸡1只,母鸡1只,小鸡3只,则总价为:...... 不对。
# ......
# 如果公鸡1只,母鸡2只,小鸡1只,则总价为:...... 不对。
# 如果公鸡1只,母鸡2只,小鸡2只,则总价为:...... 不对。
# 如果公鸡1只,母鸡2只,小鸡3只,则总价为:...... 不对。
# ...... ......... .........
# 如果公鸡100只,母鸡100只,小鸡100只,则总价为:...... 不对。
# 这种编程思想,叫做”穷举“,就是将所有可能的答案都罗列出来,然后挨个去"验证"
########################
# 方法一
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100; $gongji++)
{
for($muji = 0; $muji <= 100; $muji++)
{
for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
{
if($gongji + $muji + $xiaoji == 100 && $gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
}
}
}
echo "<br>运行次数:$count";
########################
# 方法二,第一次优化
echo "<h3>改进1:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
for($muji = 0; $muji <= 100/3; $muji++)
{
for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
{
if($gongji + $muji + $xiaoji == 100 && $gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
}
}
}
echo "<br>运行次数:$count";
########################
# 方法三,第二次优化
echo "<h3>改进2:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
for($muji = 0; $muji <= 100/3; $muji++)
{
# 在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
# for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
# {
$xiaoji = 100 - $gongji - $muji;
#既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
#}
}
}
echo "<br>运行次数:$count";
########################
# 方法四,第三次优化
echo "<h3>改进3:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
//考虑公鸡在给定数量情况下,所划掉的钱,剩余的钱(100-$gongji*5)才可能去买母鸡
for($muji = 0; $muji <= (100-$gongji*5)/3; $muji++)
{
# 在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
# for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
# {
$xiaoji = 100 - $gongji - $muji;
# 既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
# }
}
}
echo "<br>运行次数:$count";
########################
# 方法五,第四次优化
echo "<h3>改进4:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
//考虑公鸡在给定数量情况下,所划掉的钱,剩余的钱(100-$gongji*5)才可能去买母鸡
for($muji = 0; $muji <= (100-$gongji*5)/3; $muji++)
{
# 在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
# for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
# {
$xiaoji = 100 - $gongji - $muji;
if($xiaoji % 3 != 0){# 小数数量必须是3的倍数,否则不应该继续计算(判断)了
continue; # 中断本次计算(判断)
}
# 既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
# }
}
}
echo "<br>运行次数:$count";
##################################################
# 函数
############################
# 实例: 判断一个年份数(整数)是否为闰年
function is_runnina($year)
{
if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
for ($i = 2000; $i < 2100; $i)
{
if (is_runnina($i))
{
echo $i;
}
}
##################################################
# 匿名函数
#
# 这是定义匿名函数的形式。
# $f1 = function (形参...) { ....... };
#
# 这就是调用该调用。可见其调用,跟可变函数的写法非常类似。
# $f1(实参);
###################################################
# 常用系统函数
# function_exists("函数名"):判断一个函数是否已经存在;
# func_get_arg( $n ): 在函数内部可用,用于获得第n个实参(n从0开始算起)
# func_get_args(): 在函数内部可用,用于获得所有实参,结果是一个数组
# func_num_args(): 在函数内部可用,用于获得实参的个数
###################################################
# 字符串有关常用函数
# 输出与格式化:echo , print, printf, print_r, var_dump.
# 字符串去除与填充:trim, ltrim, rtrim, str_pad
# 字符串连接与分割:implode, join, explode, str_split
# 字符串截取:substr, strchr, strrchr,
# 字符串替换:str_replace, substr_replace
# 字符串长度与位置: strlen, strpos, strrpos,
# 字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords
# 特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode
#
# 个别解释
###########################
# implode/join:Join array elements with a string
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
###########################
# explode:使用一个字符串分割另一个字符串
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
###########################
# str_split:返回字符串的子串
$str = "Hello Friend";
$arr1 = str_split($str);
$arr2 = str_split($str, 3);
###########################
# substr:将字符串转换为数组
# 返回 "f"
$rest = substr("abcdef", -1);
# 返回 "ef"
$rest = substr("abcdef", -2);
# 返回 "d"
$rest = substr("abcdef", -3, 1);
###########################
# strchr/strstr:查找字符串的首次出现
$email = 'name@example.com';
$domain = strstr($email, '@');
###########################
# strrchr:查找指定字符在字符串中的最后一次出现
$dir = substr(strrchr($PATH, ":"), 1);
###########################
# str_replace:子字符串替换
# 赋值: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
# 赋值: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
# 赋值: You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
###########################
# substr_replace:替换字符串的子串
$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";
###########################
# strpos:查找字符串首次出现的位置(int)
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
###########################
# strrpos:计算指定字符串在目标字符串中最后一次出现的位置
$pos = strrpos($mystring, "b");
###########################
# lcfirst:Make a string's first character lowercase
# helloWorld
$foo = 'HelloWorld';
$foo = lcfirst($foo);
###########################
# ucfirst:将字符串的首字母转换为大写
# Hello world!
$foo = 'hello world!';
$foo = ucfirst($foo);
###########################
# ucwords:将字符串中每个单词的首字母转换为大写
# Hello World!
$foo = 'hello world!';
$foo = ucwords($foo);
###########################
# nl2br:在字符串所有新行之前插入 HTML 换行标记
echo nl2br("foo isn't\n bar");
###########################
# addslashes:使用反斜线引用字符串
###########################
# htmlspecialchars:Convert special characters to HTML entities
###########################
# htmlspecialchars_decode:Convert special HTML entities back to characters
##################################################
# 常用数学函数(重点)
#
# max:取得若干个数据中的最大值
# min:取得若干个数据中的最小值
# round:对某个数据进行四舍五入(可以设定保留几位小数)
# ceil:对某个数“向上取整”:将一个数据往上找出其小的一个整数(含其本身)。
# floor:对某个数"向下取整":将一个数据往下找出其大的一个整数(含其本身)
# abs:取得某个数据的绝对值
# sqrt:计算某个数的开方值
# pow:对某个数进行"幂运算"(就是获得某个数的若干次方)
# rand:获得某两个数之间的随机整数(含该两个数)
# mt_rand:获得某两个数之间的随机整数(含该两个数),比rand更快。
##################################################
# 常用时间函数
#
# time:获得当前时间(精确到秒),结果其实一个"整数"而已,代表从1970年1月1日0:0:0秒到当前时刻的秒数。
$time = date('Y-m-s h:i:s', time());
# 输出 2020-03-15 02:51:15
# print($time);
# microtime:获得当前时间(可以精确到微秒)
# 有两个用法:
# microtime(true):获得秒数(跟time一样),是一个数字(浮点数,有4位小数)
# microtime(false):获得也是秒数,但因为精度太高,导致浮点数无法表达出来,以致返回的是一个字符串。
# mktime:创建一个时间数据,参数为:时、分、秒,月、日、年
$t1 = mktime(10, 8, 5, 7, 12, 2018);
# 输出: 1584080810
print($t1)
# date:将一个时间转换为某种字符串形式
date("Y-m-d H:i:s");
# 输出: 2020-03-13 14:45:17
print(date("Y-m-d H:i:s"));
# idate:取得一个时间的某个单项数据值,比如idate("Y")取得年份数
# strtotime:将一个字符串"转换"为时间值;
# date_default_timezone_set:在代码中设置"时区"
# date_default_timezone_get:在代码中获取"时区"
##################################################
# 变量的作用域问题(重点)
#
# 简单来说,有3种作用域:局部作用域,全局作用域,超全局作用域;
# 相对应的,有3种变量:局部变量,全局变量,超全局变量;
#
# 静态变量: 一个特殊的局部变量
# 在函数内部,使用static关键字修饰的变量。
#
# 静态变量的特点:
# 静态局部变量的值不会在函数调用结束时被销毁,而是会一直保留。
# 对比:非静态的局部变量在函数调用结束时就会被销毁!
# 也就是说,当再次调用函数时,该变量(的值)还能继续使用。
#
# 超全局作用域与超全局变量
# 包括局部作用域和全局作用域的的整个作用域范围。
# 超全局变量可以在所有范围中使用(访问)。
# 实际上,只有有限的10来个系统预定义变量是超全局变量,包括:$_GET, $_POST, $_REQUEST 等。
#############################
# 一个特别的超全局变量:$GLOBALS
#
# 作用:
# 可以让我们在局部作用域范围中,使用全局变量。
#
#
# 它也是一个数组,其中存储了我们自己定义的所有全局变量。
# 每个全局变量的变量名,就是$GLOBALS数组的一个单元。
# 比如:
# 在全局作用域中定义如下变量:
# 这一行执行,就有了一个这个:$GLOBALS['v1'], 其值为1
$v1 = 1;
# 这一行执行,就有了一个这个:$GLOBALS['v2'], 其值为'abc'
$v2 = 'abc';
# 这一行执行,就有了一个这个:$GLOBALS['v3'], 其值为true
$v3 = true;
#
# 实例
################################
# 全局变量
$v1 = 10;
function func1( ){
# 输出10
echo $GLOBALS['v1'];
# 报错:变量v1未定义
echo $v1;
# 结果为50
$s1 = $GLOBALS['v1'] * 5;
# 报错:变量v1未定义
$s2 = $v1 * 5;
}
#############################
# 一个特别的的关键字:global
# 作用:
# 用于在局部作用域中,修饰一个跟全局变量同名的局部变量。
# 此时该局部变量也可以使用全局变量的值了——实际上他们其实是类似变量引用关系。
# 其作用类似:$GLOBALS
$n = 1;
funciton func2()
{
global $n1;
echo "<br>在函数中: n1 = ".$n1;
$n++;
}
##################################################
# 递归函数/递归思想(重点/难点)
#
# 基本含义:
# 就是一个函数内部再调用该函数本身的一种情形,这是语法形式上的。
# 具体场景是:
# 如果要解决的"最终问题",可以根据比该问题"小一级"的问题的答案而得到解决,
# 并且,该"小一级"的问题,还可以根据比其"更小一级"的问题的答案而得到解决,
# 以此类推,直到"最小一级"的问题。如果最小一级问题已知,则最终的问题也就解决了。
# 危险:
# 如果函数在执行的过程中没有一个"不再调用"的终结机制,那么就会出现"停不下来"的现象。
function f1($n){
$n++;
echo "$n ";
if($n < 5)
{
f1($n);
}
echo "$n ";
}
f1(1);
##########################
# 实例:阶乘
function jiecheng($n)
{
if ($n == 1)
{
return 1;
}
$re = $n * jiecheng($n - 1);
return $re;
}
$result1 = jiecheng(5);
echo "<br>5的阶乘为: $result1";
$result2 = jiecheng(10);
echo "<br>10的阶乘为: $result2";
echo "<br>15的阶乘为:".jiecheng(15);
##########################
# 实例:斐波那契数列
function feibo($n)
{
if ($n > 2)
{
$re = feibo($n - 1) + feibo($n - 2);
return $re;
}
return 1;
}
echo "<br>第1项的值为: " . feibo(1);
echo "<br>第2项的值为: " . feibo(2);
echo "<br>第3项的值为: " . feibo(3);
echo "<br>第4项的值为: " . feibo(4);
echo "<br>第5项的值为: " . feibo(5);
echo "<br>第10项的值为: " . feibo(10);
echo "<br>第20项的值为: " . feibo(20);
##################################################
# 文件加载
#
# 文件加载的含义
# 将一个(别的)文件包含到当前文件中,成为当前文件运行过程中的一部分。
# 通常,一些公共的代码,在多个页面都需要用到的时候,会做成一个独立的文件。
# 然后在不同的页面需要用到的时候,直接载入进来就可以了。
#
# 语法
# 可以是相对路径,或本地物理路径。
# include "要载入的文件路径";
#
# 说明
# 可以载入php文件,也可以载入html文件。
#
# 原理
# 载入一个文件的本质是:将被载入的文件"插入"到当前载入代码所在的位置。
##########################
# 文件加载的四种方式(重点)
#
include '要加载的文件';
include_once '要加载的文件';
require '要加载的文件';
require_once '要加载的文件';
# 其中,"要加载的文件",是一个文件路径,可以是相对路径,也可以是物理路径,或直接文件名
# 获取物理路径(绝对路径)的方式:
# __DIR__:表示当前文件所在路径,由它可以构建出绝对路径;
# getcwd():表示当前正访问的网页路径,由它也可以构建出绝对路径;
# cwd:其实是current working directory的简写;
#
# 非相对非绝对路径(其实就是没有给出路径,只给出文件名):不推荐!
# 形式为:include '文件名';
# 此时,会按如下顺序去寻找该文件:
# 1.先在php.ini中include_path项设定的目录中寻找该文件;
# 2.如果上一步没有找到,就在当前工作目录(由getcwd()获取)下寻找该文件;
# 3.如果上一步没有找到,就在当前载入语句的文件所在目录(由__DIR__获取)下寻找;
# 4.如果上一步还是没有找到,就报错了。
#
# 四种方式的区别
#
# include:每次都载入文件(可能会重复载入),如果载入失败,在报错后继续执行后续语句;
# include_once:只载入一次(不会重复载入),如果载入失败,在报错后继续执行后续语句;
# require:每次都载入文件(可能会重复载入),如果载入失败,在报错后终止程序;
# require_once:只载入一次(不会重复载入),如果载入失败,在报错后终止程序;
#
# 一般来说,如果被载入的文件内容,是后续代码运行的必备前提,则应该使用require载入。
# 如果被载入的文件内容,只需要(或只允许)出现一次,则应该使用 "xxxx_once" 载入。
##################################################
# 错误处理
#######################
# 1.错误分类
#
# 语法错误:
# 程序不能运行,是在运行之前,检查语法的时候,就发现语法出错,结果是提示错误,不运行程序。
#
# 运行时错误:
# 语法检查没错,然后开始运行,在运行中出现了错误,然后报错。
# 这是开发中最常见的错误。
#
# 逻辑错误:
# 程序能运行,且一直到结束没有报错,但执行得到的结果却是错的。
########################
# 2.常见错误代号(重点)
#
# 含义:
# 是指在程序运行时,发生的错误,系统会针对每种错误,给出相应的错误代号,并进行提示(报错)。
# 另外,程序如果在运行之前检查语法的时候就发现语法错误,也会报错,也有一个错误代号。
#
# 常见错误代号有:
# E_NOTICE:
# 提示性错误,轻微;
# 错误发生后,后面的程序继续执行。
# E_WARNING:
# 警告性错误,稍微严重;
# 错误发生后,后面的程序继续执行。
# E_ERROR:
# 严重错误/致命错误;
# 错误发生后,后面的程序不再执行!
# E_PARSE:
# 语法错误(语法解析错误);
# 语法解释错误,是直接就不运行程序。
# E_USER_NOTICE:
# 用户自定义的提示错误
# E_USER_WARNING:
# 用户自定义的警告错误
# E_USER_ERROR:
# 用户自定义的严重错误
# E_ALL:
# 它是一个代表"所有"错误的代号。
#
# 说明:
# 1,这些错误代号,其实只是系统预先设定的一些常量,他们的值大约是:1, 2, 4, 8, 16.....
# 2,这些错误代号,通常只是用于对错误控制时进行“设置”使用。
# 3,他们是一系列的整数,并具有一定的规律:1,2,4,8,16,32,64, 。。。。
# 4,可以在php.ini中使用(设置)他们
########################
# 3.错误触发
#
# 就是发生了一个错误的意思——即触发了错误。
# 有两种情形会触发错误:
# 1,程序本身有错,则运行时就会触发错误(并提示)。
# 2,程序本身没错,但出现不符合预计的情形(比如数据不符合要求)。
# 此时程序员可以主动触发一个错误,也可以说是由程序员“主动创建一个错误”
# ——这就是"用户错误",包括:
# E_USER_NOTICE:
# E_USER_WARNING:
# E_USER_ERROR:
# 如何触发"用户错误"呢?
#
# 自定义错误触发语法:
# trigger_error(“自定义错误提示内容”, 自定义错误的代号);
########################
# 实例:输入一个年龄(简化为变量值),如果年龄超过60或小于0,就触发一个notice错误!
function reg_user($a)
{
if ($a > 60 || $a < 0)
{
trigger_error("年龄不在我们公司的投保范围中", E_USER_NOTICE);
}
else
{
echo "<br>用户资料审核通过";
}
}
########################
# 4.错误显示设置
#
# 如果有错误发生(触发了错误),默认情况下会被显示在页面(即输出的结果页面)。
#
# 我们可以对此进行设置,以决定以下两点:
# 1,设置display_errors以决定是否显示错误:
# 在php.ini中设置: display_errors = On或Off
# 这里设置,影响所有使用该php语言引擎的代码(网站页面);
# 在php文件中设置: ini_set(‘display_errors’, 1或0); //1表示显示,0不显示
# 在这里设置,只影响当前网页代码本身。
# 2,设置error_reporting以决定显示哪些错误:
# 在php.ini中设置: error_reporting = 错误代号1 | 错误代号2 | .....
# //(要显示的就写出来,或者可以写E_ALL, 表示显示所有)
# 在代php文件中,道理类似:ini_set('error_reporting', 错误代号1 | 错误代号2 | .....)
########################
# 实例
ini_set("display_errors", 1);
ini_set("error_reporting",E_WARNING);
echo $v1;
echo "<h3>111</h3>";
include './no-this-file.php';
echo "<h3>222</h3>";
$n2 = round(2.6);
echo "<h3>333</h3>";
########################
# 5.错误日志设置
#
# 如果有错误发生(触发了错误),默认情况下不会将错误信息记录(保存)下来。
#
# 我们可以对此进行设置,以决定以下两点:
# 1,设置log_errors以决定是否记录错误:
# php.ini中设置:log_errors = On 或 Off
# 代码文件中设置:ini_set('log_errors', 1或0)
# 2,设置error_log以决定记录到哪里:
# 通常,就设置为一个文件名,php系统会在网站的每个文件夹下都建立该文件,并记录错误。
# php.ini中:error_log = error.txt; //它是纯文本的
########################
# 实例
ini_set("log_errors", 1);
ini_set("error_log", "./error_log.txt");
echo $v1;
echo "<h3>111</h3>";
include './no-this-file.php';
echo "<h3>222</h3>";
$n2 = round(2.6);
echo "<h3>333</h3>";
########################
# 6.自定义错误处理(重点/难点)
#
# 之前,我们面对的情形都是错误发生的时候,系统生成错误,并处理错误(给出错误信息)。
# 我们能控制的就只是:是否显示,显示什么,是否记录,记录到哪里?
#
# 实际上,我们也可以更进一步控制错误信息,以决定错误发生的时候,显示什么样的错误信息。
# 这就是"自定义错误处理"
#
# 具体做法,分2步:
# 第1步:
# 声明错误发生时,由我们自己来处理——设定一个错误处理的函数名。
# //set_error_handler("处理错误的自己的函数名");
# set_error_handler("my_error_handler");
# 第2步:
# 定义该函数,在函数中详细设定错误的处理情况:怎么显示,显示什么,怎么记录,记录什么。
# function my_error_handler($errCode, $errMsg, $errFile, $errLine)
# //参数解释:errCode错误代号,errMsg错误信息,errfile错误文件,errline行号
# //此形参顺序固定,而且是由系统会调用该函数并传入实参数据!
# {
# ....处理错误的代码....
# }
# 注意:
# 自定义错误只能处理“非致命错误”(就是不是E_ERROR错误)
#
set_error_handler("my_error_handler");
function my_error_handler($errCode, $errMsg, $errFile, $errLine)
{
$str = "<p>大事不好了,发生错误了,快来人呀...";
$str += "<br>发生时间: " . date('Y-m-d H:i:s');
$str += "<br>错误代号: " . $errCode;
$str += "<br>错误信息: " . $errMsg;
$str += "<br>错误文件: " . $errFile;
$str += "<br>错误行号: " . $errLine;
$str = "</p>";
echo $str;
// 也可以在这里继续去"记录错误"——就是错误日志
// FILE_APPEND表示该函数使用"追加模式"来写入数据
file_put_contents("./error.html", $str, FILE_APPEND);
}
##################################################
# 字符串
##########################
# 1.种不同形式的字符串
# heredoc字符串,和nowdoc字符串,适用于表达(描述)一大段内容的字符串,特别是适合于写html部分的代码(含js,css等)。
##########################
# 1.1.单引号字符串
#
# 特点:
# 1)只能使用2个转义符:\\(代表一个反斜杠)\’(代表一个单引号)
# 2)通常,如果没有其他特殊需求(比如字符串中使用一些转义符,以及一些变量),则推荐使用单引号字符串。
##########################
# 1.2.双引号字符串
#
# 特点:
# 1)能使用较为丰富的转义符,包括:\\ \” \n \r \t \$等
# \n:代表“换行符”(就是一个新行)
# \r:代表“回车符”(其实也是一个新行)
# \t:代表“tab符”,
# \$:代表“$”本身,因为双引号字符串中能识别(解析)变量,则如果不想要去解析,就用此转义!
$v1 = 10;
# 输出内容为:结果为:10
echo "结果为:$v1”;
# 输出内容为:结果为:$v1
echo "结果为:\$v1";
# 2)"$"符号在其中会被识别为是变量的起始符号,并试图读取变量值——即能识别变量;
# 3)识别其中变量,建议使用大括号括起来,类似这样:{$变量名}, {$数组[‘下标’]}
##########################
# 1.3.heredoc字符串
#
# 形式:$s1 = <<<"标识符"
# 这里写字符内容,可以多行写
# 标识符;
#
# 特点:
# 1)特点跟双引号字符串一样!
#
# 注意:
# 标识符结束那一行,只能出现标识符及紧挨着的分号,任何其他字符都不可以出现。
###########################
# 1.4.nowdoc字符串
#
# 形式:$s1 = <<<'标识符'
# 这里写字符内容,可以多行写
# 标识符;
#
# 特点:
# 无特点,是最“纯净”的字符串,写什么就是什么。
#
# 注意:
# 标识符结束那一行,只能出现标识符及紧挨着的分号,任何其他字符都不可以出现。
############################
# 2.字符串的长度问题
#
# 字符串的长度问题,有两个方面的理解:
# 1)一个字符串有几个字符(人可见到的字符个数);
# 2)一个字符串占据多少个字节空间(人不可见);
#
# 几个常识:
# a)1字节(B)就是8个bit位(最小的存储空间),1KB=1024B,1MB=1024KB,1GB=1024MB。。
# b)一个英文字符占据1字节空间,gbk编码中1个汉字占据2个字节,utf8编码1个汉字占3字节。
#
# 求php字符串的长度,有两个函数:
# strlen(字符串);
# 求该字符串的"字节数",也就是占据的字节空间大小.
# mb_strlen(字符串);
# 求该字符串的"字符个数"。另外要开启mb_string模块
###############################
# 3.常用字符串函数(重点)
###############################
# 字符串输出:
# echo: 输出一个或多个字符(不是函数,是语言结构)
# print:输出一个字符串
# print_r:输出变量的较为详细的信息
# var_dump:输出变量的完整信息
#
# 字符串去除与填充:
# trim:消除一个字符串两端的空白字符或指定字符(空白字符包括:空格,\n, \r, \t等)
$str1 = " ab cd ";
# "ab cd"
$str2 = trim($str1);
# ltrim:消除一个字符串左边的空白字符或指定字符
# rtrim:消除一个字符串右边的空白字符或指定字符
# str_pad:将一个字符串使用指定的字符填充到指定的长度
#
# 字符串连接与分割:
# implode:将一个数组的值连接起来组成一个字符串
# join:同implode
$arr1 = [‘ab’, ‘cd’, 12, 3.5]
# 用"-"连接该数组的所有项,结果为:"ab-cd-12-3.5"
$v2 = implode('-', $str1);
# explode: 将一个字符串使用指定的字符分割为一个数组
$v1= ”ab-cd-12-3.5”;
# 结果为:['ab', 'cd', 12, 3.5]
$arr1 = explode('-', $v1);
# 结果为:['ab-', '-12-3.5']
$arr2 = explode('cd', $v1);
# str_split:将一个字符串按指定的长度分割为一个数组
#
# 字符串截取:
# substr:获取一个字符串中指定位置开始指定长度的子字符串
# strstr:获取一个字符串中某个指定字符首次出现的位置起,到最后结尾处的字符
# 结果是:".12.3.txt"
strstr('abcd.12.3.txt', '.');
# strrchr:获取一个字符串中某个指定字符最后一次出现的位置起,到最后结尾处的字符
# 结果是:".txt"
strrchr('abcd.12.3.txt', '.');
# 字符串替换:
# str_replace:将一个字符串中的指定字符,替换为给定的新字符。
$v1 = ”ab-cd-12-3.5”;
# 结果是:"ab|cd|12|3.5"
$v2 = str_replace('-', '|', $v1);
# 结果是:”ab++cd++12++3.5"
$v3 = str_replace('-', '++', $v1);
# substr_replace:将一个字符串中指定位置开始的指定个数的字符,替换为给定的新字符。
# 字符串长度与位置:
# strlen:获取字符串的字节长度。
# strpos:获取一个字符串中某个子字符串首次出现的位置。
# 结果是:4
strpos(‘abcd.12.3.txt’, '.');
# strrpos:获取一个字符串中某个子字符串最后一次出现的位置。
# 结果是:9
strrpos('abcd.12.3.txt', '.');
# 结果是:2
strrpos(‘abcd.12.3.txt’, 'cd');
$v1 = 'abcdefg';
# 类似数组的语法,其实是取得一个字符串中某个位置上的字符!结果为'a'
$s1 = $v1[0];
# "d"
$s2 = $v1[3];
# 字符转换:
# strtolower:将一个字符串转换为小写。
# strtoupper:将一个字符串转换为大写。
# lcfirst:将一个字符串的首字母转换为小写。
# ucfirst:将一个字符串的首字母转换为大写。
# ucwords:将一个字符串中的所有单词的首字母转换大写。
# 特殊字符处理:
# nl2br:将换行符转换为”<br />”标签字符
# addslashes: 将一个字符串中的以下几个字符使用反斜杠进行转义:\ ‘ “
# htmlspecialchars:将html中的特殊字符转换为html实体字符,如下所示:
# (& ‘ “ < >)分别转换为:((& ' " < > )
# htmlspecialchars_decode:将html实体字符,转换回原本的字符。
##################################################
# 数组
#
# 数组,是指将若干数据按一定的顺序组合为一个整体。
# 每个数据被称为一个“单元”——数组单元。
# 每个单元由两部分构成:下标和值,下标也称为“键”(key),
# 数组的一个重要特点是:其中的数据有明确的顺序,而是,是其放入数组时的先后顺序。
#
# 数组有如下几种定义形式:
# 形式1:
$arr1 = array(单元1,单元2,...);
# 形式2:
$arr2 = [单元1,单元2,...];
# 单元(元素)的形式为:[下标=>]值
# 形式3:(不推荐)
$arr3[下标1] = 值1;
$arr3[下标2] = 值2;
......
# 数据取值的语法形式:
# 其中,下标可以是整数的,也可以是字符串的(注意有引号)
$数组名[下标];
##########################
# 1.数组下标问题
#
# 下标的可用值:可以使用整数或字符串
#
# 整数下标的特性
# 可以使用任意整数,也可以不显式使用下标,此时默认就是整数下标。
# 而且,从前往后,每一个没有使用下标的单元,系统给其分配的下标为之前所用过的整数下标的最大值+1(对于第一个是0)。
# 其下标分别为:0, 2, 3, ‘x’, 4
$arr1 = array(‘a’, 2=>’b’, ‘c’, ‘x’=>’d’, ‘e’);
# 其下标分别为:5, 2, 6, ‘x’
$arr2 = array(5=>‘a’, 2=>’b’, ‘c’, ‘x’=>’d’);
# 这一行,会自动创建一个数组
$arr3[‘x’] = 5;
# 此时下标就是0
$arr3[ ] = 6;
# 下标为1
$arr3[] = 8;
##########################
# 2.索引数组
#
# 通常是指一个数组的下标是从0开始的连续的整数。
# 举例1:
$arr1 = array(5, 8, 12, 2, 3);
$arr2 = [8, 22, 24, 22, 12];
$arr3[ ] = 8;
$arr3[ ] = 24;
$arr3[ ] = 22;
##########################
# 3.关联数组
# 通常是指一个数组的下标都是字符串。
$person = array(
‘name’=>’张三’,
‘age’=>18,
‘edu’=> ‘大学’,
‘salary’=>10000,
‘from’=>’北京’,
);
##########################
# 4.PHP数组的维数
#
# 按通常的数组元素的复杂程度,数组可以分为一维数组,二维数组,三维数组等等。
#
# 一维数组:
# 数组的每一个单元的值都是一个“非数组”值。
$arr1 = array(11, 12, 13, 14);
#
# 二维数组:
# 数组的每个单元的值都是一个“一维数组”。
$arr2 = array(
array(11, 12, 13),
array(21, 22, 23),
.....
);
# 三维数组:
# 数组的每个单元的值都是一个“二维数组”。
#
# 多维数组:
# 依此类推。。。。
#
# 不整齐数组(异形数组):
# 实际上,由于PHP的数组值可以是“任意数据”,因此,PHP数组的维数其实没有太大实际意义的。
# 所谓维数,其实是另一些编程语言中的数组的“整齐”格式的说法:一维数组类似排成一排的格子(线);
# 二维数组类似排成一个平面的格子(面);三维数组类似堆满了一屋子的格子(体)。
# 而php数组,却可以更为灵活,类似这样:
array(
1, 2, array(31, 32,), 4,
array(51, 52, 53, array(541, 542, 543, 544)),
6, array(71, 72, 73),
);
# 这种数组就不好说几维的了,而可以称为"异形数组"。
##########################
# 5.数组的遍历(重点)
##############
# 1.使用foreach语句遍历数组
# 遍历:就是对数组的每一项都“访问”到并进行所需要的数据处理。
foreach( $数组名 as [$key =>] $value){
# 这里,$key和$value只是变量,它会在遍历数组的过程中,按顺序依次取得数组每个单元的下标和值。
echo "<br />{$key} >>> {$value} ";
}
# 演示案例1:
# 输出以下这个数组的每一项,并求其平均值:
$arr1 = array(11, 12, 13, 14);
# 演示案例2:
# 使用数组的遍历语法,求以下这个数组的最大值及其下标!
$arr2 = array(11, 18, 21, 14, 8);
##############
# 2.使用for循环语句遍历数组
#
# 数组的指针:每一个数组内部,都有一个“指针”,正常情况下,指针指向数组的某个单元,起初默认是指向第一个单元。
# 对于数组 $arr1 = array( 18, 22, 13, 28, 15, 33, );
#
# 初始状态下,指针指向数组的第一个单元。
#
# php中有如下几个函数,可以针对数组指针进行相应操作:
# 取得数组中当前指针所在单元的值;
$re = current($arr1);
# 取得数组中当前指针所在单元的键(下标);
$re = key($arr1 );
# 将数组中的指针往后移动一个位置,并取得新位置上的值;
$re = next($arr1 );
# 将数组中的指针往前移动一个位置,并取得新位置上的值;
$re = prev($arr1 );
# 将数组中的指针移动到最后一个位置,并取得新位置上的值;
$re = end($arr1 );
# 将数组中的指针移动到最前一个位置,并取得新位置上的值;
$re = reset($arr1);
##########################
# 6.常用数组函数
# max():获取一个数组中的最大值
# min():获取一个数组中的最小值
# count():获取一个数组的元素个数
# in_array():判断一个数据是否在指定数组中。
# 语法形式:$b = in_array( $数组, 数据); //结果true或false
# range():生成某个范围的连续值的数组,比如range(3, 9)会得到数组:array(3, 4, 5, 6, 7, 8, 9, );
# array_keys():取出一个数组中的所有“键”并放入一个索引数组中。
$arr1 = array("a", 2=>"b", "c", "x"=>"d", "e");
# 结果是一个数组:[ 0, 2, 3, ‘x’, 4]
$v1 = array_keys($arr1);
# array_values():取出一个数组中的所有“值”并放入一个索引数组中。
# array_push():将一个或多个数据放入一个数组的“末端”。
# array_pop():将一个数组的最后一个单元删除,并返回该单元的值。
$arr1 = array("a", 2=>"b", "c", "x"=>"d", "e");
# 结果:$v1为”e”, 并同时$arr1变为:["a", 2=>"b", "c", "x"=>"d"]
$v1 = array_pop($arr1);
# array_reverse():将一个数组的所有单元的顺序进行反转(最前的放最后,最后的放最前)
##########################
# 7.数组排序算法(重点/难点)
#
# 常用的排序函数:sort, rsort, asort, arsort
$arr1 = array("a"=>8, "b"=>2, "c"=>5, "x"=>3, "e"=>6);
# 排好了!由低到高,结果为:[2, 3, 5, 6, 8]
sort($arr1);
# 排好了!由高到低,结果为:[8, 6, 5, 2, 2]
rsort($arr1);
# 冒泡排序算法
posted on 2020-03-15 15:33 herisson_pan 阅读(6) 评论(0) 收藏 举报
浙公网安备 33010602011771号