Объясните работу $stack = debug_backtrace(); $file = basename($stack[$level]['file']); $line = $stack[$level]['line']; $this->logger->log("[at $file line $line] $s"); } // Оставляем на месте старый метод log() public function log($s) { return $this->logger->log($s); } // И такие методы-посредники мы должны создать ДЛЯ КАЖДОГО // метода из FileLogger } Листинг 23.1. Базовый класс. Файл File/Logger.php name = $name; $this->f = fopen($fname, "a+"); } public function __destruct() { fputs($this->f, join("", $this->lines)); fclose($this->f); } public function log($str) { $prefix = "[".date("Y-m-d_h:i:s ")."{$this->name}] "; $str = preg_replace('/^/m', $prefix, rtrim($str)); $this->lines[] = $str."\n"; } } ?> Листинг 23.2. "Ручное" наследование. Файл File/Logger/Debug0.php logger = new FileLogger($name, $fname); // Здесь можно проинициализировать другие свойства текущего // класса, если они будут } // Добавляем новый метод public function debug($s, $level = 0) { $stack = debug_backtrace(); $file = basename($stack[$level]['file']); $line = $stack[$level]['line']; $this->logger->log("[at $file line $line] $s"); } // Оставляем на месте старый метод log() public function log($s) { return $this->logger->log($s); } // И такие методы-посредники мы должны создать ДЛЯ КАЖДОГО // метода из FileLogger } ?>