PHP 变量一.docx
- 文档编号:30417262
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:11
- 大小:20.63KB
PHP 变量一.docx
《PHP 变量一.docx》由会员分享,可在线阅读,更多相关《PHP 变量一.docx(11页珍藏版)》请在冰豆网上搜索。
PHP变量一
PHP变量一
1.基础
PHP中的变量用一个美元符号后面跟变量名来表示。
变量名是区分大小写的。
变量名与PHP中其它的标签一样遵循相同的规则。
一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。
按照正常的正则表达式,它将被表述为:
'[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*'。
Note:
在此所说的字母是a-z,A-Z,以及ASCII字符从127到255(0x7f-0xff)。
Note:
$this是一个特殊的变量,它不能被赋值。
Tip
请参见UserlandNamingGuide。
有关变量的函数信息见变量函数。
php
$var='Bob';
$Var='Joe';
echo"$var,$Var";//输出"Bob,Joe"
$4site='notyet';//非法变量名;以数字开头
$_4site='notyet';//合法变量名;以下划线开头
$i站点is='mansikka';//合法变量名;可以用中文
?
>
变量默认总是传值赋值。
那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。
这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
有关这种类型的赋值操作,请参阅表达式一章。
PHP也提供了另外一种方式给变量赋值:
引用赋值。
这意味着新的变量简单的引用(换言之,“成为其别名”或者“指向”)了原始变量。
改动新的变量将影响到原始变量,反之亦然。
使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。
例如,下列代码片断将输出“MynameisBob”两次:
php
$foo='Bob';//将'Bob'赋给$foo
$bar=&$foo;//通过$bar引用$foo
$bar="Mynameis$bar";//修改$bar变量
echo$bar;
echo$foo;//$foo的值也被修改
?
>
有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值。
php
$foo=25;
$bar=&$foo;//合法的赋值
$bar=&(24*7);//非法;引用没有名字的表达式
functiontest()
{
return25;
}
$bar=&test();//非法
?
>
虽然在PHP中并不需要初始化变量,但对变量进行初始化是个好习惯。
未初始化的变量具有其类型的默认值-布尔类型的变量默认值是FALSE,整形和浮点型变量默认值是零,字符串型变量默认值是空字符串或者数组变量的默认值是空数组。
Example#1未初始化变量的默认值
php
//UnsetANDunreferenced(nousecontext)variable;outputsNULL
var_dump($unset_var);
//Booleanusage;outputs'false'(Seeternaryoperatorsformoreonthissyntax)
echo($unset_bool?
"true":
"false");
//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(see
//Outputs:
object(stdClass)#1
(1){["foo"]=>string(3)"bar"}
$unset_obj->foo='bar';
var_dump($unset_obj);
?
>
依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中时碰上相同的变量名。
另外把register_globals打开是一个主要的安全隐患。
使用未初始化的变量会发出E_NOTICE错误,但是在向一个未初始化的数组附加单元时不会。
isset()语言结构可以用来检测一个变量是否已被初始化。
2.预定义变量
PHP提供了大量的预定义变量。
由于许多变量依赖于运行的服务器的版本和设置,及其它因素,所以并没有详细的说明文档。
一些预定义变量在PHP以命令行形式运行时并不生效。
有关这些变量的详细列表,请参阅预定义变量一章。
Warning
PHP4.2.0以及后续版本中,PHP指令register_globals的默认值为off。
这是PHP的一个主要变化。
让register_globals的值为off将影响到预定义变量集在全局范围内的有效性。
例如,为了得到DOCUMENT_ROOT的值,将必须使用$_SERVER['DOCUMENT_ROOT']代替$DOCUMENT_ROOT,又如,使用$_GET['id']来代替$id从URL中获取id值,亦或使用$_ENV['HOME']来代替$HOME获取环境变量HOME的值。
更多相关信息,请阅读register_globals的配置项条目,安全一章中的使用RegisterGlobals,以及PHP»4.1.0和»4.2.0的发布公告。
如果有可用的PHP预定义变量那最好用,如超全局数组。
从PHP4.1.0开始,PHP提供了一套附加的预定数组,这些数组变量包含了来自web服务器(如果可用),运行环境,和用户输入的数据。
这些数组非常特别,它们在全局范围内自动生效,例如,在任何范围内自动生效。
因此通常被称为自动全局变量(autoglobals)或者超全局变量(superglobals)。
(PHP中没有用户自定义超全局变量的机制。
)超全局变量罗列于下文中;但是为了得到它们的内容和关于PHP预定义变量的进一步的讨论以及它们的本质,请参阅预定义变量。
而且,你也将注意到旧的预定义数组($HTTP_*_VARS)仍旧存在。
自PHP5.0.0起,用register_long_arrays设置选项可禁用长类型的PHP预定义变量数组。
Note:
可变变量
超级全局变量不能被用作可变变量。
Note:
尽管超全局变量和HTTP_*_VARS同时存在。
但是他们并不是同一个变量,所以改变一个的值并不会对另一个产生影响。
如果某些variables_order中的变量没有设定,它们的对应的PHP预定义数组也是空的。
3.变量范围
变量的范围即它定义的上下文背景(也就是它的生效范围)。
大部分的PHP变量只有一个单独的范围。
这个单独的范围跨度同样包含了include和require引入的文件。
例如:
php
$a=1;
include'b.inc';
?
>
这里变量$a将会在包含文件b.inc中生效。
但是,在用户自定义函数中,一个局部函数范围将被引入。
任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
例如:
php
$a=1;/*globalscope*/
functionTest()
{
echo$a;/*referencetolocalscopevariable*/
}
Test();
?
>
这个脚本不会有任何输出,因为echo语句引用了一个局部版本的变量$a,而且在这个范围内,它并没有被赋值。
你可能注意到PHP的全局变量和C语言有一点点不同,在C语言中,全局变量在函数中自动生效,除非被局部变量覆盖。
这可能引起一些问题,有些人可能不小心就改变了一个全局变量。
PHP中全局变量在函数中使用时必须申明为global。
global关键字
首先,一个使用global的例子:
Example#1使用global
php
$a=1;
$b=2;
functionSum()
{
global$a,$b;
$b=$a+$b;
}
Sum();
echo$b;
?
>
以上脚本的输出将是“3”。
在函数中申明了全局变量$a和$b,任何变量的所有引用变量都会指向到全局变量。
对于一个函数能够申明的全局变量的最大个数,PHP没有限制。
在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组。
前面的例子可以写成:
Example#2使用$GLOBALS替代global
php
$a=1;
$b=2;
functionSum()
{
$GLOBALS['b']=$GLOBALS['a']+$GLOBALS['b'];
}
Sum();
echo$b;
?
>
$GLOBALS是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。
$GLOBALS之所以在全局范围内存在,是因为$GLOBALS是一个超全局变量。
以下范例显示了超全局变量的用处:
Example#3演示超全局变量和作用域的例子
php
functiontest_global()
{
//大多数的预定义变量并不"super",它们需要用'global'关键字来使它们在函数的本地区域中有效。
global$HTTP_POST_VARS;
echo$HTTP_POST_VARS['name'];
//Superglobals在任何范围内都有效,它们并不需要'global'声明。
Superglobals是在PHP4.1.0引入的。
echo$_POST['name'];
}
?
>
使用静态变量
变量范围的另一个重要特性是静态变量(staticvariable)。
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
看看下面的例子:
Example#4演示需要静态变量的例子
php
functionTest()
{
$a=0;
echo$a;
$a++;
}
?
>
本函数没什么用处,因为每次调用时都会将$a的值设为0并输出"0"。
将变量加一的$a++没有作用,因为一旦退出本函数则变量$a就不存在了。
要写一个不会丢失本次计数值的计数函数,要将变量$a定义为静态的:
Example#5使用静态变量的例子
php
functiontest()
{
static$a=0;
echo$a;
$a++;
}
?
>
现在,变量$a在第一调用test()时被初始化,每次调用test()函数都会输出$a的值并加一。
静态变量也提供了一种处理递归函数的方法。
递归函数是一种调用自己的函数。
写递归函数时要小心,因为可能会无穷递归下去。
必须确保有充分的方法来中止递归。
一下这个简单的函数递归计数到10,使用静态变量$count来判断何时停止:
Example#6静态变量与递归函数
php
functiontest()
{
static$count=0;
$count++;
echo$count;
if($count<10){
test();
}
$count--;
}
?
>
Note:
静态变量可以按照上面的例子声明。
如果在声明中用表达式的结果对其赋值会导致解析错误。
Example#7声明静态变量
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语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。
这有可能导致预料之外的行为,如以下例子所演示的:
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){
}
类似的行为也适用于static语句。
引用并不是静态地存储的:
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"";
$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()函数时其值并没有被记住。
4.可变变量
有时候使用可变变量名是很方便的。
就是说,一个变量的变量名可以动态的设置和使用。
一个普通的变量通过声明来设置,例如:
php
$a='hello';
?
>
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
在上面的例子中hello使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。
例如:
php
$$a='world';
?
>
这时,两个变量都被定义了:
$a的内容是“hello”并且$hello的内容是“world”。
因此,可以表述为:
php
echo"$a${$a}";
?
>
以下写法更准确并且会输出同样的结果:
php
echo"$a$hello";
?
>
它们都会输出:
helloworld。
要将可变变量用于数组,必须解决一个模棱两可的问题。
这就是当写下$$a[1]时,解析器需要知道是想要$a[1]作为一个变量呢,还是想要$$a作为一个变量并取出该变量中索引为[1]的值。
解决此问题的语法是,对第一种情况用${$a[1]},对第二种情况用${$a}[1]。
Warning
注意,在PHP的函数和类的方法中,超全局变量不能用作可变变量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 变量一 变量