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  阅读(3)  评论(0)    收藏  举报

导航