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) }