Tag: 魔法

为什么python使用“魔术方法”?

最近我一直在玩Python,有一点我觉得有点奇怪的是广泛使用“魔术方法”,例如,使其长度可用一个对象实现一个方法def __len__(self)然后它是当你写len(obj)时调用。 我只是想知道为什么对象不会简单地定义一个len(self)方法,并直接调用它作为对象的成员,例如obj.len() ? 我相信Python一定有很好的理由这样做,但作为一个新手,我还没有弄清楚他们到底是什么。

PHP – 重载属性的间接修改

我知道这个问题已经被问了好几次了,但是他们没有一个真正的解决方法。 也许有一个针对我的具体情况。 我正在构build一个使用魔术方法__get()来延迟加载其他对象的mapper类。 它看起来像这样: public function __get ( $index ) { if ( isset ($this->vars[$index]) ) { return $this->vars[$index]; } // $index = 'role'; $obj = $this->createNewObject ( $index ); return $obj; } 在我的代码我做: $user = createObject('user'); $user->role->rolename; 这工作到目前为止。 User对象没有一个名为'role'的属性,所以它使用magic __get()方法来创build该对象,并从'role'对象返回它的属性。 但是当我尝试修改“angular色名称”时: $user = createUser(); $user->role->rolename = 'Test'; 然后它给了我以下错误: 注意:重载属性的间接修改不起作用 不知道这是否仍然是PHP中的一些错误,或者是“预期的行为”,但无论如何,它不会按照我想要的方式工作。 这对我来说真的是一个展示塞…因为我怎么能够改变懒加载对象的属性? 编辑: 实际问题似乎只有当我返回一个包含多个对象的数组时才会发生。 我已经添加了一个代码片段,它重现了这个问题: […]

最佳实践:PHP魔术方法__set和__get

可能重复: 魔术方法是PHP中的最佳实践吗? 这些都是简单的例子,但是假设你的class级里有更多的属性。 最好的做法是什么? a)使用__get和__set class MyClass { private $firstField; private $secondField; public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } } public function __set($property, $value) { if (property_exists($this, $property)) { $this->$property = $value; } } } $myClass = new MyClass(); $myClass->firstField = "This is a foo line"; $myClass->secondField = "This is a […]

PHP __get和__set魔术方法

除非我完全错误, __get和__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]"; 这只会导致: […]