如何使用魔术方法(__get 和 __set)访问多个属性?

2023-12-29

我最近研究了魔法方法,__get and __set,并且想知道如何在类中实际设置和获取多个属性。

我知道它仅适用于一个变量或数组,但我不确定是否可以访问多个变量。

有谁可以向我解释一下吗?

class myMagic2 {
    public $data;
    public $name;
    public $age;

    public function __set($item, $value) {
        $this->item = $value;
    }

    public function __get($item){
        return $this->item;
    }
}

有没有办法访问所有变量($data, $name, $age)?


当我从事项目工作时,我总是有这些方法:

public function __set($name, $value) 
{
    //see if there exists a extra setter method: setName()
    $method = 'set' . ucfirst($name);
    if(!method_exists($this, $method))
    {
        //if there is no setter, receive all public/protected vars and set the correct one if found
        $vars = $this->vars;
        if(array_search("_" . $name, $vars) !== FALSE)
            $this->{"_" . $name} = $value;
    } else
        $this->$method($value); //call the setter with the value
}

public function __get($name) 
{
    //see if there is an extra getter method: getName()
    $method = 'get' . ucfirst($name);
    if(!method_exists($this, $method)) 
    {
        //if there is no getter, receive all public/protected vars and return the correct one if found
        $vars = $this->vars;
        if(array_search("_" . $name, $vars) !== FALSE)
            return $this->{"_" . $name};
    } else
        return $this->$method(); //call the getter
    return null;
}

public function getVars()
{
    if(!$this->_vars)
    {
        $reflect = new ReflectionClass($this);
        $this->_vars = array();
        foreach($reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED) as $var)
        {
            $this->_vars[] = $var->name;
        }
    }
    return $this->_vars;
}

因此,如果我想在写入/返回之前操作它们,我可以自由地为属性创建额外的 setter/getter。如果属性不存在 setter/getter,它将回退到属性本身。使用 getVars() 方法,您可以从类中接收所有公共和受保护的属性。

我的类属性总是用下划线定义,因此您可能应该更改它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用魔术方法(__get 和 __set)访问多个属性? 的相关文章

随机推荐

  • 如何在 JavaScript 中迭代数组并删除元素[重复]

    这个问题在这里已经有答案了 我有一个元素数组 需要从中删除某些元素 问题是 JavaScript 似乎没有 foreach 循环 如果我使用 for 循环 我会遇到问题 它基本上试图检查超出数组边界的元素 或者由于索引更改而丢失数组中的元素
  • Python 将对象列表序列化为 JSON [重复]

    这个问题在这里已经有答案了 我正在尝试序列化为 JSON dict 一个对象的实例 工作正常 直到我将对象附加到第一个对象的实例属性之一 from json import dumps class A object def init self
  • 将 Spring Boot 应用程序部署到 Elastic Beanstalk 时出现 502 Bad Gateway

    免责声明 我知道对此有很多问题 我已经查看了它们并应用了答案 但它仍然不起作用 我使用 jar 不是 war 文件将 Spring Boot 应用程序部署到 Elastic Beanstalk 我正在使用Java 1 8 我将 applic
  • yii2 - 模型加载函数未设置某些模型属性

    我正在开发 PHP Yii2 应用程序 我在 yii2 上遇到了一个奇怪的问题yii base Model load功能 这是我的问题 我有一个名为的表单模型PaymentIncreaseBalanceForm像下面这样 class Pay
  • 如何获得 Elm 风格

    我从 Elm 开始 当你想设置样式时 你可以简单地将它嵌入到你的组件中 Html Attribute style List String String 但我找不到办法get样式而不是设置 其实我需要的是line height特定的 CSS
  • Vue SSR 将 Express 服务器与 vue 应用程序捆绑在一起,以便可以从复制到主机服务器的 build dist 文件夹运行该应用程序

    我创建了一个 Vue SSR 应用程序 我读过的所有说明 wiki 博客仅告诉您如何在开发环境中运行该应用程序 他们不会告诉您如何在生产环境中运行应用程序 我之前在 React SSR 应用程序中编写过相同的应用程序 在该应用程序中 构建会
  • 使用 OpenAL 在 iOS 上离线录音

    我正在使用 openAL 以特定的时间间隔播放声音样本 我想将其导出到文件 无论是 caf 或 aac 或其他文件 如何使用 OpenAL 做到这一点 而不需要通过扬声器 耳机实时播放我的样本 如果您正在谈论将乐谱导出为完整的音频片段 Op
  • 如何在 ajax 调用完成之前阻止页面导航

    因此 我有一个 ajax 调用来获取几十个大小为几兆字节的数据块 然后通过 html5 文件系统 api 将数据存储在本地 我想阻止用户在 ajax 调用完成之前离开页面 我决定探索onbeforeunload事件 让它通知用户应该停留在页
  • 如何在 Android 手机中使用语音识别而不出现烦人的对话框

    不修改android API 可以实现吗 我找到了一篇关于此的文章 有人评论说我应该对 android API 进行修改 但没有说如何修改 有人可以给我一些关于如何做到这一点的建议吗 谢谢 我找到了这篇文章 语音识别器 https stac
  • 对“Class::Class()”的未定义引用

    我正在编写一个GTKmm窗口程序 主窗口创建两个按钮 一个用于英语 一个用于中文 用户可以单击该按钮以显示适当语言的不同窗口 目前 我在初始化主窗口内的多项目容器时遇到问题 它是一个MainWindowPane类型的对象 它继承了Gtk H
  • 更新 npm start 后 Angular cli 出现错误

    我使用 Angular cli 创建应用程序并使用后端代理来处理后端并使用聚合物 vaadin 它可以正常工作 直到我更新到 Angular cli 1 0 0 beta 22 它给出错误 Tried to find bootstrap c
  • System.IO.File.ReadAllText 不会因无效编码而引发异常

    我的文件中有一些 UTF 8 文本utf8 txt 该文件包含一些 ASCII 范围之外的字符 我尝试了以下代码 var fname utf8 txt var enc Encoding GetEncoding ISO 8859 1 Enco
  • 如何查看android中真实连接的互联网?

    我做了一个程序 我必须使用wifi来连接互联网 我找了一些资料来检查wifi是否连接 但在某些情况下 你可以连接wifi AP 但仍然无法上网 比如wifi需要账号和密码进行https认证 或者wifi AP无法上网 那么 如何查看真实的互
  • jQuery fadeIn 和 fadeOut - 交换 div

    总的来说 我对 jQuery 和 javascript 很陌生 但感谢这些网站 我才得以顺利通过 我有一个页面 其中有六个隐藏的 div 通过带有各个 id 的相应链接进行调用 当每个 div 变得可见 fadeIn 时 当前显示的 div
  • 如何本地化 Info.plist 文件中 CFBundleDisplayName 的值?

    当我查看 Xcode 中的 Info plist 文件时 属性列表编辑器向我显示一个看起来像变量的值 PRODUCT NAME 如何 在哪里为我的应用程序设置本地化名称 您可以创建一个名为 InfoPlist strings 的本地化文件
  • 自定义 Jackson 解组行为

    我正在使用 Jackson fastxml 来解组 JSON 在我的对象中有两种属性 输入属性和计算属性 在输入 JSON 中 我仅获得输入值 计算值实际上取决于输入值 我必须在引用对象之前填充这些值 所以我只是检查杰克逊是否提供了任何钩子
  • 是从 Sencha Touch 2 开始比较好,还是从 Sencha Touch 1.x 开始比较好?

    我最近使用 PhoneGap 构建了一个演示应用程序 并选择尝试使用 JQuery Mobile 作为 UI 框架 这是 好吧 我现在想尝试一下 Sencha Touch 看看我是否更喜欢它 截至目前 2011 年 12 月中旬 Sench
  • 绕过 Grails 视图层直接将二进制内容写入客户端

    以下操作旨在写入二进制内容bytes完全绕过 Grails 视图层直接到客户端 def actionName byte bytes ServletOutputStream out response getOutputStream out w
  • CUDA:如何将 3D 阵列从主机复制到设备?

    我想了解如何将 3 维数组从主机内存复制到设备内存 假设我有一个包含数据的 3d 数组 例如 int host data 256 256 256 我想以这种方式将该数据复制到 dev data 设备数组 host data x y z de
  • 如何使用魔术方法(__get 和 __set)访问多个属性?

    我最近研究了魔法方法 get and set 并且想知道如何在类中实际设置和获取多个属性 我知道它仅适用于一个变量或数组 但我不确定是否可以访问多个变量 有谁可以向我解释一下吗 class myMagic2 public data publ