博客列表 >PHP基础知识小结1

PHP基础知识小结1

J
J原创
2020年08月20日 16:07:09994浏览

1.变量与常量的区别与创建,访问方式

变量与常量的区别

变量是临时存储数据的容器,是实现数据服用的手段。变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制。变量必须以$作为开始,变量名区分大小写
常量创建必须给定一个值,一旦被定义就无法再更改,通常用大写表示。常量不受作用域限制

变量与常量的创建

变量名必须以$作为开始,不允许使用特殊字符,数字作为变量的开始,必须使用字母或下划线开始,后面允许使用数字
常量的创建分为两种:关键字 const 创建,define() 函数创建,在类中,类的常量只能用 const 创建

  1. //变量
  2. $str = '这是一个变量';
  3. //常量,一旦定义就无法更改
  4. const APP_NAME = 'demo';
  5. define('APP_ID' 110);
  6. class Demo {
  7. const CLASS_NAME = 'Demo';
  8. }
  9. $name = 'APP_NAME';

变量与常量的访问方式

变量和常量都可以使用 echo 直接输出 echo 没有返回值,效率最高,常量的变量化,只能使用constant()函数来获取

  1. //输出变量$a
  2. echo $str;
  3. echo '<br>'; //换行
  4. //访问常量
  5. echo APP_NAME;
  6. echo '<br>';
  7. echo APP_ID;
  8. echo '<br>';
  9. //访问类中的常量
  10. echo Demo::CLASS_NAME;
  11. // 常量名的变量化,只能使用函数来获取
  12. echo constant($name);

代码执行结果如下:

2.变量过滤器的常用函数与用法

变量过滤器的常用函数主要有:

  • filter_list()用来获取过滤器名称
  • filter_id()用来获取过滤器 ID,参数是过滤器名称
  • fliter_var() filter_var_array()分别用来过滤单个和多个变量
  • filter_has_var()用于检测是否存在某个外部变量
  • filter_input() filter_input_array()分别用于过滤单个和多个外部变量
    外部变量类型: INPUT_GETINPUT_POSTINPUT_COOKIEINPUT_SERVERINPUT_ENV
    过滤器主要分为两大类: 验证过滤器清理过滤器
    验证过滤器:主要用于数据类型和格式的验证
    清理过滤器:主要用于去掉非法字符,保留指定字符
  1. //1.返回过滤器的名称
  2. echo '<hr>';
  3. echo '<pre>';
  4. print_r(filter_list());
  5. //2.返回过滤器的ID filter_id(过滤器的名称)
  6. echo '<hr>';
  7. var_dump(filter_id('validate_email'));
  8. echo "<br>";
  9. var_dump(filter_id('int'));
  10. echo '</pre>';
  11. // 3.过滤单个变量 filter_var()
  12. echo '<hr>';
  13. // 在验证范围内的变量
  14. $num1 = 88;
  15. // 在验证范围外的变量
  16. $num2 = 101;
  17. $option = ['options' => ['min_range' => 1,'max_range' => 100]];
  18. var_dump(filter_var($num1 , FILTER_VALIDATE_INT,$option));
  19. echo "<br>";
  20. var_dump(filter_var($num2 , FILTER_VALIDATE_INT,$option));
  21. echo '<hr>';
  22. //4.过滤多个变量
  23. //不符合验证规则变量
  24. $var1 = 100;
  25. $var2 = 'abc';
  26. //符合验证规则变量
  27. $var3 = 666;
  28. $var4 = 888;
  29. //验证不通过将返回false
  30. var_dump(filter_var_array([$var1,$var2],FILTER_VALIDATE_INT));
  31. echo "<br>";
  32. var_dump(filter_var_array([$var3,$var4],FILTER_VALIDATE_INT));
  33. echo "<hr>";
  34. //5.检查是否存在指定变量filter_has_var()
  35. //http://edu.std.com/demo2.php?var1=test
  36. //当前请求只有一个参数
  37. var_dump(filter_has_var(INPUT_GET,'var1')); //返回true
  38. echo "<br>";
  39. var_dump(filter_has_var(INPUT_GET,'var2')); //返回false
  40. // 6.验证过滤外部变量filter_input()
  41. //http://edu.std.com/demo3.php?name=%3Cspan%3Etest%3C/span%3E
  42. //FILTER_SANITIZE_STRING 清理过滤器
  43. var_dump(filter_input(INPUT_GET,'name',FILTER_SANITIZE_STRING));
  44. echo '<hr>';
  45. //7.批量验证过滤外部变量filter_input_array()
  46. $args = [
  47. 'name' => FILTER_SANITIZE_STRING, //清理过滤器,清理字符串中的非法字符
  48. 'age'=> ['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>18,'max_range'=>60]],
  49. 'email'=>FILTER_VALIDATE_EMAIL, //验证过滤器,验证邮箱格式
  50. 'is_married' => FILTER_VALIDATE_BOOLEAN, //验证过滤器,验证布尔值
  51. 'test_url'=> FILTER_VALIDATE_URL //验证过滤器,验证URL格式
  52. ];
  53. echo "<pre>";
  54. //http://edu.std.com/demo3.php?name=%3Cspan%3Edemo%3C/span%3E&age=200&email=1451535153qq.cpm&is_married=%E6%98%AF&test_url=edu.std.com/demo3.php
  55. //非合法数据传值
  56. var_dump(filter_input_array(INPUT_GET,$args));
  57. /*array(5) {
  58. ["name"]=>
  59. string(4) "demo"
  60. ["age"]=>
  61. bool(false)
  62. ["email"]=>
  63. bool(false)
  64. ["is_married"]=>
  65. bool(false)
  66. ["test_url"]=>
  67. bool(false)
  68. }*/
  69. //http://edu.std.com/demo3.php?name=demo&age=20&email=1451535153@qq.cpm&is_married=1&test_url=http://edu.std.com/demo3.php
  70. var_dump(filter_input_array(INPUT_GET,$args));
  71. /*
  72. array(5) {
  73. ["name"]=>
  74. string(4) "demo"
  75. ["age"]=>
  76. int(20)
  77. ["email"]=>
  78. string(17) "1451535153@qq.cpm"
  79. ["is_married"]=>
  80. bool(true)
  81. ["test_url"]=>
  82. string(28) "http://edu.std.com/demo3.php"
  83. }
  84. */

代码执行结果:

3.函数的类型

  • 内置函数:系统给用户提前写好的,可以开箱即用,不需要也不允许再申明
  • 自定义函数:用户根据项目需求自己写的
  • 可变函数:将函数名称放在一个变量中进行引用
  • 匿名函数:没有函数名称,匿名函数也被叫做闭包
  1. //1.系统函数/内置函数
  2. var_dump(111); //用于打印数据,并输出数据类型
  3. echo '<hr>';
  4. //2.自定义函数
  5. function getStr(float $money , float $discount){
  6. $pay = $money * $discount;
  7. $str = '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
  8. return $str;
  9. }
  10. echo getStr(1000 , 0.8);
  11. echo '<hr>';
  12. // 3.可变函数:将函数名称放在一个变量中进行引用
  13. $funcName = 'getStr';
  14. echo $funcName(5000 , 0.6);
  15. echo '<hr>';
  16. // 4. 匿名函数
  17. $getStr = function (float $money , float $discount){
  18. $pay = $money * $discount;
  19. $str = '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
  20. return $str;
  21. }; //匿名函数不是代码块需要加分号结束
  22. echo $getStr(4000,0.8);
  23. echo '<hr>';
  24. // 闭包函数,可以访问上一级空间的成员
  25. $discount = 0.6;
  26. // 访问上一层空间的$discount
  27. $str = function (float $money) use ($discount){
  28. $pay = $money * $discount;
  29. return '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
  30. };
  31. echo $str(10000);
  32. echo '<hr>';
  33. $srting = function ($discount) {
  34. // 使用上一层的$discount
  35. // 子函数全局不可见,只有父函数可见
  36. return function (float $money , int $num) use ($discount){
  37. $p = $money * $num;
  38. $pay = $p * $discount;
  39. return '原价:' .$p .' 元,实际支付 '.$pay . ' 元<br>';
  40. };
  41. };
  42. $pay = $srting(0.8);
  43. echo $pay(500 , 8); //通过父函数访问子函数
  44. echo $srting(0.8)(500,8);

代码执行结果如下:

4.函数的返回值方式

函数必定有返回值,函数只支持单值返回,可以以下方式实现多值返回:

  • 通过字符串拼接返回多值
  • 通过数组返回
  • 通过 json 字符串返回
  • 通过将返回值序列化成字符串返回多值
  1. // 1.通过自负窜拼接返回多值
  2. function res1(){
  3. $status = 0;
  4. $msg = 'success';
  5. return $status . ' => ' . $msg .'<br>';
  6. }
  7. echo res1();
  8. echo '<hr>';
  9. // 2.通过数组的方式返回多值
  10. function res2(){
  11. $status = 0;
  12. $msg = 'success';
  13. $arr = ['status'=> $status,'msg' => $msg];
  14. $str = implode(" => " , $arr);
  15. return $str;
  16. }
  17. echo res2();
  18. echo '<hr>';
  19. // 3.通过json格式化字符串返回多值
  20. function res3(){
  21. $status = 0;
  22. $msg = 'success';
  23. $arr = ['status'=> $status,'msg' => $msg];
  24. return json_encode($arr);
  25. }
  26. echo res3();
  27. echo '<hr>';
  28. // 4.通过将返回值序列化返回多值
  29. function res4(){
  30. $status = 0;
  31. $msg = 'success';
  32. $arr = ['status'=> $status,'msg' => $msg];
  33. return serialize($arr);
  34. }
  35. echo res4();

代码执行结果如下:

5.函数的参数

函数的参数主要分为 4 种:值传递参数引用参数默认参数剩余参数

  1. //函数的参数
  2. // 1.值参数:值传递参数(默认方式)
  3. function demo1(int $argc){
  4. // 函数中对参数的操作不影响外部参数的值
  5. return $argc += 10000;
  6. }
  7. echo demo1(100),'<br>';
  8. echo '<hr>';
  9. // 2.应用参数,在参数前添加地址符 : &
  10. function demo2(int &$argc){
  11. // 函数中对参数的操作会改变外部参数的值
  12. return $argc += 10000;
  13. }
  14. $var = 100;
  15. echo demo2($var),'<br>';
  16. echo $var,'<br>'; //10100
  17. echo '<hr>';
  18. // 3.默认参数
  19. function demo3(int $argc, int $num = 1000){
  20. return $argc += $num;
  21. }
  22. $var = 100;
  23. echo demo3($var),'<br>'; //第二个参数不传值,默认使用默认参数1000
  24. echo demo3($var, 3000);
  25. echo '<hr>';
  26. //4.剩余参数 ...rest /...spread
  27. //...$args 将传入的参数全部放入到一个素组$args中
  28. function demo4(...$args){
  29. // 计算数组值的和
  30. return array_sum($args);
  31. }
  32. // 传入值是多个参数
  33. echo demo4(2,3,4,5,6),'<br>';
  34. function demo5(...$args){
  35. return array_sum($args);
  36. }
  37. $data = [2,3,4,5,6];
  38. // ...spread 将数组参数打散
  39. echo demo5(...$data);

代码执行结果如下:

6.函数的回调执行方式

回调函数是异步执行的重要工具,用call_user_func()call_user_func_array() 来回调函数

  1. // 回调函数
  2. function demo1(...$args){
  3. return array_sum($args);
  4. }
  5. function demo2(){
  6. sleep(5);
  7. return '5s later <br>';
  8. }
  9. // 以回调的方式来执行一个函数
  10. echo call_user_func('demo1',2,3,4,5,6);
  11. echo '<br>';
  12. echo call_user_func_array('demo1',[2,3,4,5,6]);
  13. echo '<br>';
  14. echo call_user_func('demo2'); //demo2 执行长时间过程,不影响后续代码的执行
  15. echo 'sleep 5';
  16. echo '<hr>';
  17. $data = range(1,50);
  18. // 将数组的值 *2 处理
  19. $arr = array_map(function ($item) {
  20. return $item *=2;
  21. },$data);
  22. print_r($arr);

代码执行结果如下:

7.函数的命名空间

php 中不允许在同一个命名空间中声明同名函数

  1. //命名空间
  2. namespace ns1;
  3. function demo1(){
  4. return '命名空间 ' . __NAMESPACE__ .' 的方法 ' . __FUNCTION__;
  5. }
  6. echo demo1();
  7. echo '<hr>';
  8. namespace ns2;
  9. function demo1(){
  10. return '命名空间 ' . __NAMESPACE__ .' 的方法 ' . __FUNCTION__;
  11. }
  12. echo demo1();
  13. echo '<br>';
  14. // 在ns2中调用ns1中的demo1()
  15. echo \ns1\demo1();

代码执行结果如下:

8.字符串的四种创建方式与应用场景数

字符串创建的方式有四种:单引号双引号heredocnowdoc;
单引号:单引号中的特殊字符,变量不能被解析,变量只能通过与字符串组合后输出,如果单引号中又出现单引号,必须使用转义符进行转义

双引号: 可以解析特殊字符和变量,多个空格或者回车在页面中被视为 1 个,如果双引号中出现双引号,必须使用转义符进行转义

heredoc: 双引号的升级本,可以解析变量,且双引号不需要被转义,使用于写 php+html 模版

nowdoc: 单引号的升级版,适合大段的存文本,不适合内嵌变量和特殊字符的文本

  1. // 1.单引号 ''
  2. $str = 'string';
  3. // 单引号中变量不能被解析
  4. echo 'This is a $str demo. <br>';
  5. // 通过和变量拼接来解析变量
  6. echo 'This is a ' . $str . ' demo. <br>';
  7. //特殊字符 \r\n原样输出,不能被解析
  8. echo 'This is \r\n a demo. <br>';
  9. // 单引号中出现单引号,必须使用 \ 转义
  10. echo 'This is a \'sting\' demo. <br>';
  11. //输出一个\
  12. echo 'This is a \\ demo';
  13. echo '<hr>';
  14. // 2.双引号 ""
  15. // 双引号中变量被解析
  16. echo "This is a {$str} demo. <br>";
  17. // 双引号的特殊字符能被解析
  18. echo "This is a \r\n demo. <br>";
  19. // 双引号中出现双引号,必须使用 \ 转义
  20. echo "This is a \"string\" demo. <br>";
  21. echo '<hr>';
  22. // 3.heredoc
  23. $username = 'username';
  24. //可以解析变量,且双引号不需要转义,适用于写html模版
  25. echo <<< EOF
  26. <fieldset>
  27. <legend>用户登录</legend>
  28. <form action="" method="post">
  29. <div>
  30. <label for="user-name">用户名:</label>
  31. <input id="user-name" type="text" name="username" value="{$username}" placeholder="不少于10个字符" required autofocus />
  32. </div>
  33. <div>
  34. <label for="pwd">密码:</label>
  35. <input id="pwd" type="password" name="password" value="" placeholder="不少于8位" require />
  36. </div>
  37. <div>
  38. <button>登录</button>
  39. </div>
  40. </form>
  41. </fieldset>
  42. EOF;
  43. echo '<br>';
  44. // 4.nowdoc
  45. // nowdoc 的起始标签必须加单引号
  46. echo <<< 'EOF'
  47. This is a long {$str} <br>This is a \r\n <br>This is a long string <br>
  48. This is a long string <br>
  49. EOF;
  50. // nowdoc不解析变量,适合写大段文本

代码执行结果如下:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议