【PHP】关于对普通传递和&引用传递、浅拷贝与深拷贝clone、call_user_func_array的一些思考
###
浅拷贝=&赋值:指两个或多个变量使用同一块内存地址;通常变量使用&进行引用,&$var, &[], &$bool,使用同一块内存地址;
深拷贝clone,普通=赋值:类对象或模型对象,开辟两块内存地址;或者普通变量 通过 【=赋值】,为$a = $b = [1,2,3],$a,$b使用不同内存地址;
###
/**
* call_user_func_array在动态方法、静态方法、匿名方法中使用
*/
echo call_user_func_array([$this, 'func1'], []);
echo call_user_func_array('self::static1', []);
$real = '实参';$new_arr = [];
$res = call_user_func_array(function($arr,$b) use ($real, $new_arr){
if(is_array($arr)){//已证明是第一个参数,否数组
foreach ($arr as $i){
array_push($new_arr, $i);
}
}
return $arr;
array_push($new_arr, $real);
return $new_arr;
}, [1,2,3,4]);
var_dump($res);//1
exit;
/**
* 普通与引用& | 浅拷贝与深拷贝 -- 区别联系
*/
// 普通类型变量
##$a = $b = [1,2];//普通赋值 -- 两块内存、深拷贝
$b = [1,2]; //&引用赋值 -- 一块内存、浅拷贝
$a = &$b;
$b[1] = 22;
dd($a[1]);//22
// 对象类型变量
$a = $b = OrderTrace::first();//浅拷贝 -- 同一块内存
##$a = clone $b = OrderTrace::first();//深拷贝 -- 开辟两块内存
$b->order_id = '1';
dd($a->order_id);//1,,, $a->order_id='200418456456451120';
}
public function func1( )
{
return 1;
}
public function static1( )
{
return 'static1';
}