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

原创 2018年04月16日 23:56:55

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

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

php面向对象之-魔术方法__set__get__unset__isset的使用-126

//01.php /**** 燕十八 公益PHP讲堂 论 坛: http://www.zixue.it 微 博: http://weibo.com/Yshiba YY频道: 883540...
  • jasonkent27
  • jasonkent27
  • 2014-08-18 21:55:50
  • 302

面向对象之魔术方法__get()和__set()

__get()方法:这个方法用来获取私有成员和保护成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是...
  • pan_xi_yi
  • pan_xi_yi
  • 2016-05-13 08:47:44
  • 1720

Php面向对象魔术方法总结

__construct($argv1,$argv2,…) 功能:类的构造方法,作用是初始化对象 参数:任意多个,任意类型 返回值:无 __destruct() 功能:类的析构方法,对象被销毁...
  • zwt90
  • zwt90
  • 2011-11-11 15:19:39
  • 1727

PHP之面向对象的魔术方法

PHP中以两个下划线"__"开头的方法被称为魔术方法。如__construct()、__destruct()、__clone()。 1、__set()和__get()方法对私有成员进行赋值或者获取值...
  • weyla
  • weyla
  • 2015-04-04 10:32:38
  • 585

PHP 魔术方法之__set__get__unset__isset

  • binghui1990
  • binghui1990
  • 2013-06-16 10:03:44
  • 9107

整理Java面向对象编程的笔记

第三章:数据类型和变量 基本数据类型 数据类型 在内存占用字节数 默认值 boolean 占1个字节 flase byte 占1个字节 0 short 占2个字节 0 int 占4个字节 0 lon...
  • laochidao
  • laochidao
  • 2016-09-12 22:45:54
  • 759

PHP面向对象_自动加载类__autoload()

在设计面向对象的程序开发时,通常为每个类的定义都单独建立一个PHP源文件。当你尝试使用一个未定义的类时,PHP会报一个致命错误...
  • Yeoman92
  • Yeoman92
  • 2016-10-16 20:38:00
  • 899

PHP中的常见魔术方法功能作用及用法实例

概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利。PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发。这篇文章简单...
  • a2534725767
  • a2534725767
  • 2017-02-15 12:57:30
  • 5499

PHP 魔术方法之"__set()"和"__get"

__set()方法: 这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。 这个方法同样不用我们手工去调用,它也可以做成私有...
  • u013372487
  • u013372487
  • 2015-07-02 10:36:29
  • 438

总结2: PHP中的魔术方法及其应用场景

PHP中有一类特别的系统方法,它们统一以__开头,使用语义清晰简单,这类形式特殊、作用特殊的方法被称为魔术方法。常见的魔术方法有__construct()、__destruct()、__call()、...
  • hyh1123176978
  • hyh1123176978
  • 2016-11-11 18:18:06
  • 483
收藏助手
不良信息举报
您举报文章:PHP面向对象笔记 —— 126 魔术方法__set__get__unset__isset讲解
举报原因:
原因补充:

(最多只允许输入30个字)