一.介绍
首先,魔术方法是类、对象的成员方法,只是魔术方法调用、执行的时机是不需要手动调用,自动调用,就跟变魔术似的,所以称之为魔术方法。
注意:
- PHP内置的魔术方法都是以__(两个下划线开头),所以我们在自定义方法时,避免使用__作为前缀
- 魔术方法是系统自动调用的,程序员不需要手动调用
- 魔术方法通常是成对出现的
二.常用魔术方法:__get、__set
应用场景:
- 当我们访问一个不可访问的属性的时候,会自动调用__get方法,并且会把不可访问的属性名传递到__get方法中
- 当我们给不可访问的属性赋值时,会自动调用__set方法,并且会把属性名、赋的值传递到__set方法中。
不可访问属性的情况:
- 不存在
- private
- protected
<?php
class Beauty
{
public $name = ' 如花';
private $weight = '50KG';
//__get会在我们访问不可访问的属性时自动调用,会自动把属性的名字传进来
public function __get($name) {
echo $name.'不可访问';
}
//__set当我们给不可访问的属性赋值时,会自动调用该方法,并且会把属性名、值传递到当前方法
public funciton __set() {
echo $name.'----'.$value;
}
$beauty = new Beauty();
$beauty->weight;
$beauty->weight = '60KG';
?>
__get和 __set的方法的作用?
首先,一个类为了体现良好的封装性和良好的编程习惯,通常会将重要的、私密的属性使用private约束,这样,不可以在类外访问,但是在实际开发的时候,有时候又会频繁的对属性进行操作,所以就提供了__set __get方法允许在类的外面操作类里面的私有的属性。
总结:__set和__get完全是一种良好的编程习惯,将重要的、私密的属性设置为私有的(private),如果将来又需要在类的外面访问了,只需要提供__get __set方法即可。
<?php
public $name = '如花';
private $weight = '50KG';
private $salary = '3w';
public function __get($name) {
if (property_exists($this, $name)) {
return $this -> $name;
} else {
return &name.'属性不存在';
}
}
public function __set(&name, $value) {
if (property_exitsts($this, $name)) {
$this->$name = $value;
} else {
echo &name.'属性不存在';
}
}
$beauty = new Beauty();
echo $beauty ->weight;
echo $beauty ->salary;
echo $beauty ->wrong;
$beauty -> salary = '5w';
echo $beauty ->salary;
?>
三.魔术方法之:__isset、__unset
应用场景:
- __isset,当程序员在类的外面执行isset或empty判断对象的不可访问的属性是否存在时,会自动调用__isset()方法。
- __unset,当程序员在类的外面执行(unset删除对象的不可访问的属性时),会自动调用__unset方法。
<?php
class Car
{
public $price = '200w';
public $brand = '布加迪';
public $speed = '450迈';
private $owner = 'samson';
//当在类的外面判断这个类的不可访问的属性是否存在时,自动执行
public function __isset ($name) {
if (property_exists($this, $name)) {
return true;
} else {
return false;
}
}
public function __unset($name) {
if (property_exists($this, $name)) {
unset($this->$name);
} else {
echo '属性不存在';
}
}
$car = new Car();
unset($set -> owner);
var_dump($car);
}
?>