Я пытаюсь изучить этот 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.");
}
}
Так что, если я правильно понимаю, функция геттера не может иметь аргументов? Зачем? Или я делаю что-то не так?
Это стандартный тариф для singleton, чтобы указать частный конструктор, а в случае PHP - частный метод '__clone()'. Кроме того, я бы сделал 'FooBase' абстрактным классом – Phil
, но спасибо, но код выше в основном скопирует из учебников, которые я нашел в google, поэтому я ничего не понимаю за его пределами :) Что делает абстракция? – Alex
Тогда я не стал бы вкладывать в эти учебники много акций. То, что у вас там, довольно грязное, и вам обычно нужна очень веская причина использовать магические методы над конкретными. Если вы хотите учиться, начните здесь - http://php.net/manual/en/language.oop5.php – Phil