💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## 什么是引用变量?在PHP当中,用什么符号定义引用变量? 1. PHP的引用变量的概念及定义方式 **概念**: 在PHP中引用意味着用不同的名字访问同一个变量内容。 **定义方式**: 使用&符号 2. 延伸:PHP引用变量的原理 普通赋值 ``` //定义一个变量 $a= range(8,1988) //定义变量b,将a变量的值赋值给b // COW机制 Copy On Write $b=$a; //此时, $b和$a指向同一个内存地址,只有当$a改变时,$b才指向新的地址 //对a进行修改 $a= range(8,1999) ``` 引用赋值 ``` $b=&$a ``` $a和$b永远指向一个变量地址 ## 回话控制 ### cookie 保存本地中 ``` //赋值 setcookie($name, $value, $expire, $path, $domain, $seure); //取值 $_COOKIE($name); //删除 setcookie("TestCookie", "", time() - 10000 ); //设置数组 setcookie("user[three]", "cookiethree"); setcookie("user[two]", "cookietwo"); setcookie("user[one]", "cookieone"); ``` ### session 保存在服务器中 ``` //开始 session_start(); //赋值 $_SESSION['favcolor'] = 'green'; //清空session $_SESSION=[]; //删除sesion及cookie中的session_id session_destroy(); //删除 unset($_SESSION["newsession"]); //以下设置表示,在超过1440的sesison,有百分之一的概率删除session, ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 100); ini_set('session.gc_maxlifetime', 1440); //设置过期时间 ``` ### 传递session id 可在cookie被禁用时,也可以使用session_id 常量SID 如果开启了 cookie SID 就为空 如果没开启 SID 等价于 - PHPSESSIONID=session_id()的值, [如何传递 session_id 参考]( https://segmentfault.com/q/1010000007715137) ``` < a href="1.php?<? php echo SID ;?>">下个页面</a> //等价 < a href="1.php?<?php echo session_name() ;?>= <?php session_id() ;?>">下个页</a> ``` ### Session存储方式 如果有部署了多个服务器,那么 session_id 不能存在文件中,而是通过`session_set_save_handler`设置 存入`MYSQL、 Memcache、 Redis` 中 [php 官网有存储在sql 中的类实现方法](http://php.net/manual/zh/function.session-set-save-handler.php) ## 常用设计模式 常见设计模式:工厂模式、单例模式、注册树模式、适配器模式 观察者模式和策略模式 ## 字符串的定义方式 1. 单引号 2. 双引号 3. heredoc 类似双引号 ``` $str = <<<EoT ... EoT ``` 5. newdoc 类似单引号 ``` $str = <<<'EoT' ... 'EoT' ``` ## 知识点延伸 ### 浮点数不能进行比较运算 浮点转为 cpu 会损耗, ``` $a=0.8; $b=0.1; if ($a+$b==0.8){ echo $a+$b; } ``` ### 布尔类型 FALSE的七种情况 整型0、浮点00、布尔 false、空字符串、0字符串、空数组、NULL ### 数组类型 ### 超全局数组 `$GLOBALS、$_GET、$_POST、$_REQUEST、$_SESSION、 $_COOKIE、$_SERVER、$_FILES、$_ENV` $GLOBALS:包含所有已上所有元素 ``` $_SERVER['SERVER_ADDR′] //获取服务器的 ip $_SERVER['REMOTE_ADDR'] //用户 ip $_SERVER['SERVER_NAME'] //获取服务器的域名 www.example.com $_SERVER[ REQUEST_TIME'] //请求时间 $_SERVER['QUERY_STRING'] //?后的参数 $_GET 参数 $_SERVER['HTTP_REFERER'] //从哪一页进来 $_SERVER['HTTP_USER_AGENT'] //浏览器信息 $_SERVER['REQUEST_URI'] // 域名后的所有信息 /demo/index.php?name=cpj&age=12 $_SERVER['PATH_INFO'] // 网址路径信息 ,一般用于路由 ``` ### 三种情况 为NULL 直接赋值为NULL、未定义的变量、 unset销毁的变量 ### 常量 const、 define const更快,是语言结构, define是函数 const 可以在类中定义常量,define 不行 ### 优先级 `递增减 > ! > 算数运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目运算 > 赋值 > and > xor > or ` 短路作用:|| 和 && 与 and 和 or 的优先级不同; ``` //短路作用 $a = true || $b == 3; // $b 不会执行; 相当于$a =( true || $b == 3); $b = false && $a == 1; // $b 为false 此表达式不会执行 //优先级问题: $a = false || true; // $a = true; $b = false or true; // $b = false,整体是true; ``` 真题 ```php $a = 0; $b = 0; if($a = 3 > 0 || $b = 3 > 0){ //短路 $a=((3>0)||$b=3>0) 执行3>0后就短路,所以$ a=true $a++; $b++; echo $a; //$a = 1 (true); echo $b; //$b = 1; } ``` ## 流程控制 ### if与 elseif 把 if 范围小的放前面 ### switch ...case 控制表达式只能是 整型,浮点型和字符串 continue语句作用到 switch的作用类似于 break ### break break 的数字代表跳出几次循环 ``` for ($i = 0; $i < 3; $i++){ echo '外层循环'.$i.' 开始'."\n"; for ($j = 0; $j < 2; $j++){ if ($i == 1){ break 2; //使用break 2直接跳出2层循环 } echo '内层循环'.$i.'-'.$j."\n"; } echo '外层循环'.$i.' 结束'."\n"; } ``` ## 函数 ## 函数引用 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符`&` ``` function myFunc(){ static $b= 10; return $b; } $a = myFunc(); $a = & myFunc(); //$a 与$ b 互为应用 $a = 100; echo myFunc(); //100 ``` ### 打印函数 ``` //打印一个字符串 print() //打印一个或多个字符串 echo() //格式化输出 $num = 2.12; $d='123a'; printf("%.1f---%d",$num,$d); //2.1---123 //返回格式化值 $num = 2.12; $d='123a'; echo sprintf("%.1f---%d",$num,$d); //2.1---123 ``` ## 正则 ``` 正则表达式的作用:分割、查找、匹配、替换字符串 分隔符:正斜线(/)、hash符号(#) 以及取反符号(~) 通用原子:\d、\D、\w、\W、\s、\S 元字符: * ? A $ + {n } {n,} {n,m} [] () [^]| [-] 模式修正符: i m e s U x A D u ``` 后向引用 ```php $str='<b>abc</b>'; Pattern= '/<b>(.*)<\/b>/'; preg_replace($pattern, '\\1', $str); ``` 贪婪模式 ![](https://box.kancloud.cn/4e7bcc1b65b7b7e3fcbc32c875966344_1760x516.jpg) 用`.*?` 取消贪婪模式 ![](https://box.kancloud.cn/b1f80ac13e911b6f86f60f58448fca0f_1682x512.jpg) 用 `U`取消贪婪 `$pattern = '/<b>.*</b>/U'` 常用函数 ``` preg_match(), preg_match_all(), Preg_replace(), preg_split() ``` 中文匹配 UTF-8汉字编码范围是`0x4e00-0x9fa5`, ANSI(gb2312)环境下,`0xb0-0xf7`,`0xa1-0xfe` UTF-8要使用u模式修正符使模式字符串被当成UTF-8, ANSI(gb2312)环境下,要使用chr将Asc码转换为字符 ``` $str='中文' Pattern ='/[\xt{4e001-\x{t9fa5}]+/u'; ``` 匹配 img 的 src 值 ```php $str='<img alt="测试" id="aaa" src="aaa.jpg" />'; $pattern='/<img. *?src="(.*?).*?\/?>/i' // .*? 为取消贪婪 Preg_match( $Pattern, $str, $match); ``` ## 文件操作 ### 文件读取,写入 ``` 模式 描述 r 打开文件为只读。文件指针在文件的开头开始。 w 打开文件为只写。删除文件的内容或创建一个新的文件,如果它不存在。文件指针在文件的开头开始。 a 打开文件为只写。文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。 x 创建新文件为只写。返回 FALSE 和错误,如果文件已存在。 r+ 打开文件为读/写、文件指针在文件开头开始。 w+ 打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。 a+ 打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。 x+ 创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。 ``` 打开 `fopen("webdictionary.txt", "r")` 读取 ``` fread() 读取文件 fgets() 读取一行 fgetc() 读取一个字符 ``` 关闭 `fclose()` file_get_content() 与 file_put_content() 性能更好 其他 ``` file() 以数组形式读取字符串 ``` ### 目录操作函数 ``` 名称相关: basename()、 dirname()、 patino() 目录读取: opendir()、 readdir()、 closedir()、 rewinder() 目录删除: rmdir() //只有目录中没有文件,才可以删除 目录创建: mkdir() ``` ### 其他函数 ``` 文件大小: filesize() //目录文件大小,需要遍历每个文件 目录大小: disk_free_space() //磁盘可用空间、 disk_total_space() //总磁盘空间 文件拷贝:copy() 删除文件: unlink() 文件类型: filetype() 重命名文件或者目录: rename() 文件截取: truncate() 文件属性: file_exists()、 is_readable()、 is_writable()、 is_executable()、 filectime()、 fileatime()、 fillemtime() ``` 考题范围 文件操作模式,目录的遍历,目录的删除 ``` //在文件开头写入 hello word $path = 'demo.txt'; $handle = fopen($path, 'r'); $content = fread($handle, filesize($path)); $content = "hello word" . $content; fclose($handle); //写入 $handle = fopen($path, 'w'); fwrite($handle, $content); fclose($handle); ``` 目录的遍历 ``` function loopdir($dir){ $handle = opendir($dir); while(false!==($file=readdir($handle))){ if ($file !=='.' && $file!=='.'){ echo $file."\n"; if (filetype($dir.'/'.$file)=='dir'){ loopdir($dir.'.'.$file); } } } } loopdir($dir); ```