zoukankan      html  css  js  c++  java
  • php全局变量的使用

    php全局变量的使用

    一、总结

    1、php的全局变量:php的全局变量和C++,Java的全局变量不一样

    2、页面嵌套php:我在html页面中嵌套php代码的时候,php的全局变量好像和C++,Java的全局变量一样,好像是,记不清了

    3、php全局变量使用php全局变量用global定义一下就好,就在外面定义global是错的,必须在函数内声明

    4、global定义全局变量:global定义全局变量的时候,不能一起赋值,global $name = "why"的使用方式是错误的

    5、global使用(函数外声明global是错的):下面实例中还是在函数里面声明global然后才能用 

    二、PHP 全局变量

    一直认为PHP的全局变量与C++、Java全局变量类似,直到最近做项目过程中使用的局变量,才发现需要补充学习下这方面的内容

    1、全局变量的global的定义和使用

      最初,我的需求是这样的:
    <?php
    $name = "why";
    function changeName(){
        $name = "what";
    }
    changeName(); echo "my name is " . $name . "<br/>"; ?>

      执行代码的结果是:my name is why,而不是执行changeName()后显示what。分析原因,这是因为函数体changeName内$name变量被缺省设置为局部变量,$name的作用域就是在changeName内。于是,修改代码,添加全局变量如下:

    <?php
    global $name;
    $name = "why";
    function changeName(){
        $name = "what";
    }
    changeName(); echo "my name is " . $name . "<br/>"; ?>

      注意:不能在用global声明变量的同时给变量赋值。像global $name = "why"的使用方式是错误的。

      定义全局变量后执行的结果仍然为my name is why,这个结果让我吃惊。原来,global的正确用法是:"在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。" 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。那么,再次修改代码:

    <?php
    $name = "why";
    function changeName(){
        global $name;
        $name = "what";
    }
    changeName();
    echo "my name is " . $name . "<br/>";
    ?>

      这次的运行结果是:my name is what,说明global是起传递参数的作用,而并非使变量的作用域为全局。再看下面的例子:

    <?php
    $name = "why";
    function changeName(){
        global $name;
        $name = "what";
    }
    function changeName2(){
        $name = "where";
    }
    changeName();
    changeName2();
    echo "my name is " . $name . "<br/>";
    ?>

      执行结果为:my name is what,如果在changeName2()中添加global $name,运行结果则是:my name is where。

      综上,global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了。

      除了使用global参数定义外,还可以使用超全局变量$GLOBAL:

    <?php
    $name = "why";
    function changeName(){
        $GLOBALS['name'] = "what";
    }
    changeName();
    echo "my name is " . $name . "<br/>";
    ?>

    2、global和$GLOBAL

    一个例子:

    <?php
    $var1 = 1;
    $var2 = 2;
    function test1(){
        $GLOBALS['var2'] = &$GLOBALS['var1'];
    }
    test1();
    echo $var2 . "<br />";
    
    $var3 = 1;
    $var4 = 2;
    function test2(){
        global $var3,$var4;
        $var4 = &$var3;
    }
    test2();
    echo $var4 . "<br />";
    ?>

      输出$var2的值为1,$var4的值为2,因为$var3的引用指向了$var4的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。意味着$GLOBAL在一个脚本的全部作用域中都可用,在函数或方法中无需执行global $variable; 就可以访问它们。与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。另一个例子:

    <?php
    $var1 = 1;
    function test1(){
        unset($GLOBALS['var1']);
    }
    test1();
    echo $var1 . "<br />";
    
    $var2 = 1;
    function test2(){
        global $var2;
        unset($var2);
    }
    test2();
    echo $var2;
    ?>

      输出结果是$var1不存在,而$var2的值为1。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。也就是说global $var其实就是$var = &$GLOBALS['var'],调用外部变量的一个别名而已!

    参考:

    PHP 全局变量 - borage - 博客园
    https://www.cnblogs.com/borage/p/3645285.html

    三、实例(php实现排列组合)

     1 <?php
     2 namespace appindexcontroller;
     3 
     4 use appindexcontrollerBase;
     5 
     6 class Exercise extends Base
     7 {
     8     public function index()
     9     {
    10         // return view('insert_array');
    11         $this->plzhDemo();
    12     }
    13 
    14     /**
    15      * php实现排列组合
    16      * 参数:传入数组 排列组合所取的位数 vis数组 ans数据用来记录每次的结果
    17      * 算法;递归(回溯)
    18      * 返回值:返回排列组合结果数组
    19      * @return [type] [description]
    20      */
    21     private $count1=0;
    22     public function plzh($arr,$n,$pos,$vis,$ans){
    23         //1、递归返回条件:位数够了就可以返回了
    24         if($pos>$n-1){
    25             global $count1;
    26             $count1++;
    27             dump($ans);
    28         }else{
    29             $len=count($arr);
    30             for ($i=0; $i < $len; $i++) { 
    31                 if($vis[$i]==0){//没取
    32                     $ans[$pos]=$arr[$i];
    33                     $vis[$i]=1;
    34                     $this->plzh($arr,$n,$pos+1,$vis,$ans);
    35                     $vis[$i]=0;
    36                 }
    37             }
    38         }
    39         //2、递归里面的算法(一位一位的来取)取一位之后,把这一位的数标记置为已经取了,然后取后面的位的时候从没有取的数里面取,所以需要标记数组
    40         //2.1、 从未取的数里面依次取一位就好
    41 
    42     }
    43     public function plzhDemo(){
    44         $arr=array(1,2,3,4,5,6,7);
    45         $n=5;
    46         $vis=array();
    47         for ($i=0; $i <=count($arr) ; $i++) { 
    48             $vis[$i]=0;
    49         }
    50         $ans=array();
    51         $this->plzh($arr,$n,0,$vis,$ans);
    52         global $count1;
    53         dump($count1);
    54     }
    55 
    56 }

    还是在函数里面声明了global然后用的。

  • 相关阅读:
    Account group in ERP and its mapping relationship with CRM partner group
    错误消息Number not in interval XXX when downloading
    错误消息Form of address 0001 not designated for organization
    Algorithm类介绍(core)
    梯度下降与随机梯度下降
    反思
    绘图: matplotlib核心剖析
    ORB
    SIFT
    Harris角点
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8995988.html
Copyright © 2011-2022 走看看