Цепочки классов


Перегрузкой метода __call() можно делать интересные цепочки классов,
которые достаточно сильно упрощают нотацию программы:

class App
{

   private $res = array();

   public function __clone() {
      throw new Exception("Clone not allowed!");
   }

   public function __call($name, $args) {
      $this->res[]=array('opr'=>$name, 'args'=>$args);
      print_r($this->res);
      return $this;
   }

   public function exec() {
      $res=array();
   }
}

// Новая нотация

$t = new App;

$t->search('dog')->where('outdoors')->exec();

* Такие вариант можно строить с разными объектами
  и генерировать их от какого-то базового синглтона