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 app\index\controller;
 3 
 4 use app\index\controller\Base;
 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然后用的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM