/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
<?php
/***************************************************************************************
时间:2012年11月13日 20:07:42
内容:魔术方法
是指在某些情况些,会自动执行的方法,叫魔术方法
详解:
__construct()
__destruct()
__clone()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
***************************************************************************************/
header("content-type:text/html; charset=utf-8");
//__clone 例子
class Human{
public $age=22;
public function __clone(){
echo '有人克隆我!假冒 <br />';
}
}
$lisi=new Human();
$zhangsan=clone $lisi;
/*
总结:__clone()的作用
当clone的时候调用
*/
//__get 例子
class Human{
public $name='覃唐弢';
protected $age=21;
private $money='1.2w';
public function __get($property){
echo '你想访问我的',$property,'属性 ^_^<br />';
}
}
$lisi=new Human();
echo $lisi->name,'<br />';
echo $lisi->age; //你想访问我的age属性 ^_^
echo $lisi->money; //你想访问我的money属性 ^_^
echo $lisi->friend; //没有次属性 ->你想访问我的friend属性 ^_^
/*
总结:__get()的作用
当我们调用一个权限上不允许调用的属性
或不存在的属性时 调用
__get魔术方法会自动调用
并且自动传参,参数值是属性名
*/
//__set 例子
class Human{
public $name='覃唐弢';
protected $age=21;
private $money='1.2w';
public function __set($key, $value){
echo '你想设置属性:',$key,' 且值是:',$value,' ^_^<br />';
}
}
$lisi=new Human();
$lisi->friend='itao'; //不存在的属性:你想设置属性:friend 且值是:itao ^_^
$lisi->name='my';
$lisi->age=22; //修改存在的protected属性值:你想设置属性:age 且值是:22 ^_^
$lisi->money='1.4w'; //修改存在的private属性值:你想设置属性:money 且值是:1.4w ^_^
/*
总结:__set()的作用
当为无权限操作的属性赋值时
或不存在的属性赋值时
__set()自动调用
且自动传2个参数 属性 属性值
*/
//__isset 例子
class Dog{
public $leg = 4;
public function __isset($p){
echo '你想判断我的',$p,'属性是否存在<br />';
}
}
$hu = new Dog();
if(isset($hu->leg)){
echo $hu->leg,'<br />';
}
if(isset($hu->tail)){
echo $hu->tail;
}else{
echo '没有tail <br />';
}
/*
总结: __isset()的作用
当isset() 判断对象不可见的属性是(protected/private/不存在的属性)
会引起__isset()执行
问:isset($obj->aa)属性,为真,能说明 类声明了一个aa属性吗?
答:不能
*/
//unset 例子
class Dog{
public $leg = 4;
protected $bone='骨头';
public function __unset($property){
echo '你想去掉我的',$property,'<br />';
}
}
$dog = new Dog();
echo $dog->leg,'<br />';
print_r($dog); echo '<br />';
unset($dog->leg);
print_r($dog); echo '<br />';
unset($dog->bone); //你想去掉我的bone
/*
总结: __unset
当用unset 销毁对象的不可见对象时
会执行 __unset
*/
//__call _callStatic例子
class Human{
public function hello(){
echo 'hello........<br />';
}
protected function a(){
echo 'a.......<br />';
}
private function t(){
echo 't.....<br />';
}
//php5.3
public static function __callStatic($method,$arguments){
echo '有对象想调用不可见或不存在静态',$method,'方法<br />';
echo '还传了参数<br />';
print_r($arguments);
}
public function __call($method, $arguments){
echo '有对象想调用不可见或不存在的',$method,'方法<br />';
echo '还传了参数<br />';
print_r($arguments);
}
}
$lisi = new Human();
$lisi->hello();
$lisi->a();
$lisi->say(1);
//调用一个未定义的方法
//Fatal error: Call to undefined method Human::say()
Human::cry('痛哭','嚎哭','鬼哭');
/*
总结:__call
当调用 不可见或不存在(protected/private/不存在的属性)
的方法时,自动调用
__call 会传入两个参数:
第一个参数:方法名$method
第二个参数:参数 $arguments[array]
总结:__callStatic
当调用 不可见或不存在(protected/private/不存在的属性)
的[静态方法]时,自动调用
__callStatic 会传入两个参数:
第一个参数:方法名$method
第二个参数:参数 $arguments[array]
__callStatic 是php5.3新增的魔术方法
*/