// ===笔记部分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 '有人克隆人!假冒!
';
}
}
$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,'属性','
';
}
}
$lily = new Human2();
echo $lily->name; //lily
echo '
';
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 ''
;
$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,'属性','
';
echo '且值是',$b,'
';
}
}
echo '
';
$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,'属性存不存在
';
return 1;
}
}
$hua = new Dog();
if(isset($hua->leg)) {
echo $hua->leg,'
';
}
if(isset($hua->tail)) {
echo '有tail属性
';
} else {
echo '没有tail属性
';
} // 有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,'?!
';
}
}
$hua = new Cat();
echo '__unset测试
';
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’);
*/