PHP面向对象中有很多功能很强大,不得不说的就是魔术方法了。今天抽出时间记录几个比较常用的魔术方法:
1.__construct 这是构造函数,指当一个类被实例化的时候就会自动调用的函数。那我们可以在这里初始化变量的值。例如:
class Score { public $chinese; public $english; public $math; public function __construct($chinese=100,$english=99,$math=98) { $this->chinese=$chinese; $this->english=$english; $this->math=$math; } public function show(){ echo "chinese:{$this->chinese},english:{$this->english},math:{$this->math}"; }
这个时候,我们可以实例化一个Score对象出来,接着调用Score类的show方法,例如:
$stu = new Score(); $stu->show();
我们实例化一个对象,没有传值,这个时候打印出来就是
chinese:100,english:99,math:98
2.__destruct 析构函数。顾名思义,他的作用和构造函数是对立的,当对象被销毁时,析构方法会运行,或者明确的说当我们不再使用它时,php会为我们清理掉。
public function __destruct() { echo "我被摧毁了{$this->math}"; }
3.__set ()赋值,给属性赋值,接着用另一个魔术方法__get()来取值
class User { private $name; private $age; /*****__set():赋值****/ function __set($name,$value) { if($name == "age"){ if($value <18){ $this->age = 18; }else{ $this->age = $value; } }else{ $this->$name = $value; } } }
4.__get();取值,当__set()方法给某些属性赋值之后,这时候可以用__get()取赋值之后的任意属性,方法如下:
class User { private $name; private $age; /****__get():取值***/ function __get($name) { if($name == "name"){ return "dog"; }else{ return $this->$name; } } }
5.__isset();判断是否是这个属性;当当前属性被isset()或者empty(),即当某个属性被检验空的方法调用的时候,会触发这个方法
class User { private $name; private $age; public function __isset($name) { echo "{$name}isset被调用了"; } }
调用方法如下:
$user = new User(); $user->name = "房明"; isset($user->name);
6.__unset();销毁这某个属性;
class User { private $name; private $age; function __unset($name) { echo "{$name}被销毁了"; //防止被销毁的时候直接写一个return即可; } }
调用方法如下:
$user = new User(); $user->name = "房明"; unset($user->name);
7.__clone():克隆的时候会调用__clone方法;
class Four { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //克隆的时候会调用__clone方法 public function __clone() { $this->age = 0; } }
调用方法如下:
$four = new Four("zhq",18); $four2 = clone $four; //此时的$four2调用的是__clone方法,所以此时年龄会变为0
8.__call:当类里面没有方法的时候会调用__call方法;
class Four { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //当类里面没有方法的时候会调用__call方法 function __call($name, $arguments) { echo "没有{$name}这个方法,不能这么玩"; } }
调用方法如下:
$four = new Four("zhq",18); $four ->show();//类中没有这个方法,就会调用__call方法
9.__tostring();当echo的时候会调用__toString方法;
class Four
{
public $name;
public $age;
public function __construct($name,$age)
{
$this->name = $name;
$this->age = $age;
}
//当echo的时候会调用__toString方法;
$stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";
return $stu;
}
调用方法如下:
$four = new Four("zhq",18); echo $four;echo 实例化出来的时候,就直接调用tostring方法
10.__autoload:自动加载,当类路径找不到的时候会调用__autoload方法,这个方法很好的解决了需要引用多个include_once的问题;
class Four { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //当echo的时候会调用__toString方法; $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}"; return $stu; }
若在另一个页面调用Four类;不需要再用include_once Four;为了避免代码重复,则有以下方法
function __autoload($name){ $path = $name.".class.php"; include_once $path; }//这个时候不需要引入Four类,这就可以直接实例化一个对象
11.__sleep():当对象被串行化那一瞬间调用这个函数
class Four { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //当对象被串行化那一瞬间 function __sleep() { // TODO: Implement __sleep() method. echo "我要睡着了<br>"; return array(‘name‘,‘age‘); } }
这个时候我们可以将对象进行串行化的时候,就调用了__sleep()方法;
$four = new Four("zhq",18);//将对象进行串行化 $four1=serialize($four);//将文件写入字符串 file_put_contents("score.txt",$four1);
12.__wakeup():将对象进行反串行化的时候调用这个函数
class Four { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //当对象被反串行化那一瞬间 public function __wakeup() { echo "我又回来了<br>"; // TODO: Implement __wakeup() method. } }
这个时候我们可以将对象进行反串行化的时候,就调用了__wakeup()方法;
//读取文件 $four= file_get_contents("score.txt"); $obj = unserialize($four);
目前先记录这些基本的魔术方法,不知道有没有错误,希望大家来指正,虚心学习,积累知识!谢谢,以后还会在增加其他的魔术方法。