PHP面向对象 —— 20 魔术方法__set__get__unset__isset讲解

// =笔记部分1=

/*
魔术方法:
是指某些情况下,会自动调用的方法.

PHP面向对象中,有这些魔术方法:
__construct()
__destruct()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
__sleep()
__wakeup()
__toString()
__invoke()
__set_state()
__clone()
__debugInfo()
等方法在 PHP 中被称为"魔术方法"(Magic methods)
在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能.
*/


// === 代码部分__clone === //

class Human {
	public $age = 22;
	
	public function __clone() {
		echo '有人克隆人!假冒!<br >';
	}
}

$lisi = new Human();

$zhangsan = clone $lisi;


// === 代码部分__get === //

/*
class Human2 {
	private $money = '30两';
	protected $age = 23;
	public $name = 'lily';
}

$lily = new Human2();
echo $lily->name;

echo $lily->age; //权限错误
*/

class Human2 {
	private $money = '30两';
	protected $age = 23;
	public $name = 'lily';
	
	public function __get($p) {
		echo '你想访问我的',$p,'属性','<br >';
	}
}

$lily = new Human2();
echo $lily->name; //lily
echo '<br >';


echo $lily->age; //你想访问我的age属性

echo $lily->money; //你想访问我的money属性

//在类中我们没定义friend属性,但也能get出来
echo $lily->friend; //你想访问我的friend属性


// =笔记部分2=

/*
可以总结出:

当我们调用一个权限上不允许调用的属性时,和不存在的属性时,
__get魔术方法会自动调用,
并且自动传参,参数值是<属性名>.

流程:
$lily->age — 无权 — __get(age);
$lily->friend — 没有此属性 — __get(‘friend’);
*/


// === 代码部分__set === //

echo '<pre>';

$lily->aaa = 111;
$lily->bbb = 222;

print_r($lily);
/*
Human2 Object
(
    [money:Human2:private] => 30两
    [age:protected] => 23
    [name] => lily
    [aaa] => 111
    [bbb] => 222
)

直接就加上了两个属性.
*/


// =如何阻止属性随意被添加导致对象属性过多= //

class Stu {
	private $money = '30两';
	protected $age = 23;
	public $name = 'Hum';
	
	public function __set($a,$b) {
		echo '你想设置我的',$a,'属性','<br >';
		echo '且值是',$b,'<br >';
	}
}

echo '<hr >';

$hum = new Stu();
$hum->aaa = 111; //你想设置我的aaa属性且值是111
print_r($hum); 
/*
Stu Object
(
    [money:Stu:private] => 30两
    [age:protected] => 23
    [name] => Hum
)

属性无任何变化
*/


$hum->money = '40两';
$hun->age = '28';
$hum->name = 'HanMM';
print_r($hum);
/*
Stu Object
(
    [money:Stu:private] => 30两
    [age:protected] => 23
    [name] => HanMM
)

name属性是public的,所以可以被改变
age是被保护的,money是私有的,无法改变
*/


// =笔记部分3=

/*
总结: __set的作用

当为无权操作的属性赋值时,
或不存在的属性赋值时,
__set自动调用

且自动传两个参数 属性 属性值

$hum->age = 28 — 无权 — __set(‘age’,28);
*/


// === 代码部分__isset === //

class Dog {
	public $leg = 4;
	
	public function __isset($p) {
		echo '你想判断我的',$p,'属性存不存在<br >';
		
		return 1;
	}
}

$hua = new Dog();

if(isset($hua->leg)) {
	echo $hua->leg,'<br >';
}

if(isset($hua->tail)) {
	echo '有tail属性<br >';
} else {
	echo '没有tail属性<br >';
} // 有tail属性

/*
在__isset函数中return了一个1,返回真
结果isset判断有tail属性
*/


// =笔记部分4=

/*
总结: __isset的作用

当isset() 判断对象不可见的属性时(protected/private/不存在的属性)
会引发 __isset()来执行

但是isset($object->xyz)属性,为真
不能说明 类声明了一个xyz属性!!
*/


// === 代码部分__unset === //

class Cat {
	public $leg = 4;
	protected $bone = '猪腿骨';
	
	public function __unset($p) {
		echo '',$p,'?!<br >';
	}
}

$hua = new Cat();

echo '__unset测试<br >';
print_r($hua);
unset($hua->leg);
print_r($hua); //leg属性消失


//不存在的属性
unset($hua->tail); //tail?!
//被保护的属性
unset($hua->bone); //bone?!
print_r($hua);


// =笔记部分5=

/*
__unset()总结

当用unset 销毁对象的不可见属性时,
会引发 __unset();

unset($hua->tail) —没有tail属性— __unset(‘tail’);
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟敛寒林o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值