2011-05-05 5 views
4

Я пытаюсь изучить этот MVC ООП штучка, и я наткнулся на странную ошибку:PHP геттеры/сеттеры

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."); 

    } 
} 

Так что, если я правильно понимаю, функция геттера не может иметь аргументов? Зачем? Или я делаю что-то не так?

+0

Это стандартный тариф для singleton, чтобы указать частный конструктор, а в случае PHP - частный метод '__clone()'. Кроме того, я бы сделал 'FooBase' абстрактным классом – Phil

+0

, но спасибо, но код выше в основном скопирует из учебников, которые я нашел в google, поэтому я ничего не понимаю за его пределами :) Что делает абстракция? – Alex

+0

Тогда я не стал бы вкладывать в эти учебники много акций. То, что у вас там, довольно грязное, и вам обычно нужна очень веская причина использовать магические методы над конкретными. Если вы хотите учиться, начните здесь - http://php.net/manual/en/language.oop5.php – Phil

ответ

4

Все, что касается эллипсов, рассматривается как метод. Волшебные методы __get и __set работают только для вещей, которые выглядят как свойства.

Для метода магии см. __call().

+0

спасибо, я добавил функцию __call внутри FooBase и callStuff в Foo: D – Alex