PHP面向对象笔记 —— 126 魔术方法__set__get__unset__isset讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dyw_666666/article/details/79968726

// ===笔记部分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’);
*/

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页