点击数:14242015-07-25 15:37:03 来源: 外贸网站建设,深圳外贸网站建设,深圳网站建设,外贸商城网站制作-亿恩科技
变量与其它变量明确区别的,下面我来给各位介绍 static 静态变量和属性方法及静态变量的引用与静态函数的用法,各位有需要了解的同学可参考.
静态变量:变量范围的另一个重要特性是静态变量(static variable),静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失,看看下面的例子.
例子 7-4.演示需要静态变量的例子,代码如下:
- <?php
- function Test ()
- {
- $a = 0;
- echo $a;
- $a++;
- }
- ?>
本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0",将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了,要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的.
例子 7-5. 使用静态变量的例子,代码如下:
- <?php
- function Test()
- {
- static $a = 0;
- echo $a;
- $a++;
- }
- ?>
现在,每次调用 Test() 函数都会输出 $a 的值并加一.
静态变量也提供了一种处理递归函数的方法,递归函数是一种调用自己的函数,写递归函数时要小心,因为可能会无穷递归下去,必须确保有充分的方法来中止递归,一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止.
例子 7-6,静态变量与递归函数,代码如下:
- <?php
- function Test()
- {
- static $count = 0;
- $count++;
- echo $count;
- if ($count < 10) {
- Test ();
- }
- $count--;
- }
- ?>
注:静态变量可以按照上面的例子声明,如果在声明中用表达式的结果对其赋值会导致解析错误.
例子 7-7.声明静态变量,代码如下:
- <?php
- function foo(){
- static $int = 0; // correct
- static $int = 1+2; // wrong (as it is an expression)
- static $int = sqrt(121); // wrong (as it is an expression too)
- $int++;
- echo $int;
- }
- ?>
全局和静态变量的引用
在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的,例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用,这有可能导致预料之外的行为,如以下例子所演示的,代码如下:
- <?php
- function test_global_ref() {
- global $obj;
- $obj = &new stdclass;
- }
- function test_global_noref() {
- global $obj;
- $obj = new stdclass;
- }
- 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 "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() 函数时其值并没有被记住.
注:
1.函数外部声明静态变量意义不大,函数内部声明静态变量受限于作用域,函数外部不能修改函数内部静态变量.
2.引用变量,也是变量,只不过它的值是变量的内存地址.
php保留字 global和static,代码如下:
- <?php