面向对象 - 魔术方法

  • 作者:KK

  • 发表日期:2017.2.23


就是某些情景下会被自动调用的方法

前面说的__construct__destruct两个方法就是在实例化和被销毁这两种场景下会被自动调用的方法,也属于魔术方法

其实PHP的类还有其它魔术方法,我这里先讲几个常见的

首先这些魔术方法作用域也都要定义为public


__get调用不存在的属性时触发

class Test{
	public function __get($name){
		//传进来的参数 $name 是一个字符串,这个值就是外面企图获取的属性名称
		
		echo '我没有' . $name . '这个属性啊';
	}
}

$test = new Test();
$age = $test->age; // 我没有age这个方法啊

__set赋值不存在的属性时触发

class Test{
	public function __set($name, $value){
		//$name 是外部要设置的属性名称
		//$value 是外部要设置的值
		
		echo '我没有' . $name . '这个属性让你赋值为 . $value';
	}
}

$test = new Test();
$test->age = 99; // 我没有age这个属性让你赋值为 99

__call调用不存在的方法时触发

class Test{
	public function __call($name, $params){
		echo '我没有' . $name . '这个方法啊,下面是传进来的参数';
		print_r($params);  //数组,元素分别是 a 1
	}
}

$test = new Test();
$test->abc('a', 1); // 我没有abc这个方法啊

__toString把一个类当字符串用的时候触发

class Test{
	public function __toString(){
		return 'abc123';
	}
}

$test = new Test();
echo $test; // abc123
$num = substr($test, 3);
echo $num;	//123

这里要说明一下,当程序代码要处理一个字符串参数时,如果将类传进去,那么PHP会自动调用__toString方法,__toString返回一个字符串给外面,外面实际上就是拿着这个字符串进行处理,而不是拿类本身去处理


更多魔术方法

callStatic、isset、unset、invoke还有__clone这几个比较少见

也是我做程序员五年来所见过有使用的,个别也是我自己有使用过的

而且这里还没列出全部,其它我压根没见过使用……可能还没碰到合适的使用场景

详见官方手册 - 语言参考 - 类与对象 - 魔术方法