【PHP】解析PHP中的變量

php是一門腳本語言,同時php中的變量類型也是弱語言類型,這和javascript很是類似。筆者在這裏說一說PHP中的變量知識點。javascript

1. 引用類型變量

看下面的案例:php

<?php
class Ref{
    public $val = 100;
}
function change($v){
    $v++;
}
$Ref = new Ref();
echo $Ref->val."\n";//100
change($Ref->val);
echo $Ref->val."\n";//100
?>

輸出結果爲:java

100
100

其中符號點(.)表示鏈接符。
若是把change函數改爲以下的形式數組

function change(&$v){//注意多了&符號
    $v++;
}

而後輸出的結果就是:app

100
101


&在上面已經演示過了,&表示引用操做符,顧名思義,被&操做符修飾的變量,表示傳遞變量的引用。
例如:函數

<?php
$foo = "test";

$bar = &$foo;//以引用傳遞

echo $bar."\n";//test

$bar = "hello";

echo $foo."\n";//hello

unset($foo);//釋放給定的變量

if( isset($bar) ) //檢測變量是否已設置
    echo "bar is set\n";
else
    echo "bar is not set\n";

if( isset($foo) ) //檢測變量是否已設置
    echo "foo is set\n";
else
    echo "foo is not set\n";
?>

2.可變變量

php中還提供了可變變量這種語法,一個可變變量獲取了一個普通變量的值做爲這個可變變量的變量名。
例如:佈局

<?php
$foo = "hello";
$$foo = "world";
$$$foo = "php";

echo $foo."\n";//hello

echo $$foo."\n";//world;
echo $hello."\n";//world

echo $$$foo."\n";//php
echo $$hello."\n";//php
echo $world."\n";//php
?>

下面的案例是摘錄自文檔中,這裏作出以下幾點解釋。ui

=>用於給數組賦值時,使用指定(鍵和值)。this

->用於在訪問類的成員字段時,指定要訪問的目標字段。url

<?php
class foo {
    var $bar = 'I am bar.';
    var $arr = array(name=>'jamy.',age=>12);
    var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');

echo $foo->$bar . "\n";

echo $foo->{$baz[1]} . "\n";

$start = 'b';
$end   = 'ar';
echo $foo->{$start . $end} . "\n";

$arr = 'arr';
echo $foo->{$arr[1]} . "\n";
?>

輸出爲:

I am bar.
I am bar.
I am bar.
I am r.

 3.超全局變量和局部變量

在PHP中根據變量的做用範圍分爲全局變量和局部變量。

局部變量:在函數之中定義的變量被稱爲局部變量。

全局變量:在函數以外聲明的變量就是全局變量,若要在函數之中使用全局變量,必需要利用global關鍵字定義目標變量,或者使用$GLOBLES來指定。

超全局變量(預約義變量):是在所有做用域中始終可用的內置變量。$GLOBLES就是一個超全局變量,它能夠在腳本任何做用域內使用。除了$GLOBLES,還有$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV。

例如:

<?php
function myfunc(){
    global $foo;
    echo $foo;//hello
}
$foo = "hello";
myfunc();
?>

若是使用$GLOBALS一樣也能夠在函數內訪問全局變量。

function myfunc(){
    echo $GLOBALS["foo"];//hello
}

$_GET是經過 URL 參數傳遞給當前腳本的變量的數組

<?php 
$para = $_GET;
foreach (array_keys($para) as $p){
    echo("para = ".$p.",val = ".$para[$p]."\n");
}
?>

若是用..../myphpfile.php?name=jamy&age=12

網頁源碼效果圖以下:

其他的說明以下:

$_SERVER : 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。
$_POST:當 HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時,會將變量以關聯數組形式傳入當前腳本。
$_GET:經過 URL 參數傳遞給當前腳本的變量的數組
$_FILES:HTTP文件上傳變量,經過 HTTP POST 方式上傳到當前腳本的項目的數組。
$_SESSION:當前腳本可用 SESSION 變量的數組
$_COOKIE:經過 HTTP Cookies 方式傳遞給當前腳本的變量的數組。
$_REQUEST:request變量,默認狀況下包含了 $_GET,$_POST 和 $_COOKIE 的數組。
$GLOBALS:包含了所有變量的全局組合數組。變量的名字就是數組的鍵。

4.靜態變量

靜態變量使用static修飾,靜態變量的訪問也不能使用->,而是要使用::格式,例如:

<?php
class foo{
    public static $porp = "hello";
}
echo foo::$porp;//hello

這樣的語法和C++有幾分類似之處。

靜態變量只會被初始化一次,不管是佈局仍是全局的。例如:

<?php
$test = function(){
    static $count = 0;
    echo $count++."\n";
};
$test();
$test();
$test();

結果爲:

0
1
2

 5.類實例變量

在上面咱們已經用過了類了,關於PHP中的類,筆者這裏還想再作一些補充。

定義類的注意點:

1.定義類使用關鍵字class,class後接類名

2.定義構造函數使用__construct,後面接參數。

3.定義訪問修飾符,好比:private,public,protected。

4.定義方法使用function關鍵字,在定義方法時若是不指定訪問修飾符,默認爲public。

<?php 
//user.php
class User {
    private $name;
    private $age;
    function __construct( $name, $age ) {
        $this->name = $name;
        $this->age = $age;
    }
    function getName() {
        return $this->name;
    }
    function isAdult() {
        return $this->age >= 18?"an Adult":"Not an Adult";
    }
}

而後可使用以下的代碼訪問

<?php
require "user.php";
 
$h = new User( "Calvin", 15 );
echo "Hello, " . $h->getName(). "! You are ". $h->isAdult();
?>
<br/>
<?php
$h = new User( "Chris", 39 );
echo "Hello, " . $h->getName(). "! You are ". $h->isAdult();
?>

參考文章:

http://php.net/

相關文章
相關標籤/搜索