PHP裡的值傳遞與引用傳遞

來源:互聯網
上載者:User

 

PHP中存在著值傳遞和引用傳遞。後者需要使用地址符&來標識變數。使用賦值操作舉例說明如下:

1、值傳遞

1)基礎資料型別 (Elementary Data Type):

<?php$a = 1;$b = $a;$b += 2;echo "\$a = ".$a."<br />";echo "\$b = ".$b."<br />";/* 輸出:$a = 1$b = 3*/?>

註:這裡使用了$b = $a語句,是將$a的值賦給了$b。 即此時賦的值是1。

執行語句$b += 2後:

所以,$b變成了3,但是$a的值並沒有改變。

2)引用資料類型

Person類如下:

<?php class Person {private $_name;public function setName($name) {$this->_name = $name;}public function getName() {return $this->_name;}public function toString() {return "name is ".$this->_name;}}?>

初始化兩個Person類對象,並設定屬性:

 

3

$p2 = new Person();

4

$p2->setName("person2");

執行以下操作:

1

$p3 = $p1;

測試:

1

echo "\$p1's ".$p1->toString().".<br />";

2

echo "\$p3's ".$p3->toString().".<br />";

3

 

4

/* 輸出:

5

    $p1's name is person1.

6

    $p3's name is person1.

7

*/

 

註: 對於 $p3 = $p1語句, 即此時賦的值是0x000a。 即$p1和$p3都引用了同一個對象。

2、引用傳遞

1)基礎資料型別 (Elementary Data Type)

01

<?php

02

    $a = 1;

03

    $b = &$a;

04

    $b += 2;

05

 

06

    echo "\$a = ".$a."<br />";

07

    echo "\$b = ".$b."<br />";

08

 

09

    /* 輸出:

10

        $a = 3

11

        $b = 3

12

    */

13

?>

註:這裡使用$b = &$a語句,進行了引用傳遞: 即此時賦的值是0x0001。

所以對$b += 2後,

所以$a和$b的值都是3。

2)引用資料類型

若執行的是以下操作來替代之前的$p3 = $p1

1

$p3 = &$p1;

再執行以下操作:

1

$p3 = $p2;

測試結果如下:

1

echo "\$p1's ".$p1->toString().".<br />";

2

echo "\$p3's ".$p3->toString().".<br />";

3

 

4

/* 輸出:

5

    $p1's name is person2.

6

    $p3's name is person2.

7

*/

註:對已列印出$p3的結果資訊是很明了的,因為執行了$p3 = $p2語句,但是為什麼列印$p1的結果資訊與之前相比不一樣了呢?

是因為$p3 = &$p1語句執行後, 即此時賦的值是0x0001。

緊接著執行$p3 = $p2語句後

所以才會列印出如上的結果資訊,這便是地址符&在起作用。

完整代碼如下:

1)引用資料類型

01

<?php

02

    class Person {

03

        private $_name;

04

 

05

        public function setName($name) {

06

            $this->_name = $name;

07

        }

08

 

09

        public function getName() {

10

            return $this->_name;

11

        }

12

 

13

        public function toString() {

14

            return "name is ".$this->_name;

15

        }

16

    }

17

 

18

    $p1 = new Person();

19

    $p1->setName("person1");

20

    $p2 = new Person();

21

    $p2->setName("person2");

22

 

23

    $p3 = $p1;

24

    // $p3 = &$p1;

25

    // $p3 = $p2;

26

    echo "\$p1's ".$p1->toString().".<br />";

27

    echo "\$p3's ".$p3->toString().".<br />";

28

?>

2)基礎資料型別 (Elementary Data Type)

1

<?php

2

    $a = 1;

3

    $b = $a;

4

    // $b = &$a;

5

    $b += 2;

6

 

7

    echo "\$a = ".$a."<br />";

8

    echo "\$b = ".$b."<br />";

9

?>

結束語:對於值傳遞與引用傳遞在方法/函數參數的傳遞上情況下,與賦值操作情況是類似的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.