PHP面向对象笔记 —— 126 魔术方法__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 '有人克隆人!假冒!
'
; } } $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’);
*/

你可能感兴趣的:(PHP,Object,Oriented,PHP面向对象笔记)