博客列表 >php作用域的区别与作用

php作用域的区别与作用

鸿运当头郭小胖
鸿运当头郭小胖原创
2020年04月19日 20:28:551446浏览

php作用域的区别与作用

php作用域的种类

php的作用域共分为两种,分别为函数作用域和全局作用域。
1、函数作用域,以function进行声明。在函数作用域中,定义的函数为私有变量。在函数中无法访问全局作用域中的变量。
如需访问全局作用域中的函数,需使用外部变量进行引用。
通用方法:
1、 使用global进行引用
2、使用超全局变量
// 全局作用域 函数变量
$sitename = ‘php中文网’;
//声明函数:同时创建一个函数作用域
//声明函数作用域,为字符串
function getInfo()
{
//这部分的函数为“私有变量”
$prinvate = $sitename;
return $prinvate;
}
echo getInfo();
/上面的代码中$prinvate 是无法获取全局变量sitename中的值的。如果想要在函数作用域中获得全局作用域的变量值,需要介质进行传递。方法一,使用global。/
$sitename = ‘php中文网’;
//声明函数:同时创建一个函数作用域

  1. function getInfo()
  2. {
  3. global $sitename;
  4. //这部分的函数为“私有变量”
  5. $prinvate = $sitename;
  6. return $prinvate;
  7. }
  8. echo getInfo();
  9. //使用超全局作用域,全局变量会自动生成为超全局变量数组$GLOBALS的一个值。
  10. //e.g.
  11. <? php
  12. $sitename = 'php中文网';
  13. print_r($GLOBALS};
  14. //此时页面的返回值将是
  15. Array ( [_GET] => Array ( ) [_POST] => Array ( ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [GLOBALS] => Array *RECURSION* [sitename] => php中文网 )
  16. //而当我们只需要具体超全局变量函数中的值时,可以这样写
  17. <?php
  18. $sitename = 'php中文网';
  19. print_r($GLOBALS['sitename']);
  20. //最后返回的信息将是sitename中的值。这是我们运行函数作用域
  21. <?php
  22. $sitename = 'php中文网';
  23. function getInfo(): string
  24. {
  25. $prinvate = $GLOBALS['sitename'];
  26. return $prinvate;
  27. }
  28. echo getInfo();
  29. //这时我们就可以获得值了

静态变量

由于在function中函数变量为私有变量。那么函数如何实现类全局变量的方法呢?
<?php
//首先,创建一个函数作用域,test1
function test1():float
{
//对sum进行赋值为0
$sum = 0;
//sum进行运算。进行加1处理
$sum ++;
//将sum值进行返回
return $sum;
}
//打印test1作用域中的返回值
echo test1() ,’<br>‘;
echo test1() ,’<br>‘;
echo test1() ,’<br>‘;
/ 这时我们可以看到返回值均为1,而没有出现我们所期望的123.这是为什么呢?
因为私有函数如此定义,将会出现每次运算时进行重新赋值。每次都将是0,所以每次运算都是0+1
/

那如何才能形成我们所期望的运算加减呢?
我们可以将sum函数定义为全局函数,在函数作用域中进行引用。根据引用对我们的数值进行仅一次初始化。
<?php
//定义并赋值全局化变量sum
$sum = 0;
function test1():float
{
//引用全局变量sum
global $sum;
$sum ++;
return $sum;
}
//运算时,是引入sum =0 ,同时进行0+1运算
echo test1() ,’<br>‘;
//运算时,因为上次运算得出的sum值是1,那么这次将进行,1+1运算
echo test1() ,’<br>‘;
//运算时,进行2+1运算
echo test1() ,’<br>‘;
//如此运算将会得出我们期望的运算方式
这种方式虽然可以达到我们所期望的运算,但是,全局变量较为稀缺。如引入第三方功能。可能会造成变量冲突,因此该做法不提倡也不建议使用。
那么这时,我们本小节的主角登场了!静态变量。代码如下:
<?php
//声明一个函数作用域test1,并声明为整数
function test1():int
{
//局部静态变量,只在变量第一次调用时被初始化,有不会再进行更新
//静态变量,可以理解为在函数中的“伪(类)全局变量”
//实现函数在多次调用的过程装共享数据
static $sum = 8;
$sum ++;
return $sum;
}
echo test1() ,’<br>‘;
echo test1() ,’<br>‘;
echo test1() ,’<br>‘;
//所输出的结果为9,10,11

变量过滤器

变量过滤器就是对变量进行验证。
<?php
namespace ns1;
//foreach()是用来遍历数据
//filter_list 返回当前代码中所有的过滤器
foreach(filter_list() as $filter)
{
//显示代码中的过滤器
echo $filter . ‘<br>‘;
}

  1. echo '<hr>';
  2. namespace ns2;
  3. //foreach()是用来遍历数据
  4. //filter_list 返回当前代码中所有的过滤器
  5. foreach(filter_list() as $filter)
  6. {
  7. //显示代码中的过滤器
  8. //filter_id可获取过滤器编号
  9. //filter_id()需要一个参数,不填写将会报错
  10. echo $filter .'===>'. filter_id($filter) .'<br>';
  11. }
  12. echo '<hr>';
  13. //过滤单个变量需要使用filter_var()
  14. namespace ns3;
  15. $age = '20';
  16. filter_var($age,FILTER_VALIDATE_INT);
  17. var_dump(filter_var($age,FILTER_VALIDATE_INT,['options'=>['min_range'=>30,'max_range'=>60]]));
  18. echo '<hr>';
  19. $email = 'gygzs@qq.com';
  20. $email = 'gygzs@';
  21. //检测email使用FILTER_VALIDATE_EMAIL
  22. var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
  23. //过滤多个变量时需要使用filter_var_array()
  24. echo '<hr>';
  25. var_dump(filter_var_array([100,'php'],FILTER_VALIDATE_INT));
  26. //验证单个外部变量
  27. //检测是否存在制定的外部变量,用filter_has_var进行检测
  28. //对于URL中的查询字符串:在URL地址?后面的键值对
  29. //e.g. php.cn/index.php?id= 10&name=admin
  30. //id=10
  31. //name=admin
  32. //INPUT_GET:表示要检测的是$GET,就是get参数,其实就是get请求
  33. //INPUT_GET,INPUT_POST,INPUT_SERVER,INPUT_ENV环境变量。均可进行检测
  34. echo '<hr>';
  35. //检测页面中外部变量p的值
  36. echo $_GET['p'];
  37. //检测页面中是否有page的外部变量
  38. var_dump(filter_has_var(INPUT_GET,'page'));
  39. echo '<hr>';
  40. //该方式存在安全隐患,会遭到跨站攻击的风险
  41. echo 'get变量p =', $_GET['p'];
  42. echo '<hr>';
  43. //访问外部变量的过滤器,filter_input(),但下面代码无意义。所以我们要进行数据验证及限制。
  44. var_dump(filter_input(INPUT_GET,'p'));
  45. echo '<hr>';
  46. //['options'=>['min_range'=>1]]前需添加限制代码,而这个限制代码是对‘p’的类型进行限制。如不填限制代码将报错
  47. var_dump(filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]]));
  48. echo filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]]) ? '页码正确': '页码非法';
  49. //同时验证多个外部变量filter_input_array()
  50. echo '<hr>';
  51. $student = [
  52. 'username' => FILTER_SANITIZE_STRING,
  53. 'email' => FILTER_VALIDATE_EMAIL,
  54. 'age' => ['filter' => FILTER_VALIDATE_INT,'flages' =>FILTER_REQUIRE_SCALAR,'options' =>['min_range' => 18,'max_range'=>60]],
  55. 'blog' => FILTER_VALIDATE_URL,
  56. ];
  57. //FILTER_REQUIRE_SCALAR 标量:单值变量,字符串,布尔值,数值
  58. //复合:对象,数组
  59. //filter_var_array(数据来源方式,数组,)
  60. var_dump(filter_input_array(INPUT_GET,$student,));
  61. //以上代码返回值:array(4) { ["username"]=> NULL ["email"]=> NULL ["age"]=> NULL ["blog"]=> NULL }
  62. echo '<hr>';
  63. echo '开始进行赋值';
  64. echo '<hr>';
  65. //使用正确的http://localhost/index.php?username=admin&email=php@php.cn&age=55&blog=http://www.php.cn
  66. //返回值array(4) { ["username"]=> string(5) "admin" ["email"]=> string(10) "php@php.cn" ["age"]=> int(55) ["blog"]=> string(17) "http://www.php.cn" }
  67. ////使用错误的http://localhost/index.php?username=<a>admin</a>&email=php&age=5005&blog=ww.php.cn
  68. //返回值array(4) { ["username"]=> string(5) "admin" ["email"]=> bool(false) ["age"]=> bool(false) ["blog"]=> bool(false) }
  69. //html标签自动删除,其他判断皆为错误。

常量

PHP常量是一个简单值的标识符。该值在脚本中不能改变。一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。常量创建时必须初始化,并且不可以更新和删除。常量不受作用域限制。

注意: 常量在整个脚本中都可以使用。
<?php
//使用getdefinedconstants()来调取系统中存在的常量,加入true可以分组查看print_r(get_defined_constants(true));
print_r(get_defined_constants());
//使用define进行穿件自定义常量
// define(‘APP_PATH’, __DIR
.’/app/admin’);
//使用echo可以打印常量值
echo APP_PATH;
//如想调取系统中存在的自定义常量,则可以添加变量值来进行查找
print_r(get_defined_constants(true)[‘user’]);

定义常量

  1. <?php
  2. // define()函数进行定义
  3. define('lecture','朱老师');
  4. //const 关键字进行定义
  5. const COURSE = 'php';
  6. //常量不受作用域限制
  7. function test1()
  8. {
  9. echo lecture . '教' . COURSE . '<br>';
  10. //define可以使用在函数中
  11. define('SEX', '男');
  12. echo SEX , '<br>';
  13. //const无法在函数中进行使用会报错!
  14. }
  15. test1();
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议