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) 收藏 举报