魔术方法(__get,__set)在扩展类中不起作用? [复制]

2024-01-04

<?php 

abstract class AbstractClass
{
    public function __get($theName)
    {
        return (isset($this->$theName)) ? $this->$theName : NULL;
    }

    public function __set($theName, $theValue)
    {
        if (false === property_exists(get_class(), $theName)) {
            throw new Exception(get_class()." does not have '".$theName."' property.");
        } else {
            $this->$theName = $theValue;
        }
    }
}

class ConcreteClass extends AbstractClass
{
        private $x;
        private $y;

        public function __construct($theX, $theY)
        {
            $this->x = $theX;
            $this->y = $theY;
        }
}

$concreteClass = new ConcreteClass(10, 20);

var_dump( $concreteClass->x );

有什么方法可以完成这项工作,还是我必须将这些神奇方法添加到扩展类中?


这会起作用:

public function __get($theName)
{
    if(property_exists($this, $theName)) {
        $reflection = new ReflectionProperty($this, $theName);
        $reflection->setAccessible($theName);
        return $reflection->getValue($this);
    }
}

IMO,你不应该使用__get and __set作为 getter 和 setter 的替代品。由于它们在尝试访问不可访问的属性时被触发,因此它们与错误处理更相关。而且它们也比常规的 getter 或 setter 慢得多。

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

魔术方法(__get,__set)在扩展类中不起作用? [复制] 的相关文章

随机推荐

  • Amazon Lex AWS Lambda 挂钩的 Jackson JSON 反序列化

    我在 AWS Lex Lambda 挂钩中实现反序列化时遇到问题 我有一个 AWS Lambda 函数来验证用户输入 但我不断收到 JSONMapping 错误 Lex json 是这样的 currentIntent name intent
  • 为什么 iPhone iOS 显示 momentjs 的无效日期

    我有一个日期选择器 它返回一个始终位于 UTC 时区的时刻对象 我需要在这个日期做一些逻辑 但总是希望它在用户本地时区 所以我做了以下操作 strip submission date of timezone offset let submi
  • PIL:无法保存粘贴有png的jpg

    我正在尝试将 png 粘贴到 jpg 上 这是代码 usr bin env python3 from PIL import Image from PIL import ImageDraw im Image open existing jpg
  • 如何获取该月的第几天?

    我正在尝试检索现在是该月的哪一天 比如今天是2011年8月29日 我想做的只是获取天数 例如 29 或 30 这是该月的哪一天 我该怎么做呢 您需要获取一个 Calendar 实例并获取它是一个月中的哪一天 Calendar cal Cal
  • 从 ui 中删除 QComboBox 中的项目

    我正在尝试调整 QComboBox 的 ui 以便用户可以从下拉列表中删除项目 无需先选择它们 背景是我正在使用 QComboBox 来指示当前打开的是哪个数据文件 我还使用它作为最近打开的文件的缓存 我希望用户能够删除他不想再列出的条目
  • Backbone.js 中的 PATCH 请求方法

    正确的执行方式是什么PATCH在 Backbone js 中保存模型属性时请求 从 Backbone js v0 9 9 开始 您可以简单地通过 patch true to save 阅读更多 http backbonejs org cha
  • C++ 函数成员指针

    我已经阅读了几篇关于此的文章 但似乎无法通过示例代码准确找到我正在寻找的内容 如果有人能给我一些帮助 我将非常感激 在我的标题中我有 void addEvent void func Pack void triggerEvents Pack
  • 将小数格式化为正确的区域性信息中的字符串

    将小数金额格式化为字符串以便 UI 以正确的区域性信息显示的最佳方法是什么 向 ToString 添加格式 myDecimal ToString 00 or myDecimal ToString C 对于可为空的小数 decimal 您将需
  • 为什么 CMake 找不到 GTest(Google 测试)?

    有一个现成的项目 在其中一个 cmake 文件中有一个源代码 find package GTest REQUIRED if NOT GTest FOUND message FATAL ERROR Cannot find Google Tes
  • CKAN可以支持Solr 7.0吗?

    我正在尝试在 Ubuntu 16 04 中安装 Solr 7 0 和 CKAN 2 7 2 但是 我得到了以下内容errors 来自 Solr 管理网站 ckan org apache solr common SolrException o
  • 查找图中的最长路径

    我一直在努力找出复杂网络中最长的路径 我在 StackOverflow 和 Internet 上遇到了很多问题 但没有一个可以帮助我 我写了一个 CQL 作为 start n node match p n LinkTo 1 gt m wit
  • Lucene SpanNearQuery 中“Slop”的确切含义(或 ElasticSearch span_near 中的 slop)

    问题一 问题一
  • 如何判断 CSS 背景图像何时加载?事件被触发了吗? [复制]

    这个问题在这里已经有答案了 我有一个带有图像背景的侧边栏小部件 上面是一个搜索输入表单 我不希望在图像加载之前显示输入 有没有办法附加一个load像普通 img 元素 对象一样 CSS 背景图像的事件处理程序 我知道这可以在普通图像上完成
  • 嵌套循环和字符串连接的性能问题

    有人可以解释一下为什么这段代码需要这么长时间才能运行 即 gt 24 小时 行数为 5000 列数为 2000 即大约 10m 循环 有一个更好的方法吗 for int i 0 i lt m rows i for int j 0 j lt
  • 使用 Akka Stream 传输巨大的 json

    我有一个 json 板的巨大 http 响应问题 其中只有部分是感兴趣的 我无法更改响应结构 这是一个例子 searchString search redirectUrl 0 numRecords 123 refinementViewMod
  • 由多个用户编辑数据库记录

    我设计了数据库表 标准化 在 MS SQL 服务器上 并为应用程序创建了一个独立的 Windows 前端 少数用户将使用该前端来添加和编辑信息 我们将添加一个网络界面 以便稍后在我们的生产区域进行搜索 我担心如果两个用户开始编辑同一条记录
  • 速度模板 - 新线

    我一直在使用 Apache 的 Velocity 引擎和自定义模板 问题是 我无法生成具有相应换行符的字符串 我几乎尝试了我发现的所有内容 例如使用 esc n 和 esc newline 我已经在我的项目中使用转义工具 但似乎我当前使用的
  • 如何在 C++ 中实现对私有基类的强制转换

    如何在 C 中实现对私有基类的强制转换 我不想使用黑客 例如添加朋友等 定义公共转换运算符不起作用 EDIT 例如我有 class A base class class AX private A a child class AY priva
  • PHP变量插值与串联[重复]

    这个问题在这里已经有答案了 以下两种方法 性能 可读性等 有什么区别 您更喜欢哪一种 echo Welcome name s vs echo Welcome name 无论什么对你最有效 都有效 但如果你想追求速度 请使用以下命令 echo
  • 魔术方法(__get,__set)在扩展类中不起作用? [复制]

    这个问题在这里已经有答案了