当前位置: 首页 > 编程笔记 >

PHP __get(),__set(),__isset()和__unset()

包沈义
2023-03-14
本文向大家介绍PHP __get(),__set(),__isset()和__unset(),包括了PHP __get(),__set(),__isset()和__unset()的使用技巧和注意事项,需要的朋友参考一下

示例

每当您尝试从此类中检索某个字段时,如下所示:

$animal = new Animal();
$height = $animal->height;

PHP调用magic方法__get($name),在这种情况下$name等于"height"。像这样编写类字段:

$animal->height = 10;

将调用魔术方法__set($name, $value),$name等于"height"和$value等于10。

PHP还具有两个内置函数isset(),它们检查变量是否存在,而unset()则销毁一个变量。检查是否像这样设置了对象字段:

isset($animal->height);

将__isset($name)在该对象上调用该函数。销毁这样的变量:

unset($animal->height);

将__unset($name)在该对象上调用该函数。

通常,当您不在类上定义这些方法时,PHP只会检索存储在类中的字段。但是,您可以重写这些方法以创建可以像数组一样保存数据但可以像对象一样使用的类:

class Example {
    private $data = [];

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        if (!array_key_exists($name, $this->data)) {
            return null;
        }

        return $this->data[$name];
    }

    public function __isset($name) {
        return isset($this->data[$name]);
    }

    public function __unset($name) {
        unset($this->data[$name]);
    }
}

$example = new Example();

// 将'a'存储在$data数组中,值为15
$example->a = 15;

// 从$data数组中检索数组键'a'
echo $example->a; // 版画15

// 尝试从数组中检索不存在的键将返回null
echo $example->b; // 什么都不打印

// 如果__isset('a')返回true,则调用__unset('a')
if (isset($example->a)) {
    unset($example->a));
}

empty() 功能和魔术方法

请注意,调用empty()类属性将被调用,__isset()因为PHP手册指出:

empty()从本质上讲,它等效于!isset($var)|| $var ==否

 类似资料:
  • 问题内容: 除非我完全误解,否则and 方法应该允许→ 和的重载。 例如,以下语句应调用该方法: 并且以下应使用该方法: 这在我的代码中不起作用,并且可以通过以下简单示例重现: 这只会导致: 在那儿放一些电话表明它根本没打。 现在,我只是说了一下要解决的问题,并在目前需要的地方手动使用它,但这不是很动态,并且需要知道“重载”代码实际上没有被调用,除非专门调用。我想知道这是否不是应该以我所理解的方式

  • 问题内容: 这些是简单的示例,但是假设您的类中的属性多于两个。 什么是最佳做法? a)使用__get和__set b)使用传统的setter和getter 本文内容:http://blog.webspecies.co.uk/2011-05-23/the-new-era-of-php- frameworks.html 作者声称使用魔术方法不是一个好主意: 首先,那时使用PHP的魔术函数(get, c

  • 本文向大家介绍浅谈PHP拦截器之__set()与__get()的理解与使用方法,包括了浅谈PHP拦截器之__set()与__get()的理解与使用方法的使用技巧和注意事项,需要的朋友参考一下 “一般来说,总是把类的属性定义为private,这更符合现实的逻辑。 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及

  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果