首页> 基础笔记 >PHP基础学习 >面向对象 面向对象
PHP面向对象之魔术方法__set()、__get()、__isset()和__unset()
作者:小萝卜 2019-08-31 【 PHP 面向对象 】 浏览 1146
简介魔术方法:__set(): 用于替代通用的set赋值方法 ,__get(): 用于替代通用的get取值方法,__isset(): 检测对象中成员属性是否存在,__unset(): 销毁对象中成员属性方法
魔术方法:
__set(): 用于替代通用的set赋值方法
__get(): 用于替代通用的get取值方法
__isset(): 检测对象中成员属性是否存在
__unset(): 销毁对象中成员属性方法
注意:
上面四个魔术方法只对类中的私有、受保护成员属性有效。
魔术方法前的修饰符可以是公有、私有,不影响调用。
__set( )方法:
格式 [修饰符] function __set(string $name,mixed $value){ ... }
当我们直接为一个对象中非公有属性赋值时会自动调用此方法,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此方法中。
__get( )方法:
格式:[修饰符] function __get(string $name){ ... }
当我们直接输出一个对象中非公有属性时会自动调用此方法,并将属性名以第一个参数传进去。
<?php
class Person {
//下面是声明人的成员属性,全都使用了private关键字封装
private $name; //此属性被封装
private $sex; //此属性被封装
//声明魔术赋值方法;$propertyName :成员属性名、$propertyValue :成员属性值
private function __set($propertyName, $propertyValue) {
$this->$propertyName = $propertyValue;
}
//声明魔术取值方法;$propertyName :成员属性名
private function __get($propertyName) {
return $this->$propertyName;
}
}
$person1 = new Person( );
$person1->name = “李四”; //自动调用了__set()方法为私有属性name赋值
$person1->sex = “女”; //自动调用了__set()方法为私有属性sex赋值
echo $person1->name; //自动调用魔术方法__get( )获取属性name值
echo $person1->age ; //自动调用魔术方法__get( )获取属性sex值
__isset( )方法:
格式: [修饰符] function __isset(string $name){ ... }
当使用isset()或empty()判断一个对象的私有或受保护的属性是否存在时,会自动调用此方法。参数name表示被判断的属性名。
__unset( )方法:
格式: [修饰符] function __unset(string $name){ ... }
当使用unset( )销毁一个对象的私有或受保护的属性时,自动调用此方法,并将属性名以第一个参数传进去。
<?php
class Person {
private $name; //此属性被封装
private $sex; //此属性被封装
public function __construct($name="", $sex="男") {
$this->name = $name;
$this->sex = $sex;
}
private function __isset($propertyName) { //需要一个参数,是测定的私有属性的名称
return isset($this->$propertyName); //其他的属性都可以被测定,并返回测定的结果
}
private function __unset($propertyName) { //需要一个参数,是要删除的私有属性名称
if($propertyName == "name") //如果参数中传入的属性名等于“name”时条件成立
return; //退出方法,不允许删除对象中的name属性
unset($this->$propertyName); //在对象的内部删除在对象外指定的私有属性
}
}
$person1 = new Person("张三", "男"); //创建一个对象$person1,将成员属性分别赋上初值
var_dump( isset( $person1->name ) ); //输出bool(true),不允许测定name属性
var_dump( isset( $person1->sex ) ); //输出bool(true),存在sex私有属性
var_dump( isset( $person1->id ) ); //输出bool(false),测定对象中不存在id属性
unset( $person1->name ); //删除私有属性name,但在__unset()中不允许删除
unset( $person1->sex ); //删除对象中的私有属性sex,删除成功
很赞哦! (0)
上一篇:PHP面向对象类继承的应用