php变量

简介:

      PHP中变量用一个美元符号后面跟变量名来表示,变量名区分大小写的

      变量名与 PHP中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字或者下划线。按照正常的正则表达式,他将被表述为:'[a-zA-A_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。在此所说的字母是a-z,A-Z,及ASCII字符从127到255(0x7f-0xff)。

警告:$this是一个特殊的变量,他不能被赋值。

      对变量进行初始是个好习惯。未初始化的变量具有其类型的默认值-布尔类型的变量默认值为FALSE,整型和浮点型变量默认值都是零,字符串型变量默认值是空字符串或者数组变量的默认是空数组。依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个文件之中时碰到相同的变量名。另外把register_globals打开是一个主要的安全隐患。使用未初始化的变量会发出E_NOTICE错误,但是在向一个未初始化的数组附加单元时不会。isset()语言结构可以用来检测一个变量是否已被初始化。

 

可变变量:

      有时候使用可变变量名是很方便的。就是说一个变量的变量名是可以动态设置和使用。一个普通的变量通过申明来设置,一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

<?php
$a = 'hello';//定义一个普通变量
$$a = 'world';//使用$a变量的值创建一个可变变量
//这时两个变量都被定义了:$a的内容是"hello"并且$hello的内容是"world",因此可表达为
echo "$a${$a}",'<br />';
echo "$a{${$a}}",'<br />';
//同以下输出结果
echo "$a$hello",'<br />';
 
//可以定义更为复杂的可变变量,这个变量相当于$world='hello world';
$$$a = 'hello world';
echo $world;

如果将可变变量用于数组,必须解决一个模棱两可的问题,这就是当写下$$a[1]是,解释器需要知道是想要$a[1]作为一个变量呢,还是想要$aa作为一个变量并取出该变量中的索引为[1]的值。解决此问题的语法是对第一种情况用${$a[1]},对第二种情况用${$a}[1]。警告:超级全局变量不能用作可变变量。虽然可变变量使用十分方便,但这相当于是php中的棉花糖语法,有些会比较好用,且有些会导致程序逻辑不易理解,所以并不提倡在php中使用可变变量,但是可以用来解决一些复杂问题,简化一些问题的复杂性,从本人角度出发坚决反对在程序中是用$$$a之上的可变变量(那样会导致程序有很多地方不可控) 。

 

变量范围:

      变量的范围即它定义的上下文背景(也就是它的生效范围)。大部份的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含include和require引入的文件。但是用户在自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

 

global关键字:

      在函数中申明了全局变量$a和$b,任何变量的所有引用变量都会指向到全局变量,对与一个函数能够申明全局变量的最大个数,php没有限制。

<?php
//变量的范围
$a = 1;
$b = 2;
$c = 3;
$d = 4;
 
function Sum(){
      
       global $a,$b;//申明一个变量为全局变量多个变量之间可以用逗号分隔
       global $c;//当然也可以这样申明
      
       $a = $b+$c+$d;
}
 
function Sum2(){
       echo $a;
}
 
Sum();
//输出$a的值是5,并且会有一个Notice的错误,原因是$d在函数中是一个局部变量
//,并没有申明,$b是一个全局变量,所以$a的值为$b+$c;
echo $a;
 
//调用这个函数不会有任何输出,原因是在一个函数中申明的全局变量只能再这个函数中使用
Sum2();


在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组,$GLOBALS数组会生效在每个函数内。

<?php
//预定义超级全局数组$GLOBALS的使用
$a = 1;
$b = 2;
 
function Sum3(){
       echo $GLOBALS['a'];
}
 
function Sum4(){
       echo $GLOBALS['a'];
}
 
//调用两个函数输出的结果是一样的
Sum3();
Sum4();
 
/*
 * 说明$GLOBALS是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量内容。
 * $GLOBALS只所以在全局范围内存在,是因为$GLOBALS是一个超全局变量
 * 下面的例子演示超全局变量和作用域的例子
 */
function test_global(){
 
       // 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。
       global $HTTP_POST_VARS;
 
       echo $HTTP_POST_VARS['name'];
 
       // Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。
       echo $_POST['name'];
}
test_global();


静态变量:

      变量范围的另一个重要特性是静态变量(staticvariable)。静态变量仅在局部函数中存在,但当程序执行离开作用域时,其值并不丢失。

<?php
//静态变量
function test(){
       $a = 0;
       echo $a;
       ++$a;
}
 
function test1(){
       static $a = 1;
       echo $a;
       ++$a;
}
 
//这两个函数第一个test()函数不管调用多少次,当程序离开函数作用域之后$a变量就会被释放
//当再次调用函数是$a变量就会被重新赋值,所以输出结果永远不会变化
//第二个函数test1()函数中$a声明为静态变量,只有当前脚本程序第一次执行的时候被赋予初始值
//当程序离开函数作用域时$a变量不会被PHP垃圾回收机制释放,会依然保留其值
test();
test();
test1();
test1();
 
/*
 * 静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。
 * 写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。
 * 一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
 */
echo '<br />';
 
function test2()
{
       static $count = 0;
       ++$count;
       echo $count;
      
       if ($count < 10) {
              test2();
       }
      
       --$count;
       echo $count;
}
 
test2();


注意:静态变量可以按照上面的例子声明,如果在声明中用表达式的结果对其赋值会导致解析错误(如在函数中这样声明静态变量:static $int = 1+2;或static $int=inval($a);或者static $int =$count;)。

      在 Zend 引擎 1 代,它驱动了 PHP4,对于变量的 staticglobal定义是以references的方式实现的。例如,在一个函数域内部用global语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,在函数局部作用域中声明的全局变量不能使用&引用,这样会导致变量的值为NULL;

<?php
//类似的行为也适用于 static 语句。引用并不是静态地存储的:
function &get_instance_ref() {
    static $obj;
 
    echo 'Static object: ';
    var_dump($obj);
    if (!isset($obj)) {
        // 将一个引用赋值给静态变量
        $obj = &new stdclass;
    }
    $obj->property++;
    return $obj;
}
 
function &get_instance_noref() {
    static $obj;
 
    echo 'Static object: ';
    var_dump($obj);
    if (!isset($obj)) {
        // 将一个对象赋值给静态变量
        $obj = new stdclass;
    }
    $obj->property++;
    return $obj;
}
 
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
 
//执行以上例子会导致如下输出:
//Static object: NULL
//Static object: NULL
 
//Static object: NULL
// Static object: object(stdClass)(1) {
// ["property"]=>
// int(1)
// }
 
//上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住。


来自PHP之外的变量:

当一个表单体交给 PHP 脚本时,表单中的信息会自动在脚本中可用。有很多方法访问此信息,根据特定的设置和个人的喜好,有很多种方法访问 HTML 表单中的数据。PHP 也懂得表单变量上下文中的数组。例如可以将相关的变量编成组,或者用此特性从多选输入框中取得值。

IMAGE SUBMIT 变量名:

当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记: <input type="image" src="image.gif"name="sub" />

当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量sub_x 和 sub_y。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但PHP 自动将点转换成了下划线。

HTTP Cookies:

PHP 透明地支持 » Netscape 规范定义中的 HTTP cookies。Cookies 是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。可以用setcookie()函数设定 cookies。Cookies 是HTTP 信息头中的一部分,因此 SetCookie 函数必须在向浏览器发送任何输出之前调用。对于header() 函数也有同样的限制。Cookie 数据会在相应的 cookie 数据数组中可用,例如$_COOKIE$HTTP_COOKIE_VARS$_REQUEST。更多细节和例子见 setcookie() 手册页面。

如果要将多个值赋给一个 cookie 变量,必须将其赋成数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值