当前位置: 首页 > 面试题库 >

PHP __get和__set魔术方法

夔博
2023-03-14
问题内容

除非我完全误解,否则__getand __set方法应该允许→ get和的重载set

例如,以下语句应调用该__get方法:

echo $foo->bar;
$var = $foo->bar;

并且以下应使用该__set方法:

$foo->bar = 'test';

这在我的代码中不起作用,并且可以通过以下简单示例重现:

class foo {

    public $bar;
    public function __get($name) {

        echo "Get:$name";
        return $this->$name;
    }

    public function __set($name, $value) {

        echo "Set:$name to $value";
        $this->$name = $value;
    }
}


$foo = new foo();

echo $foo->bar;
$foo->bar = 'test';

echo "[$foo->bar]";

这只会导致:

[test]

die()在那儿放一些电话表明它根本没打。

现在,我只是说了一下要解决的问题,并__get在目前需要的地方手动使用它,但这不是很动态,并且需要知道“重载”代码实际上没有被调用,除非专门调用。我想知道这是否不是应该以我所理解的方式起作用,或者是为什么它不起作用。

正在运行php 5.3.3


问题答案:

__get__set__call__callStatic当该方法或属性是不可访问的被调用。您$bar是公开的,因此并非无法访问。

  • __set() 将数据写入不可访问的属性时运行。
  • __get() 用于从无法访问的属性读取数据。

魔术方法不能替代吸气剂和吸气剂。它们只允许您处理方法调用或属性访问,否则将导致错误。因此,还有更多与错误处理有关的内容。还要注意,它们比使用正确的getter和setter或直接方法调用要慢得多。



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

  • Python 中有很多 __ 开始和结尾的特殊方法,它们多是所有类型都拥有的,通过实现这些 特殊方法可以实现很多有意思的功能,比如最常使用的 __str__、__repr__ 和 __unicode__ 这三个就可以用于输出对象的字符串结果。 GitHub 上有篇翻译不错: 翻译 原文 魔术方法与语法糖 Lisp 的语法极其简单,主要语法“S 表达式”非常接近于数学中的波兰表达式,写法如下: (+

  • 考虑以下令人厌恶的类别: 然后,可以通过 lst调用map(,lst),即 但是,添加并不那么合作: 这种陌生感可以通过直接调用魔法方法来解决: 所以我的问题是,是什么给了我们?直接分配<code>__add_

  • 本文向大家介绍php 魔术方法详解,包括了php 魔术方法详解的使用技巧和注意事项,需要的朋友参考一下 从PHP 5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。PHP 将所有以 _ _(两个下划线)开头的类方法保留为魔术方法。 __toString() 和__invoke()

  • 1.13.1 魔术方法: 在Python中的面向对象中有很多魔术方法如: __init__: 构造函数,在生成对象时调用 __del__: 析构函数,释放对象时使用 __str__: 使用print(对象)或者str(对象)的时候触发 __repr__: 在使用repr(对象)的时候触发 __setitem__ : 按照索引赋值:每当属性被赋值的时候都会调用该方法:self._

  • 所以我试图摆脱我主要方法中的两个神奇数字。我试着让它们成为静态字段,但我只是得到了一个不同的checkstyle错误。我正在寻找一种方法,使我的主要方法完全符合checkstyle。 这些是我得到的检查风格错误: '2000'是个神奇的数字 “262”是一个神奇的数字 以下是我将其设置为静态字段时出现的checkstyle错误: 名称“Twoou”必须与模式“^[A-Z][A-Z0-9]*([A-