问题标签 [magic-methods]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1135 浏览

php - 根据需要实例化定义为 PHP 类中的属性的对象(延迟加载)

为简单起见,假设我有 2 个类,User 和 UserStatus,用于 Web 应用程序。

在大多数 HTTP 请求中,不会使用状态对象,因此我正在寻找一种仅根据需要实例化它的方法(称为延迟加载)。我应该如何拦截status->method()呼叫并即时创建该对象?

一个重要的注意事项是我需要$user_id在 UserStatus 类中可用,否则该fetchDataFromDB()方法将不知道它应该向哪个用户获取数据。这应该怎么做?

我看过一些关于这个问题的有趣的东西,比如 Fabien Potencier 的什么是依赖注入?Pimple - 一个 PHP 5.3 依赖注入容器以及一些关于代理模式的文章,但要实现它们,看起来我必须对当前代码进行很多处理。有没有更简单的方法?

0 投票
1 回答
276 浏览

php - PHP 观察者模式/魔术设置器/代理

我正在寻找一种方法来监视我班级中的变量何时被设置。

例如,如果我有以下课程:

在我的代码中某处我做:

我希望能够“挂钩”到 myVariable 的设置器中。所以当我调用 $class->myVariable = "Value"; 将启动一个过滤器,检查新值是否等于“Value”,如果是,则抛出异常。

0 投票
4 回答
15078 浏览

php - 带有 get/set 函数的 PHP 属性

其他语言的便利功能之一是能够为属性创建 get 和 set 方法。在试图找到一种在 PHP 中复制此功能的好方法时,我偶然发现了这个: http ://www.php.net/manual/en/language.oop5.magic.php#98442

这是我对该课程的细分:

我的计划是扩展这个类并在这个扩展类中定义适当的get_someproperty()set_someproperty()

问题是, 的基类ObjectWithGetSetProperties无法get_someproperty()SomeNewClass. 我总是收到错误消息,“密钥不可用”。

有什么办法可以解决这个问题,允许基类ObjectWithGetSetProperties工作,还是我必须在每个类中创建这些__get()__set()魔术方法?

0 投票
1 回答
88 浏览

php - 帮助我识别我在这个 php 示例中使用的技术并命名它

好的,所以在工作中我们发现这种获取相关数据/对象的方法非常棒。

举个例子,我有这个类,里面有一些相关的对象:

所以这个想法是:

我想要一个 Country 的实例,但我现在不需要它的语言和地区。

在另一种情况下,我需要它们,因此我将它们声明为属性,而魔术方法仅在第一次为我检索它们。

这种按需方法(也避免了相关对象的嵌套循环)有名字吗?也许延迟加载属性按需属性?

0 投票
1 回答
4544 浏览

php - 如何在 PHP 中使用接口和魔术方法

我想使用接口,但我的一些实现依赖于魔术方法,例如 __invoke 和 __call。我必须从接口中删除可能被魔法(在任何实现中)调用的方法的签名。这导致了反模式 Empty Interface(是的,我只是编造的)。

如何在 PHP 中结合接口和魔术方法?

0 投票
1 回答
889 浏览

python - 使用自定义 dict 类作为 Python 类的 __dict__ 属性的奇怪行为

我有一个从字典继承的类,以添加一些自定义行为——在这种情况下,它将每个键和值传递给一个函数进行验证。在下面的示例中,“验证”只是打印一条消息。

对字典的分配按预期工作,每当将项目添加到字典时都会打印消息。但是,当我尝试将自定义字典类型用作__dict__类的属性时,属性分配(又将键/值放入我的自定义字典类)以某种方式设法将值插入字典,同时完全绕过__setitem__(以及我的其他方法) '已经定义了可以添加键)。

自定义字典:

将它用作__dict__类的属性会产生我不理解的行为。

有人可以解释为什么它的行为不像我期望的那样吗?它可以或不能按照我尝试的方式工作吗?

0 投票
3 回答
498 浏览

php - __toString 魔法和类型强制

我创建了一个Template用于管理视图及其相关数据的类。它实现Iteratorand ArrayAccess,并允许“子模板”以便于使用,如下所示:

无论如何,与其使用内联核心函数,例如hash()or date(),我认为创建一个名为 的类会很有用TemplateData,它将充当存储在模板中的任何数据的包装器。

这样,我可以添加常用的格式化方法列表,例如:

当通过$template['foo'] = 'bar';控制器设置一个值时,该值'bar'存储在它自己的TemplateData对象中。

我使用了魔法__toString(),所以当你回显一个TemplateData对象时,它会转换(string)并转储它的值。然而,尽管口头禅控制器和视图不应该修改数据,每当我做这样的事情:

它死在Object of class TemplateData could not be converted to int; 除非我重铸成 $template['foo']一个字符串:

有点违背了必须跳过那个箍的目的。是否存在针对此类行为的任何解决方法,或者我应该照原样采取这种做法,偶然防止视图中的数据修改?

0 投票
2 回答
352 浏览

php - 如果属性不退出,则默认为默认的 getter 行为

我目前需要扩展一个类以向它添加功能(我无权访问基类来修改它),并且我遇到了它的问题。

基本上,如果需要,我需要魔术 getter 函数来返回一组私有变量,否则默认为默认行为。我需要这些属性是私有的,以便使用魔法设置器功能自动同步一些数据。

也就是说,这里有一些示例代码:

我知道,我可以使用 getProperty/setProperty 函数,但我希望它尽可能保持直观,尽管有人认为执行此类操作是违反直觉的。这两个私有财产彼此非常相关。当其中一个被设置时,它在逻辑上会影响其他人。

到目前为止,这是我能想到的避免 getter/setter 函数并保持属性之间紧密结合的同步的唯一合乎逻辑的方法。如果你们能想到任何其他可行的解决方案,请随时提出选择:)

0 投票
1 回答
288 浏览

python - 欺骗 Python 运算符优先级

我知道当我比较两个对象lhs == rhs并且都定义__eq__时,lhs.__eq__除非它返回NotImplemented或者rhslhs.

但是,我想实现一个类,它的实例在与任意对象进行比较时,将有机会说出他们想说的话,而arbitrary_object.__eq__不管比较语句的实现细节和位置。这听起来有点尴尬,但我正在做一个面向测试的小项目,看看testmania.expect你就会明白我需要这个做什么。

__instancecheck__我最初的想法是使用元类魔法和,使我的类成为任何其他类的子类__subclasscheck__。但在简单比较的情况下,它们根本不会被调用。

有人有什么新鲜想法吗?

0 投票
2 回答
124 浏览

php - 是否可以在 PHP 中实现类似数组的对象?

我想实现一个行为像数组的对象。应该这样使用:

这可以在 PHP 中使用魔术方法或其他机制来完成吗?