php之static和&关键字解析

static关键字

  1. static关键字的一个重要特性是静态变量,静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

    <?php
    function test() {
        static $a = 0;
        echo $a;
        $a++;
    }
    ?>
    test();#0
    test();#1
    
    #变量 $a 仅在第一次调用 test() 函数时被初始化
    
    静态变量与递归函数
    function test() {
    static $count = 0;
    
    $count++;
    echo $count;
    if ($count < 10) {
        test();
    }
    $count--;
    echo $count;
    }
    test();#输出为:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 0
  2. 类中的static,即静态属性和静态方法
    • 静态属性:可以通过类来访问,不能通过类的对象来访问。静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
    • 静态方法:可以通过类来访问,也可以通过类的对象来访问。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
<?php
class Test{
    public static $a1 = '123';
    public static function f1() {
        echo self::$a1;
    }
}
echo Test::$a1; #123
echo Test::f1();#123
$test  = new Test();
echo $test->a1;#Notice: Undefined property: Test::$a1
echo $test->f1();#123

3.static后期静态绑定参看
http://blog.csdn.net/ma199385/article/details/50639276

&取址运算符

  1. 在 PHP 中引用意味着用不同的名字访问同一个变量内容,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。

    <?php
    $a =& $b;$a$b 指向了同一个变量内容
    
    function foo(&$var) { }
    foo($c); #$c被创建,指向null
    
    #如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。
    
  2. 引用传递,一个变量通过引用传递给函数,这样该函数就可以修改其参数的值

    <?php
    function foo(&$var) {
        $var++;
    }
    
    $a=5;
    foo($a);#6 
    
    ?>

    可以进行引用传递的方式

    • 变量,例如 foo($a)
    • New 语句,例如 foo(new foobar())
    • 引用返回
  3. 引用返回,引用返回用在当函数返回值应该被绑定在一个变量上面时,

    <?php
    class foo {
        public $value = 42;
    
        public function &getValue() {
            return $this->value;
        }
    }
    
    $obj = new foo;
    $myValue = &$obj->getValue();#如果不加&,即为普通调用
    $obj->value = 2;
    echo $myValue; #2
    $myValue   = 3;
    echo $obj->value; #3
    
    #此时$myvalue和类中的属性$value指向同一个变量内容, 
    
  4. 取消引用,当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了

    <?php $a = 1; $b =& $a; unset($a); #不会 unset $b,只是 $a
  5. 引用定位

    • global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。和下面的代码作用相同。

      <?php
      $var =& $GLOBALS["var"];
      ?>
      
    • $this
      在一个对象的方法中,$this 永远是调用它的对象的引用。

全局和静态变量的引用

对于变量的 static 和 global 定义是以引用的方式实现的,所以如果给static或者global的变量赋值一个引用,那么此变量将不再是global和static类型的了。

<?php
function test_global_ref() {
    global $obj;
    $obj = &new stdclass;此时$obj不再是全局变量,它由指向全局的变量内容变为指向局部对象。所以在函数外部调用$objnull
}

function test_global_noref() {
    global $obj;
    $obj = new stdclass;
}

test_global_ref();
var_dump($obj); #NULL
test_global_noref();
var_dump($obj);#object(stdClass)(0) {
}
?>
<?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)
#}

你可能感兴趣的:(PHP,static,引用)