博客列表 >【php开发】之php变量知识,流程控制与函数详解

【php开发】之php变量知识,流程控制与函数详解

林辉
林辉原创
2020年09月07日 16:43:31488浏览

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

1.1 变量与常量的区别

1.1.1 变量特点:

1)在定义后后还可以多次赋值
2)可以通过unset()销毁
3)变量名区分大小写
4)变量名必须使用 “$“作为开始
5)变量名/标示符 必须使用字母或下划线开始,后面允许使用数字,“_” “[a~z,A~Z]”,”[0~9]”

1.1.2 常量特点

1) 常量前面面没有$符号
2) 常量只能通过define()函数定义或者是const关键字定义(php5.3后),且值只能是标量,即可以是 整型 浮点型 布尔型 null字符串等。
3) 在定义后,无论在哪定义,都可以直接调用,没有作用域。
4) 定义后不可以再赋值一直存在内存中,不能被销毁。

1.2 变量与常量的创建与访问方式

1.2.1常量的创建

常量的创建有关键字const和函数创建,

关键字const

  1. const APP_PATH = '/phpstudy_pro';

函数创建

  1. define('APP_NAME','客户管理系统');

1.2.2 常量的访问方式

常量可以以下两种方式获取
方式1;

  1. echo 'APP_PATH';

方式2;

  1. echo constant('APP_PATH');

推荐使用方式2。
因为当出现以下情况时,

  1. $name = 'APP_PATH';
  2. echo $name;

获取的APP_PATH,会显示APP_PATH字符串,而不会显示APP_PATH = ‘/phpstudy_pro’的值。
而通过constant来获取,便可以。

  1. echo constant($name);

要记住使用常量名的变量化,只能使用函数来获取。

1.2.3 变量的创建与访问方式

  1. //创建变量
  2. $username = 'admin';
  3. //访问变量
  4. echo $username,'<hr>';

2. 变量过滤器的常用函数与用法(实际演示)

PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
外部数据有;

1.来自表单的输入数据
2.Cookies
3.Web services data
4.服务器变量
5.数据库查询结果

接下来写几个常用函数及其实际演示实例

2.1 filter_var()

filter_var() :通过一个指定的过滤器来过滤单一的变量
FILTER_VALIDATE_INT:判断值是否为整数
代码如下:

  1. //创建变量age,并赋值
  2. $age = 44;
  3. //创建变量options,做判断语句
  4. $options = ['min_range'=>18,'max_range'=>60];
  5. //过滤
  6. var_dump(filter_var($age,FILTER_VALIDATE_INT, $options));
  7. echo '<hr>';

2.2 验证输入

  1. $email = 'admin@qq.com';
  2. //当邮箱格式不正确时,报错
  3. // $email = 'admin@qq';
  4. var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
  5. //274也是邮箱验证的变量过滤器,可以查手册
  6. var_dump(filter_var($email,274));

2.3 filter_var_array()

filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量

  1. //创建变量a,b,并赋值
  2. $a = 10;
  3. $b = 90;
  4. //判断变量a,b
  5. var_dump(filter_var_array([$a,$b],FILTER_VALIDATE_INT));
  6. echo '<hr>';

2.3 验证外部变量

2.3.1 同时验证单个外部变量

  1. //外部变量,不在当前脚本创建的变量,例如,get,post
  2. //filter_input()
  3. // 以这个URL为例,https://192.168.64.3/dashboard/0815/demo15.php?id=30
  4. // ?id=30查询字符串,通过 "GET" 方法传送的输入变量id
  5. echo $_GET['id'];
  6. //filter_input(输入类型get/post,字符串表示的变量名,过滤器,选项参数)
  7. // 当网页网址为192.168.64.3/dashboard/0815/demo15.php?id=30时
  8. $options = ['min_range'=>1];
  9. var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT, $options));

2.3.2 同时验证多个外部变量

  1. $args = [
  2. 'username' => FILTER_SANITIZE_STRING,
  3. 'email' => FILTER_VALIDATE_EMAIL,
  4. 'age' => ['filter' => FILTER_VALIDATE_INT,'options' =>['min_range'=>18,'max_range'=>60]],
  5. 'blog' => FILTER_SANITIZE_URL,
  6. ];
  7. var_dump(filter_input_array(INPUT_GET,$args));

3. 实例演示函数的返回值方式

函数的返回值方式有单值返回和多值返回。
函数必有返回值,且只能有一个返回值,这叫单值返回。
可以通过以下几种方式实现多值返回(间接返回实现)。

3.1 通过字符串拼接返回多值

  1. //创建函数demo1,并设为字符串类型
  2. function demo1():string
  3. {
  4. //创建变量 status和message,并赋值
  5. $status = 1;
  6. $message = 'success';
  7. //返回
  8. return $status . ',<span style ="color :red;"></span>' . $message . '</span>';
  9. }
  10. //打印函数demo2
  11. echo demo1(),'<hr>';

3.2 通过数组返回多值

  1. //创建函数demo2,并设为字符串类型
  2. function demo2(): array
  3. {
  4. //创建变量 status和message,并赋值
  5. $status = 1;
  6. $message = 'success';
  7. //返回
  8. return ['status' => $status,'message' => $message];
  9. }
  10. //打印数组,是将数据拆分成两个字符串
  11. echo implode(', ', demo2()),'<hr>';
  12. //打印函数demo2
  13. echo print_r(demo2(),true),'<hr>';

3.3 通过json格式化字符串返回多值

  1. //创建函数demo3,并设为字符串类型
  2. function demo3(): string
  3. {
  4. //创建变量 status和message,并赋值
  5. $status = 1;
  6. $message = 'success';
  7. // 将数组进行json编码,返回json格式的字符串
  8. return json_encode(['status' => $status,'message' => $message]);
  9. }
  10. echo demo3(),'<hr>';

3.4 将返回值序列化成字符串返回多个值

序列化,是将变量的值转为字符串表示,可以很方便的存储或传输。

  1. function demo4(): string
  2. {
  3. $status = 1;
  4. $message = 'success';
  5. // 将数组进行json编码,返回json格式的字符串
  6. return serialize(['status' => $status,'message' => $message]);
  7. }
  8. $str = demo4();
  9. echo $str;
  10. $arr = unserialize($str);
  11. print_r($arr);

4. 实例演示函数的参数

4.1 值参数:值传递参数,这是默认的方式

  1. function demo1(float $arg) : float
  2. { //在函数中对参数的改变,不会映射到外部的参数
  3. return $arg *= 2;
  4. }
  5. $var = 100;
  6. //打印函数demo1内的返回值
  7. echo demo1($var),'<br>';
  8. //打印变量var,因为在函数中对参数的改变,不会映射到外部的参数,依旧打印出100
  9. echo $var,'<hr>';

4.2 引用参数

在参数前添加取地址符 & ,如下的&$arg就是引用参数。
引用参数的情况喜爱,在函数中对参数的改变,会映射到外部的参数

  1. function demo2(float &$arg) : float
  2. {
  3. //在函数中对参数的改变,会映射到外部的参数
  4. return $arg *= 2;
  5. }
  6. $var = 100;
  7. //打印demo2,为200
  8. echo demo2($var),'<br>';
  9. //打印var,为200
  10. echo $var,'<hr>';

4.3 默认参数

  1. //$opt = '+'。设置opt默认参数为 +
  2. function demo3(float $a,float $b,string $opt = '+'):string
  3. {
  4. switch($opt){
  5. case '+':
  6. return sprintf('%d + %d = %d',$a,$b,($a + $b));
  7. break;
  8. case '-':
  9. return sprintf('%d - %d = %d',$a,$b,($a - $b));
  10. break;
  11. case '*':
  12. return sprintf('%d * %d = %d',$a,$b,($a * $b));
  13. break;
  14. case '/':
  15. if($b !== 0)
  16. return sprintf('%d / %d = %f',$a,$b,($a / $b));
  17. else die('0 is bad');
  18. break;
  19. default:
  20. die('非法操作符');
  21. }
  22. }
  23. // 10 + 20 = 30
  24. echo demo3(10,20,'+'),'<br>';
  25. //opt默认参数为 + ,所以依旧 10 + 20 = 30
  26. echo demo3(10,20),'<br>';
  27. // @没有出现在判断语句中,而打印出非法操作符
  28. echo demo3(10,0,'@'),'<br>';
  29. // 10 - 20 = -10
  30. echo demo3(10,20,'-'),'<br>';

4.4 剩余参数

4.4.1 简单用法和复杂用法

在没有学习剩余参数的情况下
我们通常是这样实现数字相加的

  1. //简单用法
  2. //3个数的相加算法
  3. function demo4($a,$b,$c)
  4. {
  5. return $a + $b + $c;
  6. }
  7. echo demo4(39,22,30),'<br>';
  8. echo '<hr>';
  9. //复杂用法
  10. //多个数的相加算法
  11. function demo5()
  12. {
  13. // print_r(func_get_args());
  14. return array_sum(func_get_args());
  15. }
  16. echo demo5(12,31,4134,5325,132);

用复杂用法,来计算可以,但对后期维护不好,而且代码可读性也差

那就用…rest, …spread语法

4.4.2 …rest语法和…spread语法

…rest语法:在变量加上…就成了剩余参数
…spread:用在调用时的参数中,用在有具体值的参数列表,实参

  1. // ..rest用法
  2. //在变量$args加上...就成了剩余参数,...$args
  3. function demo6(...$args)
  4. {
  5. // print_r($args);
  6. return array_sum($args);
  7. }
  8. echo demo6(12,31,4134,5325,132);
  9. //可以进行多个数的运算。
  10. // ...rest ...spread混合一起用
  11. //变量$args为剩余参数
  12. function demo7(...$args)
  13. {
  14. //返回变量$args的相加值
  15. return array_sum($args);
  16. }
  17. //创建数组data,并赋值
  18. $data = [12,33,454,54,34,34];
  19. //...spread用在调用时的参数中,用在有具体值的参数列表,实参
  20. echo demo7(...$data);
  21. //也可以不创建数组,直接输入
  22. echo demo7(...[12,33,454,54,34,34]);

5. 实例演示函数的回调执行方式

直接调用函数(同步调用),有一个致命缺点,就是他是按照顺序调用的,也就是调用语句不执行完成,后面的语句就不会被执行。
如果出现要引用国外网站的数据,由于网络原因,导致读取数据过慢,或者引用很卡的服务器内的内容,那就卡住了。
为了防止这个情况的发生,我们就可以用回调的方式来请求函数了。

!!!!!回调函数是异步执行的重要工具!!!!!!

  1. function demo1($a,$b,$c)
  2. {
  3. return $a + $b + $c;
  4. }
  5. //直接调用
  6. echo demo1(1,2,3),'<br>';
  7. //以回调的方式来请求函数
  8. echo call_user_func('demo1',1,2,3);
  9. echo call_user_func_array('demo1',[1,2,3]);
  10. //创建变量data数组,并赋值
  11. $data =range(1,100);
  12. //创建变量arr,并通过判断语句,选出0到100之间的偶数。
  13. $arr = array_map(function($item){
  14. // % 取模/取余
  15. if($item % 2 === 0) return $item;
  16. },$data);
  17. //array_filter() 函数用回调函数过滤数组中的元素,
  18. $arr =array_filter($arr,function($item){return $item;});
  19. //简化
  20. $arr =array_filter($arr);
  21. print_r($arr);

6. 实例演示函数的全名空间

在php中不允许在同一个命名空间中声明同名函数的,js可以,

下列代码同一个命名空间中声明了相同函数demo1,
导致报错。

  1. function demo1()
  2. {
  3. return __FUNCTION__;
  4. }
  5. echo demo1();
  6. echo '<br>';
  7. function demo1()
  8. {
  9. return __FUNCTION__;
  10. }
  11. echo demo1();
  12. echo '<br>';

但可以在不同命空间中声明同名函数

  1. //ns1命名空间
  2. namespace ns1;
  3. function demo1()
  4. {
  5. return __FUNCTION__;
  6. }
  7. echo demo1();
  8. echo '<hr>';
  9. //ns2命名空间
  10. namespace ns2;
  11. function demo1()
  12. {
  13. return __FUNCTION__;
  14. }
  15. echo demo1();

打印ns1\demo1<hr>ns2\demo1成功

7. 实例演示字符串的四种创建方式与应用场景

字符串的四种创建方式分别是

7.1 单引号

  1. $str = 'string';
  2. //单引号的变量不能被解析出来
  3. echo 'This is a $str hello world';
  4. echo '<br>';
  5. echo '<hr>';
  6. //通过字符串与变量来拼接,后输出
  7. echo 'This is a '.$str.' hello world';
  8. // 单引号的特殊字符不能被解析,原样输出
  9. echo 'hello \n\r world .<br>';
  10. echo '<hr>';
  11. //单引号其实有两重意义:1.本义就是字符。2.字符串的定界符
  12. //单引号中又出现单引号,必须使用转义符:\
  13. echo 'this is a \'test\'.<br>';
  14. echo '<hr>';
  15. // 如果又出现转义符:\,应该连续写两个才可以正常输出,否则就是转义
  16. echo 'this is \'\\test\' world';
  17. echo '<hr>';

7.2 双引号

  1. // 双引号中的变量能被解析出来
  2. echo "This is a $str hello world";
  3. echo '<hr>';
  4. //为了更加清晰的表示出此为变量,用{$str}或 ${str}这样在变量后加其他东西也不会混淆
  5. echo "This is a {$str} hello world.<hr>";
  6. //${var}与es6中的模版字符串语法相同
  7. echo "This is a ${str} hello world.<hr>";
  8. // 双引号的特殊字符能被解析,多个空格,或回车在页面中视为一个
  9. echo "hello \n\r world.<hr>";
  10. echo "hello \n\n\n\r\r\r world.<hr>";
  11. echo "this is \"demo\" . <hr>";

7.3. heredoc,

可以当作双引号的plus+,可以解析变量,双引号不需要转义,非常适合php+html模版

  1. $hello = 'rinki.me';
  2. echo "<p>hello <span style=\"color:red\">$hello</span></p>";
  3. echo <<< HELLO
  4. <p>hello <span style="color:red">$hello</span></p>
  5. HELLO;
  1. // 也可以在heredoc的起始标示符添加双引号
  2. echo <<< "HELLO"
  3. ......
  4. HELLO;

7.4 nodoc

可以当作单引号的plus+,适合大段的纯文本,不适合内嵌变量,或者特殊字符的文本

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