九.魔术方法

本文介绍了PHP的魔术方法,它是类、对象的成员方法,自动调用。PHP内置魔术方法以两个下划线开头,通常成对出现。还阐述了常用魔术方法__get、__set、__isset、__unset的应用场景,如__get和__set可在类外操作私有属性,体现良好编程习惯。

一.介绍

          首先,魔术方法是类、对象的成员方法,只是魔术方法调用、执行的时机是不需要手动调用,自动调用,就跟变魔术似的,所以称之为魔术方法。

注意:

  • PHP内置的魔术方法都是以__(两个下划线开头),所以我们在自定义方法时,避免使用__作为前缀
  • 魔术方法是系统自动调用的,程序员不需要手动调用
  • 魔术方法通常是成对出现的

二.常用魔术方法__get、__set

应用场景:

  • 当我们访问一个不可访问的属性的时候,会自动调用__get方法,并且会把不可访问的属性名传递到__get方法中
  • 当我们给不可访问的属性赋值时,会自动调用__set方法,并且会把属性名、赋的值传递到__set方法中。

不可访问属性的情况:

  1. 不存在
  2. private
  3. 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);
}



?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值