PHP之十六个魔术方法详细介绍

2019-05-02 17:33:52王旭

姓名:小明
年龄:50

六、 __set(),设置一个类的成员变量时调用

__set() 的作用:

__set( $property, $value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

请看下面的演示代码:

<?php
class Person
{
  private $name;
  private $age;

  public function __construct($name="", $age=25)
  {
    $this->name = $name;
    $this->age = $age;
  }

  /**
   * 声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值
   * @param $property
   * @param $value
   */
  public function __set($property, $value) {
    if ($property=="age")
    {
      if ($value > 150 || $value < 0) {
        return;
      }
    }
    $this->$property = $value;
  }

  /**
   * 在类中声明说话的方法,将所有的私有属性说出
   */
  public function say(){
    echo "我叫".$this->name.",今年".$this->age."岁了";
  }
}

$Person=new Person("小明", 25); //注意,初始值将被下面所改变
//自动调用了__set()函数,将属性名name传给第一个参数,将属性值”李四”传给第二个参数
$Person->name = "小红";   //赋值成功。如果没有__set(),则出错。
//自动调用了__set()函数,将属性名age传给第一个参数,将属性值26传给第二个参数
$Person->age = 16; //赋值成功
$Person->age = 160; //160是一个非法值,赋值失效
$Person->say(); //输出:我叫小红,今年16岁了

运行结果:

我叫小红,今年16岁了

七、 __isset(),当对不可访问属性调用isset()或empty()时调用

在看这个方法之前我们看一下isset()函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。

那么如果在一个对象外面使用isset()这个函数去测定对象里面的成员是否被设定可不可以用它呢?

分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。你只要在类里面加上一个__isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的__isset()方法了帮我们完成这样的操作。

__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

请看下面代码演示:

<?php
class Person
{
  public $sex;
  private $name;
  private $age;

  public function __construct($name="", $age=25, $sex='男')
  {
    $this->name = $name;
    $this->age = $age;
    $this->sex = $sex;
  }

  /**
   * @param $content
   *
   * @return bool
   */
  public function __isset($content) {
    echo "当在类外部使用isset()函数测定私有成员{$content}时,自动调用<br>";
    echo isset($this->$content);
  }
}

$person = new Person("小明", 25); // 初始赋值
echo isset($person->sex),"<br>";
echo isset($person->name),"<br>";
echo isset($person->age),"<br>";

								 
			 
相关文章 大家在看