PHP学习记录扩展
1 <?php 2 3 // 文件加载 4 // include "要载入的文件路径"; //可以是相对路径,或本地物理路径。 5 // 可以载入php文件,也可以是html文件 6 // include "../../dir1/dir2" 7 8 //获取路径 9 echo "<br>当前路径为:".__DIR__; 10 $file = __DIR__."\Test\\test.php"; //转义 11 include $file; 12 //getcwd()这个函数可以获得当前浏览的网页文件所在的路径。 13 //注意与__DIR__的区别。 14 //假如当前浏览的网页是func.php,里面载入了Test文件夹下的test.php文件,但是test.php里面的getcwd()获得的依旧是func.php的绝对路径,而__DIR__获得的是test.php的绝对路径,要加以区分。 15 16 //getcwd()中的cwd:current working directory 17 18 //四种载入文件方式的区别 19 /* 20 include:可重复载入,如果载入失败,报错后继续执行后续语句; 21 include_once:不可重复载入,如果载入失败,报错后继续执行后续语句; 22 require:可重复载入,如果载入失败,报错后终止程序; 23 require_once:不可重复载入,如果载入失败v,报错后继续执行后续语句; 24 25 */ 26 27 //错误处理 28 //常见错误代号:(都是系统常量,integer) 29 //NOTICE:8提示性错误,轻微;错误发生后,后面的程序继续执行; 30 //WARNING:2警告性错误,继续执行; 31 //ERROR:1致命错误,不执行后续程序; 32 33 // 在php.ini配置文件中可以设置错误报告的等级,error_reporting = E_ALL,设置成all则报告所有,设置成error则只会报告error型的错误;或者设置E_NOTICE | E_WARNING ,只报这两中错误; 34 35 36 //错误触发 37 //有些程序本身没错,但在运行时出现了不符合预计的情形,比如数据不符合要求,此时程序员可以主动触发一个错误,也可以说是由程序员主动创建一个错误,这就是"用户错误",包括:E_USER_NOTICE,E_USER_WARNING,E_USER_ERROR 38 39 //触发语句:trigger_error("自定义的错误提示信息",用户错误代号) 40 41 42 function reg($age) 43 { 44 if($age>70 || $age<12) 45 { 46 trigger_error("[用户年龄不在我们的服务范围内。]",E_USER_NOTICE); 47 } 48 else 49 { 50 echo "注册通过"; 51 } 52 53 } 54 55 $age = 38; 56 reg($age); 57 $age = 88; 58 reg($age);//Notice: [用户年龄不在我们的服务范围内。] in C:\mywamp\Apache24\htdocs\day3\func.php on line 446 59 60 //在php.ini中,字段display_errors = on(或者off)决定程序是否展示错误;(改配置要重启apache服务器) 61 /* 62 或者在某个php文件中自行设置是否展示错误,展示何种错误: 63 ini_set("display_errors", 0);//表示不展示所有致命错误 64 ini_set("error_reporting",E_WARNING);//只报告警告 65 66 在php.ini中log_errors = On 或者 Off 决定是否记录错误; 67 ini_set("log_errors",1); //记录错误 68 还可以设置错误记录到哪里: 69 php.ini中: 70 error_log = error.txt //在php文件所在的文件夹下建立txt 71 php代码中: 72 ini_set("error_log","error.txt"); 73 74 */ 75 76 77 //自定义错误 78 79 // 自定义错误分为两步: 80 // 1、声明使用自己的函数来处理错误; 81 set_error_handler("my_error_handler");//函数名自定义 82 // 2、定义该函数; 83 function my_error_handler($err_Code,$err_Msg,$err_File,$err_Line) 84 { 85 $str = "<br><font color='red'>出错啦!</font>"; 86 $str.="<br>错误发生时间:".date("Y-m-d H:i:s"); 87 $str.="<br>错误代号:".$err_Code; 88 $str.="<br>错误信息:".$err_Msg; 89 $str.="<br>错误文件:".$err_File; 90 $str.="<br>错误行号:".$err_Line; 91 echo $str; //输出错误 92 file_put_contents("./myError.html", $str,FILE_APPEND);//生成错误日志,追加写入 93 94 } 95 // 以后遇到错误系统都会自动调用上面的错误处理函数 96 // 制造错误: 97 echo $haha; //未定义变量 98 include "./hahaha.php";//载入失败 99 function f(){}; 100 // ff(); //调用未定义函数 101 102 echo "hahahaha"; //此行不输出 103 104 105 // 注意:自定义错误处理只能处理notice和warning,不能处理error。 106 107 echo "<br>=====================================================<br>"; 108 $a=666; 109 echo "a$a"; //a666,建议用{}括起来 110 echo '"a"$a'; //"a"$a,单引号不能识别$变量,里面能带“” 111 echo 'ab\'c'; //ab\'c 112 echo "adc\r\n\tdefg"; // \n\r都是换行,体现在页面的源代码中,不同浏览器不同系统使用\n或\r。 113 114 //heredoc字符串,类似于""字符串 115 $str = <<< "aaa" 116 <br>这里面可以写多行内容, 117 <br>这里面可以写多行内容, 118 <br>这里面可以写多行内容, 119 <br>结束的时候只能是另起一行,写aaa;不要写别的任何东西; 120 <br>注释都不行;开始行也一样,加个空格都不行; 121 aaa; 122 echo $str; 123 /* 124 $js = <<< "aa" 125 <script> 126 var v1 = "hello people"; 127 alert(v1); 128 </script> 129 aa; 130 echo $js; 131 */ 132 //nowdoc字符串也一样。类似于‘’字符串 133 134 //字符串长度 135 // strlen(字符串)字节长度 136 echo strlen("abc123雯"); // 9,utf8中一个汉字占3个字节 137 echo strlen("ab\n\rc\tde"); //8 138 139 // mb_strlen(字符串)字符长度 140 // 使用之前要在php.ini文件中开启扩展模块extension=mbstring,否则会报错 141 echo mb_strlen("abc123大\r"); //8,3+3+1+1 142 143 // 用gbk编码打开utf8编码的文件,文件内容为:我是chinese,会出现乱码,"我"在utf8中用三个字节表示为xxx,“是”也是xxx,连起来就是xxx xxx chinese,此时gbk会将前两个xx当成一个汉字,这就出现三个乱码的汉字和chinese了。 144 145 146 echo "<br>=====================================================<br>"; 147 148 //常用字符串函数 149 // trim:消除一个字符串两端的空白字符 150 // ltrim和rtrim左右 151 152 echo trim(" a bc "); 153 154 // implode:将一个数组的值连接起来组成一个字符串,通join 155 156 $a = ["花花",123,3.14]; 157 158 echo join('-',$a);//花花-123-3.14 159 echo implode('-',$a);//花花-123-3.14 160 161 // explode:将一个字符串使用指定的分隔符分割为一个数组 162 var_dump (explode('-',"花花-123-3.14"));//array(3) { [0]=> string(6) "花花" [1]=> string(3) "123" [2]=> string(4) "3.14" } 163 164 //str_split:将字符串按指定的长度分割成一个数组 165 //str_replace:替换字符串 166 echo str_replace('-','==',"花花-123-3.14");//花花==123==3.14 167 168 // strpos:获取一个字符串中某个子字符串首次出现的位置 169 echo strpos("abc.3.14.5",'.'); //3 170 171 // strrpos:获取一个字符串中某个子字符串最后一次出现的位置 172 echo strrpos("abc.3.14.5",'.'); //8 173 174 // strtolower:转小写 175 // strtoupper:转大写 176 echo strtolower("ABCde");//adcde 177 echo strtoupper("ABCde");//ABCDE 178 179 // lcfirst:首字母小写 180 // ucfirst:首字母大写 181 echo lcfirst("ABC"); //aBC 182 echo ucfirst("abc"); //Abc 183 184 // ucwords:所有单词的首字母转大写 185 echo ucwords("hello world."); //Hello World. 186 187 // strstr:截取指定字符首次出现的位置后面的子字符串 188 echo strstr('abc.com.txt', '.'); //.com.txt 189 // strrchr:截取指定字符最后一次次出现的位置后面的子字符串 190 echo strrchr('abc.com.txt', '.'); //.txt 191 192 //substr:从指定位置处取指定长度的子字符串 193 echo substr('adcde',2,1); //c 194 195 // 练习:从用户上传的文件中取出图片文件 196 197 $files = ['adc.gif','123.txt','hehe.PNG','haha.jpg','adn112.mp4']; 198 $len = count($files); 199 for ($i=0; $i < $len; $i++) { 200 $houzhui = strrchr($files[$i],'.'); 201 $houzhui = substr($houzhui,1); 202 $houzhui = strtolower($houzhui); 203 if ($houzhui == "jpg" || $houzhui=="png" || $houzhui=="gif") { 204 echo "<br>$files[$i]"; 205 } 206 } 207 // adc.gif 208 // hehe.PNG 209 // haha.jpg 210 211 212 echo "<br>=====================================================<br>"; 213 214 //数组 215 216 // 下标:数组的下标只能是整数和字符串,不给则默认整数,从0开始,整数加1; 217 $arr1 = array('a',3=>'b','c','d'=>'d'); 218 var_dump($arr1);//array(4) { [0]=> string(1) "a" [3]=> string(1) "b" [4]=> string(1) "c" ["d"]=> string(1) "d" } 219 220 221 //数组维度,即嵌套数组,数组的内部元素也是数组 222 // 练习:计算数组的总和 223 // 这里的数组很规范,都没有下标,使用for循环遍历即可 224 $arr2 = [[1,2,3],[4,5,6,7],[8,9,10,11,12]]; 225 $len1 = count($arr2); 226 $sum = 0; //总和 227 $count = 0; //个数累加器 228 for ($i=0; $i < $len1; $i++) { 229 $arr3 = $arr2[$i]; 230 $len2 = count($arr3); 231 for ($j=0; $j < $len2; $j++) { 232 $sum += $arr3[$j]; 233 $count++; 234 $average=$sum/$count; 235 } 236 } 237 238 echo "<hr>数组的总和为:{$sum},平均值为:{$average}"; 239 240 241 242 // 对于那些有下标的数组遍历,用到foreach语句比较方便 243 $arr4 = [1,'a'=>'aa','5'=>3,9=>666]; 244 foreach ($arr4 as $key => $value) { 245 echo "<hr>{$key}:{$value}"; 246 } 247 248 // current() 函数返回数组中的当前元素的值。每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。 249 // 移动内部指针的方法还有:next()下一个,prev()上一个,reset()第一个,end()最后一个 250 echo "<hr>".current($arr4); //1 251 echo "<hr>".next($arr4); //aa 252 echo "<hr>".current($arr4); //aa 253 echo "<hr>".prev($arr4); //1 254 echo "<hr>".end($arr4); //666 255 echo "<hr>".key($arr4); //9 256 257 echo "<hr>".reset($arr4); //1 258 259 //也可以用for循环遍历 260 261 reset($arr4); 262 $len = count($arr4); 263 for ($i=0; $i < $len; $i++) { 264 $key = key($arr4); 265 $value = current($arr4); 266 echo "<hr>{$key}:{$value}"; 267 next($arr4); 268 269 } 270 //常用数组函数 271 $arr5 = [1,'A','a','a1','3',2]; 272 echo "<hr>".max($arr5); //3 273 echo "<hr>".min($arr5); //2,这种含字母的数组最小值感觉很奇怪 274 var_dump (in_array('haha',$arr5)); //false 275 //生成某个范围的连续值的数组: 276 print_r(range(1,9));//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 ) 277 echo "<br>"; 278 //取出一个数组中所有的"键"并放到一个索引数组中: 279 $a = array_keys($arr4); 280 var_dump($a);//array(4) { [0]=> int(0) [1]=> string(1) "a" [2]=> int(5) [3]=> int(9) } 281 echo "<br>"; 282 //取出一个数组中所有的"值"并放到一个索引数组中: 283 $a = array_values($arr4); 284 var_dump($a);//array(4) { [0]=> int(1) [1]=> string(2) "aa" [2]=> int(3) [3]=> int(666) } 285 286 // 将一个数组的最后一个元素删除,并返回该元素的值: 287 echo "<br>".array_pop($arr5); // 2,此时$arr5里面就没有2了 288 //向一个数组尾部追加一个或多个元素: 289 array_push($arr5, "这",'是添加的'); 290 var_dump($arr5);//array(7) { [0]=> int(1) [1]=> string(1) "A" [2]=> string(1) "a" [3]=> string(2) "a1" [4]=> string(1) "3" [5]=> string(3) "这" [6]=> string(12) "是添加的" } 291 //翻转数组内的元素,生成一个新数组: 292 $a = [1,2,3]; 293 $b = array_reverse($a); 294 var_dump($b);//array(3) { [0]=> int(3) [1]=> int(2) [2]=> int(1) } 295 var_dump($a);//array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 296 297 //数组排序 298 // sort():由低到高,会改变原数组,不保留键 299 // rsort():由高到低 300 $a = ['a'=>2,5,3,2=>7,6]; 301 sort($a); //23567 302 rsort($a); //76532 303 //asort()和arsort()会保留键 304 305 //冒泡排序算法 306 //冒泡排序其实是笨方法,假如有10个数,先将第一个数和第二个数比,谁大就放在后面,再将第二个数和第三个数比,以此类推,要比较9次,最后最大的那个数肯定被排到了末尾,前面的数大小顺序依旧是乱的,这是第一轮比较;总共比较9轮,到第9轮时只有两个数,比较一次即可。即n个数冒泡,比较n-1轮,第一轮比较n-1次,第n-1轮比较1次。 307 // 演示如下: 308 $a = [3,5,2,7,9,8,4,6,0,1]; 309 $len = count($a); 310 $b = []; 311 for ($i=1; $i < $len; $i++) { 312 for ($j=0; $j < $len-$i; $j++) { 313 if ($a[$j]>$a[$j+1]) 314 { 315 $temp = $a[$j]; 316 $a[$j] = $a[$j+1]; 317 $a[$j+1] = $temp; 318 } 319 } 320 } 321 echo "<hr>"; 322 var_dump($a);//array(10) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) [5]=> int(5) [6]=> int(6) [7]=> int(7) [8]=> int(8) [9]=> int(9) }