простите за такое название темы, просто не пришло в голову как назвать более информативно. делаю первые шаги в ООП, вроде все ясно, а оказывается ничего не понятно ;-) Например создаю пробный класс, для создания категории в меню: PHP: <?php class Category { private $title; private $chpu; private $db; public function __construct($catname, $chpu='') { $this->db = new mysqli(dblocation, dbuser, dbpass, dbname); $this->title=$catname; $this->chpu=$chpu; } public function __destruct(){ $q="INSERT INTO ".dbpref."menu_groups SET mg_title='".$this->title."', mg_chpu='".$this->chpu."'"; if (! $this->db->query($q)){ $log->addError($this->db->error); } } } Он конечно совсем не то, что будет после, вопрос несколько в другом. $log - обьект класса Log: PHP: <?php class Log { private $filename; private $display; private $tofile; private $overwrite; private $contents; public function __construct($display=true, $save_to_file=true, $filename='error.log', $overwrite=true) { $this->display = (bool) $display; $this->tofile = (bool) $save_to_file; $this->filename = ($this->tofile) ? $filename : ''; $this->overwrite = (bool) $overwrite; if ($this->tofile) { if (file_exists($this->filename)) { if (!$this->overwrite) { $this->contents=file_get_contents($this->filename); } else $this->contents=''; } } } public function addError($error) { $this->contents.="\n".$error; if ($this->display) { echo $error; } } public function __destruct(){ if ($this->tofile) { file_put_contents($this->filename, $this->contents); } } } И конечно же при первой же ошибке вылазит сообщение: Fatal error: Call to a member function addError() on a non-object in ...\classes\cat.class.php on line 15 То есть обьект класса Category не может обращаться к $log. Как в таком случае поступаем? подтолкните, может просто одно понятие, которое надо тут применить, остальное нагуглю. То же самое с коннектом - как бы использовать один общий $db для всех операций с базой?
PHP: require_once '../classes/log.class.php'; $log= new Log(); require_once '../classes/cat.class.php';
И где это в приведенном коде? Плюс запомните простую вещь про область видимости, переменные видны лишь там где они объявлены. В остальные места (в функции и методы) они должны передаваться.
я это понимаю. и раньше зачастую в функциях использовал global и вообще всячески безобразничал. А как же тогда мне поступить, чтоб это дело работало? неужели в каждый обьект придется передавать экземпляр $log ? Просто голова не соображает пока по ООПному
PHP: <?php $log = new MyLog(); $some = new MyClass(); $some->setLog($log); // или так $some2 = new MyClassOther(array('log' => $log, 'text' => 'sometext'));
или как-нибудь так PHP: <?php class Log { public function __construct($message) { file_put_contents('log.txt', $message); } } class MyClass { public function A() { $this->db->query($sql) or new Log('my error'); } } ?>
а мне вот нравится Zend'овская реализация логирования, наверно буду прикручивать к своим велосипедным библиотекам
PHP: <?php class sys { private static $log; public static function log() { return isset(self::$log) ? self::$log : self::$log = new log; } } sys::log() -> addError(...
не судите строго. Я понимаю что это должно быть чутье что и как следует обьектить и переобьечивать И придет оно, надеюсь, с опытом. Просто понял что надо как-то подрасти чтоли.. Бо чуть только сделаю небольшой проектик, содержащий не пару десятков строк, то с разрастанием он становится все более неуправляемым.
FishError Я лично ничего зазорного в этом не вижу. Всегда считал, что кодить нужно в свое удовольствие. Чтоб накодил, посмотрел, и подумал: даа... красиво получилось))
А что делает, допустим код который привел автор темы, ООП или нет? ...автору, не понял $chpu за что отвечает, наверное там нужен комент...