PHP getter / setters(PHP getters / setters)

我正在尝试学习这个MVC OOP的东西,我偶然发现了一个奇怪的错误:

Fatal error: Call to undefined method Foo::stuff() in ...

我的代码:

class Foo extends FooBase{ static $_instance; private $_stuff; public function getStuff($which = false){ if($which) return self::app()->_stuff[$which]; else return self::app()->_stuff; } public function setStuff($stuff){ self::app()->_stuff = $stuff; } public static function app(){ if (!(self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } } Foo::app()->stuff = array('name' => 'Foo', 'content' => 'whatever'); echo Foo::app()->stuff('name'); // <- this doesn't work...

FooBase类看起来像这样:

class FooBase{ public function __get($name){ $getter = "get{$name}"; if(method_exists($this, $getter)) return $this->$getter(); throw new Exception("Property {$name} is not defined."); } public function __set($name, $value){ $setter = "set{$name}"; if(method_exists($this, $setter)) return $this->$setter($value); if(method_exists($this, "get{$name}")) throw new Exception("Property {$name} is read only."); else throw new Exception("Property {$name} is not defined."); } }

所以,如果我理解正确,getter函数不能有参数? 为什么? 或者我在这里做错了什么?

I'm trying to learn this MVC OOP thingie and I stumbled across a weird error:

Fatal error: Call to undefined method Foo::stuff() in ...

The code I have:

class Foo extends FooBase{ static $_instance; private $_stuff; public function getStuff($which = false){ if($which) return self::app()->_stuff[$which]; else return self::app()->_stuff; } public function setStuff($stuff){ self::app()->_stuff = $stuff; } public static function app(){ if (!(self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } } Foo::app()->stuff = array('name' => 'Foo', 'content' => 'whatever'); echo Foo::app()->stuff('name'); // <- this doesn't work...

The FooBase class looks like this:

class FooBase{ public function __get($name){ $getter = "get{$name}"; if(method_exists($this, $getter)) return $this->$getter(); throw new Exception("Property {$name} is not defined."); } public function __set($name, $value){ $setter = "set{$name}"; if(method_exists($this, $setter)) return $this->$setter($value); if(method_exists($this, "get{$name}")) throw new Exception("Property {$name} is read only."); else throw new Exception("Property {$name} is not defined."); } }

So if I understand correctly, a getter function can not have arguments? Why? Or am I doing something wrong here?

最满意答案

任何带有省略号的东西都被视为一种方法。 神奇的__get和__set方法仅适用于看起来像属性的东西。

对于方法魔术,请参阅__call() 。

Anything with ellipses is treated as a method. The magic __get and __set methods only work for things that look like properties.

For method magic, see __call().

更多推荐