深入讲解php变量.docx
- 文档编号:14213437
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:21
- 大小:25.98KB
深入讲解php变量.docx
《深入讲解php变量.docx》由会员分享,可在线阅读,更多相关《深入讲解php变量.docx(21页珍藏版)》请在冰点文库上搜索。
深入讲解php变量
快速掌握PHP变量的使用
一、命名规则
1、PHP的变量名是区分大小写的。
2、变量名必须以$开头。
3、变量名开头可以是下划线。
4、变量名不能以数字字符开头。
5、$this是一个特殊的变量,它不能被赋值。
php
$var='Bob';
$Var='Joe';
echo"$var,$Var";//输出"Bob,Joe"
$_4site='notyet';//合法变量名;以下划线开头
$i站点is='mansikka';//合法变量名;可以用中文
$long='123';
$$long="PHP";//合法变量;用存放在变量$long里的字符串作为新变量
//的变量名,等同于$big_long_variable_name="PHP";
vars='no';//xxx非法变量名;没以$开头
$4site='notyet';//xxx非法变量名;以数字开头
?
>
二、php变量的赋值
php
$shit='123';//一般“=”来赋值
$$shit=="456";
$shit2=&$shit;//引用赋值
echo$shit2;//123
$shit='fuck';//值被修改
echo$shit;//fuck
?
>
#只有有名字的变量才可以引用赋值
php
$foo=25;
$bar=&$foo;//合法的赋值
echo$bar;//输出"25"
$bar=&(24*7);//非法;引用没有名字的表达式
functiontest()
{
return25;
}
$bar=&test();//非法
?
>
三、变量默认值
1、虽然在PHP中并不需要初始化变量,但对变量进行初始化是个好习惯。
2、未初始化的变量具有其类型的默认值:
--布尔类型的变量默认值是FALSE;
--整形和浮点型变量默认值是零;
--字符串型变量默认值是空字符串null;
--数组变量的默认值是空数组;
3、依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中
时碰上相同的变量名。
4、另外把php.inregister_globals打开是一个主要的安全隐患。
5、使用未初始化的变量会发出E_NOTICE错误,但是在向一个未初始化的数组附加单元时不
会。
6、isset()语言结构可以用来检测一个变量是否已被初始化。
php
//UnsetANDunreferenced(nousecontext)variable;outputsNULL
var_dump($unset_var);
//isset()语言结构可以用来检测一个变量是否已被初始化
echo(isset($unset_var)?
"true\n":
"false\n");
//Booleanusage;outputs'false'
//(Seeternaryoperatorsformoreonthissyntax)
echo($unset_bool?
"true\n":
"false\n");
//Stringusage;outputs'string(3)"abc"'
$unset_str.='abc';
var_dump($unset_str);
//Integerusage;outputs'int(25)'
$unset_int+=25;//0+25=>25
var_dump($unset_int);
//Float/doubleusage;outputs'float(1.25)'
$unset_float+=1.25;
var_dump($unset_float);
//Arrayusage;outputsarray
(1){[3]=>string(3)"def"}
$unset_arr[3]="def";
//array()+array(3=>"def")=>array(3=>"def")
var_dump($unset_arr);
//Objectusage;createsnewstdClassobject
//Outputs:
object(stdClass)#1
(1){["foo"]=>string(3)"bar"}
$unset_obj->foo='bar';
$unset_obj->shit='234';
var_dump($unset_obj);
var_export($unset_obj);
?
>
四、预定义变量
1、PHP4.2.0以及后续版本中,PHP指令register_globals的默认值为off。
这是PHP的
一个主要变化。
让register_globals的值为off将影响到预定义变量集在全局范围内
的有效性。
例如为了得到DOCUMENT_ROOT的值将必须使用$_SERVER['DOCUMENT_ROOT']
代替$DOCUMENT_ROOT,又如,使用$_GET['id']来代替$id从URL
$HOME获取环境变量HOME的值。
更多相关信息:
请阅读register_globals的配置项条
目,安全一章中的使用RegisterGlobals,以及PHP»4.1.0和»4.2.0的发布公告。
2、如果有可用的PHP预定义变量那最好用,如超全局数组。
从PHP4.1.0开始,PHP提
供了一套附加的预定数组,这些数组变量包含了来自web服务器、运行环境和用户输入
的数据。
这些数组非常特别,它们在全局范围内内自动生效。
因此通常被称为自动全局
变量(autoglobals)或者超全局变量(superglobals)。
(注意:
PHP中没有用户自定义超全局变量的机制)
3、参阅预定义变量你将注意到旧的预定义数组($HTTP_*_VARS)仍旧存在,自PHP5.0.0
起,用register_long_arrays设置选项可禁用长类型的PHP预定义变量数组。
(注意:
超级全局变量不能被用作可变变量)
4、尽管超全局变量和HTTP_*_VARS同时存在。
但是他们并不是同一个变量,所以改变一个
的值并不会对另一个产生影响。
如果某些variables_order中的变量没有设定,它们的
对应的PHP预定义数组也是空的。
5、对于全部脚本而言,PHP提供了大量的预定义变量。
这些变量将所有的外部变量表示成
内建环境变量,并且将错误信息表示成返回头。
TableofContents
Ø超全局变量—超全局变量是在全部作用域中始终可用的内置变量
Ø$GLOBALS—引用全局作用域中可用的全部变量
Ø$_SERVER—服务器和执行环境信息
Ø$_GET—HTTPGET变量
Ø$_POST—HTTPPOST变量
Ø$_FILES—HTTP文件上传变量
Ø$_REQUEST—HTTPRequest变量
Ø$_SESSION—Session变量
Ø$_ENV—环境变量
Ø$_COOKIE—HTTPCookies
Ø$php_errormsg—前一个错误信息
Ø$HTTP_RAW_POST_DATA—原生POST数据
Ø$http_response_header—HTTP响应头
Ø$argc—传递给脚本的参数数目
Ø$argv—传递给脚本的参数数组
五、可变变量
1、有时候使用可变变量名是很方便的,就是说一个变量的变量名可以动态的设置和使用。
php
$$a="456";
echo"{$$a}@$a@${$a}";//456@@456
?
>
2、要将可变变量用于数组,必须解决一个模棱两可的问题。
这就是当写下$$a[1]时,解
析器需要知道是想要$a[1]作为一个变量呢,还是想要$$a作为一个变量并取出该变
量中索引为[1]的值。
解决此问题的语法是,对第一种情况用${$a[1]},对第二种情
况用${$a}[1]。
3、变量函数(Variablehandling函数array_key_exists)
TableofContents
Øisset—检测变量是否设置
Øunset—释放给定的变量
Øempty—检查一个变量是否为空
Øvar_dump—打印变量的相关信息
Øvar_export—输出或返回一个变量的字符串表示
Øprint_r—打印关于变量的易于理解的信息。
Øserialize—产生一个可存储的值的表示
Øsettype—设置变量的类型
Østrval—获取变量的字符串值
Øunserialize—从已存储的表示中创建PHP的值
Øis_null—检测变量是否为NULL
Øis_array—检测变量是否是数组
Øis_bool—检测变量是否是布尔型
Øis_callable—检测参数是否为合法的可调用结构
Øis_double—is_float的别名
Øis_float—检测变量是否是浮点型
Øis_int—检测变量是否是整数
Øis_integer—is_int的别名
Øis_long—is_int的别名
Øis_numeric—检测变量是否为数字或数字字符串
Øis_object—检测变量是否是一个对象
Øis_real—is_float的别名
Øis_resource—检测变量是否为资源类型
Øis_scalar—检测变量是否是一个标量
Øis_string—检测变量是否是字符串
Øarray_key_exists(mixedkey,arraysearch)—检查给定的键名或索引是否存在于数组中
Ødebug_zval_dump—Dumpsastringrepresentationofaninternalzendvaluetooutput
Ødoubleval—floatval的别名
Øfloatval—获取变量的浮点值
Øget_defined_vars—返回由所有已定义变量所组成的数组
Øget_resource_type—返回资源(resource)类型
Øgettype—获取变量的类型
Øimport_request_variables—将GET/POST/Cookie变量导入到全局作用域中
Øintval—获取变量的整数值
4、各种数据类型函数输出比较
表P.1.用PHP函数对$x的比较
表达式gettype()empty()is_null()isset()if($x)
$x="";stringTRUEFALSETRUEFALSE
$x=NULLNULLTRUETRUEFALSEFALSE
var$x;NULLTRUETRUEFALSEFALSE
$x尚未定义NULLTRUETRUEFALSEFALSE
$x=array();arrayTRUEFALSETRUEFALSE
$x=false;booleanTRUEFALSETRUEFALSE
$x=true;booleanFALSEFALSETRUETRUE
$x=1;integerFALSEFALSETRUETRUE
$x=42;integerFALSEFALSETRUETRUE
$x=0;integerTRUEFALSETRUEFALSE
$x=-1;integerFALSEFALSETRUETRUE
$x="1";stringFALSEFALSETRUETRUE
$x="0";stringTRUEFALSETRUEFALSE
$x="-1";stringFALSEFALSETRUETRUE
$x="php";stringFALSEFALSETRUETRUE
$x="true";stringFALSEFALSETRUETRUE
$x="false";stringFALSEFALSETRUETRUE
六、变量范围
Example#1演示变量范围的例子
变量的范围即它定义的上下文背景(也就是它的生效范围),大部分的PHP变量只有一个单独的范围,这个单独的范围跨度同样包含了include和require引入的文件。
例如:
php
$a=1;
include'b.inc';
?
>
这里变量$a将会在包含文件b.inc中生效:
php
$a=1;/*globalscope*/
functionTest()
{
echo$a;/*referencetolocalscopevariable*/
}
Test();
?
>
这个脚本不会有任何输出,因为echo语句引用了一个局部版本的变量$a,而且在这个范围内,它并没有被赋值。
Example#2演示全局变量的例子
PHP中全局变量在函数中使用时必须申明为global。
php
$a=1;
$b=2;
functionSum()
{
global$a,$b;
$b=$a+$b;
}
Sum();
echo$b;
?
>
以上脚本的输出将是“3”。
在函数中申明了全局变量$a和$b,任何变量的所有引用变量都会指向到全局变量。
Example#3演示全局变量的例子
在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组。
前面的例子可以写成:
php
$a=1;
$b=2;
functionSum()
{
$GLOBALS['b']=$GLOBALS['a']+$GLOBALS['b'];
}
Sum();
echo$b;
?
>
$GLOBALS是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。
$GLOBALS之所以在全局范围内存在,是因为$GLOBALS是一个超全局变量。
Example#4演示超全局变量和作用域的例子
php
functiontest_global()
{
//大多数的预定义变量并不"super",它们需要用'global'关键字来使它们在函数的本地区域中有效。
global$HTTP_POST_VARS;
echo$HTTP_POST_VARS['name'];
//Superglobals在任何范围内都有效,它们并不需要'global'声明。
Superglobals是在PHP4.1.0引入的。
echo$_POST['name'];
}
?
>
Example#5演示需要静态变量的例子
使用静态变量staticvariable仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
php
functionTest()
{
$a=0;
echo$a;
$a++;
//++$a;
}
test();
?
>
$a的值设为0并输出"0"。
将变量加一的$a++没有作用,因为一旦退出本函数则变量$a就不存在了。
要写一个不会丢失本次计数值的计数函数,要将变量$a定义为静态的:
Example#6使用静态变量的例子
php
functiontest()
{
static$a=0;
echo$a;
$a++;
echo$a;
}
test();
?
>
现在变量$a在第一调用test()时被初始化,每次调用test()函数都会输出$a的值并加1。
静态变量也提供了一种处理递归函数的方法。
递归函数是一种调用自己的函数。
写递归函数时要小心,因为可能会无穷递归下去。
必须确保有充分的方法来中止递归。
一下这个简单的函数递归计数到10,使用静态变量$count来判断何时停止:
Example#7静态变量与递归函数的例子
php
functiontest()
{
static$count=0;
$count++;
echo$count;
if($count<10){
test();
}
$count--;
}
?
>
Example#8声明静态变量的例子
静态变量可以按照上面的例子声明。
如果在声明中用表达式的结果对其赋值会导致解析错误。
php
functionfoo(){
static$int=0;//correct
static$int=1+2;//wrong(asitisanexpression)
static$int=sqrt(121);//wrong(asitisanexpressiontoo)
$int++;
echo$int;
}
?
>
在Zend引擎1代,它驱动了PHP4,对于变量的static和global定义是以references的方式实现的。
例如,在一个函数域内部用global语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用,这有可能导致预料之外的行为。
Example#9全局和静态变量引用的例子
php
functiontest_global_ref(){
global$obj;
$obj=&newstdclass;
}
functiontest_global_noref(){
global$obj;
$obj=newstdclass;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?
>
执行以上例子会导致如下输出:
NULL
object(stdClass)(0){
}
Example#10全局和静态变量引用的例子
php
function&get_instance_ref(){
static$obj;
echo'Staticobject:
';
var_dump($obj);
if(!
isset($obj)){
$obj=&newstdclass;//将一个引用赋值给静态变量
}
$obj->property++;
return$obj;
}
function&get_instance_noref(){
static$obj;
echo'Staticobject:
';
var_dump($obj);
if(!
isset($obj)){
$obj=newstdclass;//将一个对象赋值给静态变量
}
$obj->property++;
return$obj;
}
$obj1=get_instance_ref();
$still_obj1=get_instance_ref();
echo"\n";
$obj2=get_instance_noref();
$still_obj2=get_instance_noref();
?
>
执行以上例子会导致如下输出:
Staticobject:
NULL
Staticobject:
NULL
Staticobject:
NULL
Staticobject:
object(stdClass)
(1){
["property"]=>
int
(1)
}
上例演示了当把一个引用赋值给一个静态变量时,第二次调用&get_instance_ref()函数时其值并没有被记住。
七、扩展:
[部分摘自网络]
1、定义(c描述):
//-----------------------------------------------
typedefstruct_zval_structzval;
typedefunion_zvalue_value{
longlval;
doubledval;
struct{
char*val;
intlen;
}str;
HashTable*ht;
zend_object_valueobj;
}zvalue_value;
struct_zval_struct{
zvalue_valuevalue;//php变量值,联合类型。
可接受各种数据类型的值。
zend_uchartype;//php变量类型
zend_ucharis_ref;//是否为引用
zend_uintrefcount;//引用个数
};
//-----------------------------------------------(zend.h)
结构体zval即为所描述的php变量。
定义一个变量并赋值。
如$a=1;内部所执行的操作大概为:
①定义一个zval变量a;
②为变量a分配内存,并初始化;
③为变量a赋值;
④将变量a添加到符号表中;
//----------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 讲解 php 变量