果然在物健導向的底還不夠深,趁這個機會將觀念一掃而空。
PHP部分:
在 PHP ,大部分時候寫 = 代表複製過去的是變數裡面的 value, =& 代表複製過去的是變數(參數傳值)。但是當變數是物件時當 = 的右邊是物件時,複製過去的會是 reference (參數傳址)。如果要複製物件裡面的 value 到一個新的物件,必須用關鍵字 clone,如下:
<?php
$obj2 = clone $obj;
?>
Javascript部分:
在Javascript部分,陣列和物件都是reference (參數傳址) ,而其他變數則是(參數傳值),Javascript複製物件的方法請參考http://www.josephjiang.com/presentation/OOJS/object-oriented-paradigms.html。
PS:PHP的陣列是(參數傳值)。
最後這是自己寫的範例執行結果:
PHP 部分:
<?php
//參數傳值
$a = 10;
$b = $a;
$b = 15;
echo '<br />v1=' . $a . ' v2=' . $b;
//參數傳值
//陣列
$ar[0] = 10;
$br = $ar;
$br[0] = 15;
echo '<br />v1=' . $ar[0] . ' v2=' . $br[0];
//參數傳址
//物件
class foo {
public $value = 42;
public function getValue() {
return $this->value;
}
}
$ao = new foo;
$bo = $ao;
$bo->value = 15;
echo '<br />v1=' . $ao->value . ' v2=' . $bo->value;
?>
<br><br>JAVASCRIPT 部分:
<script type="text/javascript">
//參數傳值
var v1=10;
var v2=v1;
v2=15;
document.write("<br />v1="+v1+" v2="+v2);
//參數傳址
//陣列
var ay1=new Array(10);
var ay2=ay1;
ay2[0]=15;
document.write("<br />v1="+ay1[0]+" v2="+ay2[0]);
//參數傳址
//物件
var o1={v:1};
var o2=o1;
o2.v=15;
document.write("<br />v1="+o1.v+" v2="+o2.v);
</script>
以下產生的結果為
PHP 部分:
v1=10 v2=15
v1=10 v2=15
v1=15 v2=15
JAVASCRIPT 部分:
v1=10 v2=15
v1=15 v2=15
v1=15 v2=15
線上產生網址:http://pim0110.com/joomla/download/exp_obj_2012_04_16/obj.php
範例檔案下載:http://pim0110.com/joomla/download/exp_obj_2012_04_16/obj.zip