php作用域的区别与作用
php作用域的种类
php的作用域共分为两种,分别为函数作用域和全局作用域。
1、函数作用域,以function进行声明。在函数作用域中,定义的函数为私有变量。在函数中无法访问全局作用域中的变量。
如需访问全局作用域中的函数,需使用外部变量进行引用。
通用方法:
1、 使用global进行引用
2、使用超全局变量
// 全局作用域 函数变量
$sitename = ‘php中文网’;
//声明函数:同时创建一个函数作用域
//声明函数作用域,为字符串
function getInfo()
{
//这部分的函数为“私有变量”
$prinvate = $sitename;
return $prinvate;
}
echo getInfo();
/上面的代码中$prinvate 是无法获取全局变量sitename中的值的。如果想要在函数作用域中获得全局作用域的变量值,需要介质进行传递。方法一,使用global。/
$sitename = ‘php中文网’;
//声明函数:同时创建一个函数作用域
function getInfo()
{
global $sitename;
//这部分的函数为“私有变量”
$prinvate = $sitename;
return $prinvate;
}
echo getInfo();
//使用超全局作用域,全局变量会自动生成为超全局变量数组$GLOBALS的一个值。
//e.g.
<? php
$sitename = 'php中文网';
print_r($GLOBALS};
//此时页面的返回值将是
Array ( [_GET] => Array ( ) [_POST] => Array ( ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [GLOBALS] => Array *RECURSION* [sitename] => php中文网 )
//而当我们只需要具体超全局变量函数中的值时,可以这样写
<?php
$sitename = 'php中文网';
print_r($GLOBALS['sitename']);
//最后返回的信息将是sitename中的值。这是我们运行函数作用域
<?php
$sitename = 'php中文网';
function getInfo(): string
{
$prinvate = $GLOBALS['sitename'];
return $prinvate;
}
echo getInfo();
//这时我们就可以获得值了
静态变量
由于在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>‘;
}
echo '<hr>';
namespace ns2;
//foreach()是用来遍历数据
//filter_list 返回当前代码中所有的过滤器
foreach(filter_list() as $filter)
{
//显示代码中的过滤器
//filter_id可获取过滤器编号
//filter_id()需要一个参数,不填写将会报错
echo $filter .'===>'. filter_id($filter) .'<br>';
}
echo '<hr>';
//过滤单个变量需要使用filter_var()
namespace ns3;
$age = '20';
filter_var($age,FILTER_VALIDATE_INT);
var_dump(filter_var($age,FILTER_VALIDATE_INT,['options'=>['min_range'=>30,'max_range'=>60]]));
echo '<hr>';
$email = 'gygzs@qq.com';
$email = 'gygzs@';
//检测email使用FILTER_VALIDATE_EMAIL
var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
//过滤多个变量时需要使用filter_var_array()
echo '<hr>';
var_dump(filter_var_array([100,'php'],FILTER_VALIDATE_INT));
//验证单个外部变量
//检测是否存在制定的外部变量,用filter_has_var进行检测
//对于URL中的查询字符串:在URL地址?后面的键值对
//e.g. php.cn/index.php?id= 10&name=admin
//id=10
//name=admin
//INPUT_GET:表示要检测的是$GET,就是get参数,其实就是get请求
//INPUT_GET,INPUT_POST,INPUT_SERVER,INPUT_ENV环境变量。均可进行检测
echo '<hr>';
//检测页面中外部变量p的值
echo $_GET['p'];
//检测页面中是否有page的外部变量
var_dump(filter_has_var(INPUT_GET,'page'));
echo '<hr>';
//该方式存在安全隐患,会遭到跨站攻击的风险
echo 'get变量p =', $_GET['p'];
echo '<hr>';
//访问外部变量的过滤器,filter_input(),但下面代码无意义。所以我们要进行数据验证及限制。
var_dump(filter_input(INPUT_GET,'p'));
echo '<hr>';
//['options'=>['min_range'=>1]]前需添加限制代码,而这个限制代码是对‘p’的类型进行限制。如不填限制代码将报错
var_dump(filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]]));
echo filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]]) ? '页码正确': '页码非法';
//同时验证多个外部变量filter_input_array()
echo '<hr>';
$student = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT,'flages' =>FILTER_REQUIRE_SCALAR,'options' =>['min_range' => 18,'max_range'=>60]],
'blog' => FILTER_VALIDATE_URL,
];
//FILTER_REQUIRE_SCALAR 标量:单值变量,字符串,布尔值,数值
//复合:对象,数组
//filter_var_array(数据来源方式,数组,)
var_dump(filter_input_array(INPUT_GET,$student,));
//以上代码返回值:array(4) { ["username"]=> NULL ["email"]=> NULL ["age"]=> NULL ["blog"]=> NULL }
echo '<hr>';
echo '开始进行赋值';
echo '<hr>';
//使用正确的http://localhost/index.php?username=admin&email=php@php.cn&age=55&blog=http://www.php.cn
//返回值array(4) { ["username"]=> string(5) "admin" ["email"]=> string(10) "php@php.cn" ["age"]=> int(55) ["blog"]=> string(17) "http://www.php.cn" }
////使用错误的http://localhost/index.php?username=<a>admin</a>&email=php&age=5005&blog=ww.php.cn
//返回值array(4) { ["username"]=> string(5) "admin" ["email"]=> bool(false) ["age"]=> bool(false) ["blog"]=> bool(false) }
//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’]);
定义常量
<?php
// define()函数进行定义
define('lecture','朱老师');
//const 关键字进行定义
const COURSE = 'php';
//常量不受作用域限制
function test1()
{
echo lecture . '教' . COURSE . '<br>';
//define可以使用在函数中
define('SEX', '男');
echo SEX , '<br>';
//const无法在函数中进行使用会报错!
}
test1();