您的足迹:首页 > php知识 >php常用魔术方法

php常用魔术方法

1.构造函数__construct()和析构函数__desctruct()分别在对象创建和销毁时被调用。对象被“销毁”是指不存在任何对该对象的引用,比如引用该对象的变量被删除(unset)、重新赋值或脚本执行结束,都会调用析构函数。
2.__tostring()方法:对象被当作string(字符串)使用时(如echo $obj),此方法自动调用,此方法中须返回(return)一个字符串
__invoke()方法:对象被当作方法调用时(如$obj()),此方法自动调用
属性重载
3.__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
4.__get():读取不可访问或不存在属性的值时,__get()会被调用 定义function __get($name)
__set():在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)
isset():当对不可访问属性调用isset()或empty()时,__isset()会被调用
unset():当对不可访问的属性调用unset()时,__unset()会被调用
5.__clone克隆:当对一个对象使用clone关键字时,该魔术方法会被调用。在这个魔术方法里,我们可以实现任何子对象的克隆
默认的,对象都是按引用传值的。因此,在将一个对象赋值给另一个变量时,只是创建了指向该对象的一个引用,并没有复制该对象。为了实现真正得复制一个对象,我们需要使用clone关键字。
<?php
class MagicTest{
	//1.__tostring()方法:对象被当作string(字符串)使用时(如echo $obj),此方法自动调用,此方法中须返回(return)一个字符串
	public function __tostring(){
		return "This is the Class MagicTest.";//return
	}
	//2.__invoke()方法:对象被当作方法调用时(如$obj()),此方法自动调用
	public function __invoke($x){
		echo "__invoke called with parameter ".$x."</br>";
	}
	//当对象访问不存在的方法名称时,_call方法会被自动调用
	//方法的重载overloading;此方法必须有两个参数,第一个参数就是调用的未定义方法的名称,第二个参数是未定义方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling ".$name." with parameters:".implode(',',$arguments)."</br>";
	}
	//当对象访问不存在的静态方法名称时,callStatic()方法会被自动调用
	//静态方法的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static calling ".$name." with parameters:".implode(',',$arguments)."</br>";
	}
}
$obj = new MagicTest();
echo $obj."</br>";//This is the Class MagicTest.

$obj('hh');//__invoke called with parameter hh 

$obj->calltest('par1','par2');//Calling calltest with parameters:par1,par2
MagicTest::calltest('par1','par2');//Static calling calltest with parameters:par1,par2
?>

属性重载
<?php
class MagicTest{
	/**
	1读取不可访问或不存在属性的值时,__get()会被调用 定义function __get($name)
	2在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)
	3当对不可访问属性调用isset()或empty()时,__isset()会被调用
	4当对不可访问的属性调用unset()时,__unset()会被调用
	5所谓不可访问属性,实际上就是在调用某个属性时发现这个属性没有被定义,这时候不同的操作会触发不同的魔术方法
	6这几个方法也被成为属性重载的魔术方法
	7属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。
	*/
	public function __get($name){
		return "Getting the property ".$name;
	}
	public function __set($name,$value){
		echo  "Setting the property ".$name." to the value ".$value."</br>";
	}
	public function __isset($name){
		echo  "isset called</br>";
		return true;//isset时true
		//return false;//empty时false
	}
	
	public function __unset($name){
		echo "unsetting called ".$name."<br>";
	}
}
$obj = new MagicTest();
echo $obj->proName."</br>";
$obj->proName = "Magicname";

echo '$obj->className is set? '.isset($obj->className)."<br/>";//return true;时$obj->className is set? 1
echo '$obj->className is empty? '.empty($obj->className)."<br/>";//return false;时$obj->className is empty? 1

unset($obj->className);
?>

3.__clone克隆魔术方法
<?php
//当希望生成一个真正独立存储的 NbaPlayer() 对象,但新对象的 所有数据 都和 $james 对象中的 相同时,使用关键字 clone
//当class NbaPlayer()中定义了 __clone()方法 后,使用clone关键字时,系统将调用 用户定义的__clone()方法 (此时可以对clone 后生成的新对象的属性进行修改)
class NbaPlayer{
	public $name;
	function __clone(){
		$this->name = 'TBD';//__clone()在 clone一个new的变量时 希望和clone过来的初始值不一样可以用这个函数在下面$this->name = "tbd";去实现克隆后的初始值不一样的效果。
	}
	
}
$james = new NbaPlayer();
$james->name = 'James';
echo $james->name."<br>";

//clone关键字
$james2 = clone $james;
echo "Before set up:James2's ".$james2->name."<br>";

$james2->name = 'James2';
echo "James's ".$james->name."<br>";
echo "James2's ".$james2->name."<br>";

?>



相关推荐

网友评论(0)