1. 程式人生 > >PHP學習——26 PHP面向物件(物件的克隆clone與魔術方法__call、__callStatic)

PHP學習——26 PHP面向物件(物件的克隆clone與魔術方法__call、__callStatic)

一、物件的拷貝

<?php 
// 1.物件的拷貝
class Demo
{
	public $name = 'Tonny';
}
$demo1 = new Demo();
$demo2 = $demo1; // 引用賦值,實際上$demo1和$demo1指向同一個物件
$demo3 = clone $demo1;// 克隆賦值,相當於值傳遞賦值,將當前物件賦值到新的變數中
$demo1->name = 'Peter';
echo '引用賦值'.$demo1->name.'--'.$demo2->name;
// 引用賦值Peter--Peter
echo '<hr>';
echo '克隆賦值'.$demo1->name.'--'.$demo3->name;
// 克隆賦值Peter--Tonny
echo '<hr>';
echo '克隆物件的類是:'.get_class($demo3);
// 克隆物件的類是:Demo
echo '<hr>';
// 2.陣列的拷貝,與js不同,php中的陣列是值傳遞賦值
$arr1 = ['胡歌','張一山'];
$arr2 = $arr1; // 值傳遞賦值
$arr2[0] = '胡一刀';
print_r($arr1); // Array ( [0] => 胡歌 [1] => 張一山 )
echo '<hr>';
print_r($arr2); // Array ( [0] => 胡一刀 [1] => 張一山 )
?>

二、呼叫不存在的方法(靜態方法)時用到的__call(__callStatic)

<?php 
class Demo
{
	// 1.當我們呼叫一個不存在的方法時會自動呼叫__call()
	public function __call($method,$args)//第一個引數是方法名,第二個引數是方法的引數陣列
	{
		$var = '';
		foreach($args as $value){
			$var .= ','.$value; // .= 字串運算子
		}
		$var = substr($var,1);
		return '方法'.$method.'('.$var.')不存在';
	}
	// 2.當我們呼叫一個不存在的靜態方法時會自動呼叫__callStatic()
	// 靜態的魔術方法狀態一定是static
	public static function __callStatic($method,$args)
	{
		$var = '';
		foreach($args as $value){
			$var .= ','.$value;
		}
		$var = substr($var,1);
		return '靜態方法'.$method.'('.$var.')不存在';
	}
}
echo (new Demo)->show('Tom',24,2000);
// 方法show(Tom,24,2000)不存在
echo '<hr>';
echo Demo::display(100,200,400);
// 靜態方法display(100,200,400)不存在

?>