Blogger Information
Blog 5
fans 0
comment 1
visits 4242
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php作用域的区别与作用
鸿运当头郭小胖
Original
1447 people have browsed it

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();
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:咱们课堂上介绍的常量,可能你与平常见过的不一样
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments