zoukankan      html  css  js  c++  java
  • PHP手册阅读笔记2

    关于引用

    引用是什么

    在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。

    $a =& $b;//表示$a,$b指向同一个地方。

    如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

    function foo(&$var) { }
    
    foo($a); // $a is "created" and assigned to null
    
    $b = array();
    foo($b['b']);
    var_dump(array_key_exists('b', $b)); // bool(true)
    
    $c = new StdClass;
    foo($c->d);
    var_dump(property_exists($c, 'd')); // bool(true)

    如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

    $var1 = "Example variable";
    $var2 = "";
    
    function global_references($use_globals)
    {
        global $var1, $var2;
        if (!$use_globals) {
            $var2 =& $var1; // visible only inside the function
        } else {
            $GLOBALS["var2"] =& $var1; // visible also in global context
        }
    }
    
    global_references(false);
    echo "var2 is set to '$var2'\n"; // var2 is set to ''
    global_references(true);
    echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'

    函数的传值调用

    <?php
    
        function test(&$a)
    
        {
    
            $a=$a+100;
    
        }
    
        $b=1;
    
        echo $b;//输出1
    
        test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
    
        echo "<br>";
    
        echo $b;//输出101
    
    ?>

    注意:

        上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:

    <?php
    
    
    
    function a(&$b){
    
        $b++;
    
    }
    
    $c=0;
    
    
    
    call_user_func_array('a',array(&$c));
    
    
    
    echo $c;
    
    
    
    //输出 1
    
    
    
    ?>

    3.函数的引用返回

    <?php
    
    function &test()
    
    {
    
        static $b=0;//申明一个静态变量
    
        $b=$b+1;
    
        echo $b;
    
        return $b;
    
    }
    
    
    
    $a=test();//这条语句会输出 $b的值 为1
    
    $a=5;
    
    $a=test();//这条语句会输出 $b的值 为2
    
    
    
    $a=&test();//这条语句会输出 $b的值 为3
    
    $a=5;
    
    $a=test();//这条语句会输出 $b的值 为6
    
    ?>

    用上面的例子来解释就是
    $a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
    而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
    即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
    $a=&test();
    $a=5;
    以后,$b的值变为了5

    这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中。

    This is the way how we use pointer to access variable inside the class.
    
    <?php
    class talker{
    
        private $data = 'Hi';
    
        public function & get(){
            return $this->data;
        }
       
        public function out(){
            echo $this->data;
        }   
    
    }
    
    $aa = new talker();
    $d = &$aa->get();
    
    $aa->out();
    $d = 'How';
    $aa->out();
    $d = 'Are';
    $aa->out();
    $d = 'You';
    $aa->out();
    ?>
    
    the output is "HiHowAreYou"

     

  • 相关阅读:
    Go-day01
    M1-Flask-Day2
    M1-Flask-Day1
    Tornado基于MiddleWare做中间件
    SqlAlchenmy基本使用
    PV、UV、UIP、VV、CPC、CPM、RPM、CTR解释
    Celery笔记
    Celery 分布式任务队列快速入门
    库操作
    Django cache
  • 原文地址:https://www.cnblogs.com/phplover/p/3114606.html
Copyright © 2011-2022 走看看