這個標題估計很多人會不屑一顧,變數賦值?excuse me?我們學開發的第一課就會了好不好。但是,就是這樣基礎的東西,反而會讓很多人矇圈,比如,值和引用的關係。今天,我們就來具體講講。
首先,定義變數和賦值這個不用多說了吧
$a = 1;
$b = '2';
$c = [4, 5, 6];
$d = new stdclass();
四個變數,分別定義了整型、字串、陣列的物件。這也是我們天天要打交道的四種型別。
然後,變數給變數賦值。
$a1 = $a;
$b1 = $b;
$c1 = $c;
$d1 = $d;
請注意,前三個的賦值都是正常的賦值,也就是對具體內容的拷貝。當我們修改$a1的時候$a不會有變化。$a1是新開的記憶體空間儲存了我們的值。也就是說,他們的值是一樣的,但記憶體位址不一樣。是兩個沒啥關係的長得很像的人而已。
但是$d1和$d就不是了,這兩貨不僅值是一樣的,記憶體位址也是一樣的。這種情況就是我們所說的引用賦值。當$d1發生變化時,$d2也會產生變化。
用具體的例子來說明,首先是普通值的賦值:
// 普通賦值
$v = '1';
$c = $v;
$c = '2';
echo $v, php_eol; // '1'
// 陣列也是普通賦值
$arr1 = [1,2,3];
$arr2 = $arr1;
$arr2[1] = 5;
print_r($arr1); // [1, 2, 3]
$c不會對$v的值產生影響。$arr2修改了下標1,也就是第二個數字為5,當然也不會對$arr1產生影響。
那麼物件形式的引用賦值呢?
// 物件都是引用賦值
class a
$a = new a();
$b = $a;
echo $a->name, php_eol; // '我是a'
echo $b->name, php_eol; // '我是a'
$b->name = '我是b';
echo $a->name, php_eol; // '我是b'
果然不出所料,$b修改了name屬性的內容後,$a裡面的name也變成了$b所修改的內容。
在這種情況下,如果物件想要不是引用傳遞的,一是使用__clone(),也就是原型模式來進行自己的拷貝。二是從外面重新new乙個唄。
// 使用轉殖解決引用傳遞問題
class child
class a1
function __clone()
}$a1 = new a1();
echo $a1->name, php_eol; // 輸出a1原始的內容
echo $a1->child->name, php_eol;
$b1 = $a1;
echo $b1->name, php_eol; // b1現在也是a1的內容
echo $b1->child->name, php_eol;
$b1->name = '我是b1'; // b1修改內容
$b1->child->name = '我是b1的下級';
echo $a1->name, php_eol; // a1變成b1的內容了
echo $a1->child->name, php_eol;
// 使用__clone
$b2 = clone $b1; // b2轉殖b1
$b2->name = '我是b2'; // b2修改內容
$b2->child->name = '我是b2的下級';
echo $b1->name, php_eol; // b1不會變成b2修改的內容
echo $b1->child->name, php_eol;
echo $b2->name, php_eol; // b2修改的內容沒問題,b1、b2不是乙個貨了
echo $b2->child->name, php_eol;
物件的引用這一塊確實會容易讓人矇圈。特別是更加複雜的物件,內部的屬性還有各種引用其他物件的時候。這種情況下一定要仔細確認引用賦值會不會帶來問題,如果有問題,就使用新物件或者轉殖技術進行引用問題的處理。
最後,輕鬆一下,引用變數的賦值就和我們給方法傳引用引數一樣的,使用乙個&符號就可以啦!
// 引用賦值
$b = &$v;
$b = '3';
echo $v, php_eol;
今天我們更深入的學習和了解了一下php中的賦值問題,特別是普通賦值和引用賦值的問題。下回看**和框架的時候可以注意注意別人是怎麼靈活使用這兩種賦值的哈,自己也能試試能不能運用這兩種方式改造下自己曾經寫過的bug哦!
測試**:
b站id:482780532
PHP變數賦值
php變數賦值的方式有兩種 值賦值和引用賦值。預設情況下,php中都使用值傳遞方式,即若在函式的內部改變了引數的值,也不會影響到函式外部的值。例 function change string str 改變之前 change str echo str 輸出結果為 改變之前。儘管在函式內部改變了引數 s...
PHP變數引用賦值與變數賦值變數的區別
變數預設總是傳值賦值。那也就是說,當將乙個表示式的值賦予乙個變數時,整個原始表示式的值被賦值到目標變數。這意味著,例如,當乙個變數的值賦予另外乙個變數時,改變其中乙個變數的值,將不會影響到另外乙個變數。有關這種型別的賦值操作,請參閱表示式一章。foo abc b foo b my name is b...
說說PHP的變數賦值
php 中的變數用乙個美元符號後面跟變數名來表示。變數名是區分大小寫的。傳值 預設 變數預設是傳值賦值,即表示式的值被賦值到目標變數。表示式 在 php 中,幾乎所寫的任何東西都是乙個表示式,表示式即 任何有值的東西 最基本的表示式形式是常量和變數 如 a 5 其中5是乙個值為5的表示式,把此表示式...