PHP 魔术方法 - __isset()

在我们讨论 __issset() 魔术方法之前,我们先来讨论下 isset() 方法。 isset() 方法主要用于判断一个变量或实例的一个属性是否定义。

如果变量或实例的属性不存在,或被赋值为 NULL,就会返回 false,其它情况下一律返回 true,哪怕被赋值为 false0''

isset() 通常用于判断某个变量是否设置,当然,也可以在实例的外部判断实例的某个属性是否设置,这通常有两个场景

  1. 如果参数是一个公开 ( public ) 的属性,那么可以直接使用 isset() 来判断该属性是否设置
  2. 如果参数是一个私有 ( private ) 的属性,那么 isset() 就不能正常工作了

那么对于私有的属性,我们就判断它是否设置了吗 ?

当然不是,只要我们在类中定义了魔术方法 __isset() ,那么就可以在实例的外部使用 isset() 方法来判断某个私有属性是否设置

魔术方法 __isset()

只要一个类定义了 __isset() 魔术方法,我们就可以使用 isset() 来判断类的实例的某个私有属性是否 「 设置 」

这个 「 设置 」 我们加了中文竖括号,原因是 __isset() 内部判断是否设置的标准可以不是 NULL。也就是说

「 只要 __isset() 方法返回 true ,那么 isset() 方法就返回 true,反之,则返回 false

当定义了 __isset() 魔术方法后,只要使用 isset() 方法实例的私有属性或不存在的属性,都会自动调用 __isset() 魔术方法

该方法的原型如下

public bool function __isset( $propertyName ) 
{
    // 其它代码
}

该方法接收一个且只有一个参数,那就是要判断的属性名,而返回值为一个 bool 类型

范例

下面的代码,我们故意设置 $name 变量为公开可见的,$age 变量默认为 private 的,且忽略定义 $sex 变量,然后我们看看 __isset() 方法的返回值

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

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

    /**
     * @param $content
     *
     * @return bool
     */
    public function __isset($property) {
        echo "{$property} 属性是私有的或为定义, __isset() 方法会被自动调用\n";
        return isset($this->$property);
    }
}

$person = new Person("Yufei", 25); // Initially assigned.

var_dump(isset($person->name));
echo "\n\n";

var_dump(isset($person->age));
echo "\n\n";

var_dump(isset($person->sex));
echo "\n\n";

var_dump(isset($person->phone));
echo "\n\n";

输出结果如下

[yufei@localhost php]$ php demo.php 
bool(true)


age 属性是私有的或为定义, __isset() 方法会被自动调用
bool(true)


sex 属性是私有的或为定义, __isset() 方法会被自动调用
bool(false)


phone 属性是私有的或为定义, __isset() 方法会被自动调用
bool(false)
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.