- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在制作一个基于对象的 API。我有一个名为 Part
的抽象类,每个 child 都会扩展它。 Part
有一个 __set
函数,它将值存储在一个名为 $attributes
的 protected 数组中。但是,当我执行 $part->user = new User(etc...);
时,它不会运行 __set
函数。这是我的代码:
部分:
<?php
namespace Discord;
abstract class Part
{
protected $attributes = [];
public function __construct(array $attributes)
{
$this->attributes = $attributes;
if (is_callable([$this, 'afterConstruct'])) {
call_user_func([$this, 'afterConstruct']);
}
}
/**
* Handles dynamic get calls onto the object.
*
* @param string $name
* @return mixed
*/
public function __get($name)
{
$str = '';
foreach (explode('_', $name) as $part) {
$str .= ucfirst($name);
}
$funcName = "get{$str}Attribute";
if (is_callable([$this, $funcName])) {
return call_user_func([$this, $funcName]);
}
if (!isset($this->attributes[$name]) && is_callable([$this, 'extraGet'])) {
return $this->extraGet($name);
}
return $this->attributes[$name];
}
/**
* Handles dynamic set calls onto the object.
*
* @param string $name
* @param mixed $value
*/
public function __set($name, $value)
{
echo "name: {$name}, value: {$value}";
$this->attributes[$name] = $value;
}
}
客户:
<?php
namespace Discord\Parts;
use Discord\Part;
use Discord\Parts\User;
class Client extends Part
{
/**
* Handles extra construction.
*
* @return void
*/
public function afterConstruct()
{
$request = json_decode($this->guzzle->get("users/{$this->id}")->getBody());
$this->user = new User([
'id' => $request->id,
'username' => $request->username,
'avatar' => $request->avatar,
'guzzle' => $this->guzzle
]);
}
/**
* Handles dynamic calls to the class.
*
* @return mixed
*/
public function __call($name, $args)
{
return call_user_func_array([$this->user, $name], $args);
}
public function extraGet($name)
{
return $this->user->{$name};
}
}
当我创建一个新的 Client
实例时,它会自动创建一个 User
实例并设置它。但是,我在 __set
中有测试代码,但它没有运行。
感谢任何帮助。
谢谢
最佳答案
The __set
magic method is called only when a property is inaccessible from the context in which it is set .因为 Client
扩展 Part
,Part
的属性都可以在 Client
中访问,所以魔术方法不是需要。
关于PHP __set 魔术方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578383/
我目前正在制作一个基于对象的 API。我有一个名为 Part 的抽象类,每个 child 都会扩展它。 Part 有一个 __set 函数,它将值存储在一个名为 $attributes 的 prote
我是 php 世界的新手。我试图了解 __set() 魔术方法在 php 中的工作原理。这里我使用 __set() 创建一个新属性__set() em> 方法。我有一个 if 语句,用于检查该属性是否
这设法在对象上创建一个新属性。但是,有人可以通过支持链接解释为什么 setAttrib 有两种不同的行为方式吗?为什么它不会导致……等等……堆栈溢出!!?? class Test { public
我正在尝试为类设置一个不明确的变量。沿着这些线的东西: values[$key]; } function __set($key, $value){ $this->value
任何人都可以向我解释这种行为的逻辑吗? 考虑以下情况: class EPPDomain { protected $myField; public static function bui
class Dog { protected $bark = 'woof!'; public function __get($key) { if (isset($this
想知道是否可以执行以下操作(我知道代码不会按预期工作,只是试图达到目的): class Form { private $v = array(); function __set($var
我正在构建一个包含多个输入验证的类,我决定将它们放在 __set 方法中(我不确定这是否是正确的形式,因为我的 OOP 经验有限)。这似乎工作正常,当从类外部传递无效值时抛出正确的错误。但是,如果在类
我在玩弄 PHP 魔法方法(特别是 Property overloading ),并且在进行微基准测试时,遇到了一个我无法解释的怪癖: 看起来一个空体的__set方法比一个有效的方法需要更多的时间来运
如果我有以下注册表类: Class registry { private $_vars; public function __construct() { $th
我正在使用 PHP 实现 OOP 设计。我想知道 PHP 如何处理其神奇方法(如 __get 和 __set)的继承。 class Foo { protected $property1;
我不确定在 PHP 中使用 __get 和 __set 方法有什么值(value)。 这是在数组中设置值的代码。 class myclass { public $sotre = array(); pu
这个问题在这里已经有了答案: PHP Inherited parent method can't access child's private property (3 个答案) 关闭 9 年前。 $
经过一些研究,我最终找到了一个我很快就会在这里问的问题的答案;您如何通过 PHP 中的 __get 和 __set 魔术方法处理数组?每当我尝试使用类似 $object->foo['bar'] = 4
我有一个定制的 MVC PHP 框架,我正在重写它并且对性能和魔术方法有疑问。对于框架的模型部分,我在想如果 __get/__set 魔法方法会导致太多的性能损失而不值得使用。我的意思是访问(读取和写
我正在研究 PHP 中的 OOP,并尝试编写一个基本的 Session 类,它将创建一个 Session 数组。在实例化类时,用户将提供数组的第一维,然后我希望他们能够向该 session 添加任何变
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
PHP 5 引入了魔术方法 __get() 和 __set()。根据我的理解,这是必须编写每个成员的 getter 和 setter 的捷径; $var = $name; } fun
在 OO 编程中,使用魔法方法 __get() 和 __set() 会不会被人看不起,这些会导致类的封装泄漏吗?例如: class User { private $username;
这样做会被认为是好的做法吗... 我的 A 类具有以下定义: class A{ private $_varOne; private $_varTwo; priva
我是一名优秀的程序员,十分优秀!