Я понимаю, что вопрос детский, но тем не менее актуален =) есть класс db, есть класс main. В индекс.php так: Код (Text): include('main.php'); include('db.php'); $db=new db; $page = new main($_REQUEST['type'], $_REQUEST['method'], $_REQUEST['id']); echo $page->print_page; Так вот вопрос, почему оно ругается в конструкторе класса main вот здесь: Код (Text): if(!$db->db_con) $this->error_mes('Error connecting db<br>'); Причем к базе он норм коннектится, и вне этого класса вполне видит $db->db_con.
Потому, что в методах класса, как и в функциях, нужно писать global $db; чтобы получить доступ к глобальной переменной из локальной области видимости.
уж если юзаешь ООП, то нужно писать $db = MyDBClass::GetInstance(); где MyDBClass наследует от патерна синглетон. Тогда гарантировано - получишь единственный экземпляр класса - не будешь мусорить в глобале - появится хоть какая-нить ООП модель - вызов можно производжить в ЛЮБОМ месте кода и т.д.
так же при работе с ООП и классами надо использовать __autoload(); - сокращает код. - не надо думать что где включать - включение идет из нужных тебе директориев
Босс! У меня не пашет это дело с автолоадом! Покажи реализацию, о мудрый??? Эта сволочь возвращает инстанс класса TSingleton, а не унаследованового... нет, я конечно придумал костыли - но это костыли?
autoload.php PHP: <?php /** * Автозагрузчик классов * * Используется для автоматической загрузки классов в код * * @package Indigo * @subpackage Core * * @author Andrey Lugovoy <root@440hz.ru> * @version $Id: autoload.php $ * * @access public * */ /** * получаем список директориев для сканирования */ function autoloadscandirs($dir,&$dirs) { if (is_dir($dir)) { $dirs[] = $dir; if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if($file[0] == '.') continue; $filename = $dir.$file; if(is_dir($filename)) autoloadscandirs($filename.'/',$dirs); } closedir($dh); } } } /** * получаем список файлов для сканирования */ function autoloadscanfiles($dir,&$dirs) { if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if($file[0] == '.') continue; $filename = $dir.$file; if(is_dir($filename)) autoloadscanfiles($filename.'/',$dirs); if(is_file($filename)) $dirs[] = $file; } closedir($dh); } } } /** * * Автозагрузчик * * @param $name string * @return bool * @access public */ function __autoload($name) { static $dirs = false; if(!$dirs) autoloadscandirs(INDIGO_CLASS_ROOT.'/',$dirs); // получмили имя класса $name = strtolower(basename($name)).'.php'; foreach($dirs AS $dir) { $filename = $dir.$name; if(file_exists($filename)) { require_once($filename); return true; } } die("не могу загрузить класс [$name]"); return false; } ?>
синглетон PHP: <?php /** * * Паттерн для работы только с одним экземпляром класса * * @package Indigo * @subpackage Patterns * */ class IndigoSingleton extends IndigoAtom { // хранилище экземпляров классов private static $instance = array(); // что б не могли клонировать private function __clone() { return false; } // синглетоним... public static function GetInstance($class=__CLASS__) { if (!isset(self::$instance[$class])) self::$instance[$class] = new $class; return self::$instance[$class]; } } ?> сессия PHP: <?php /** * * @package Indigo * @subpackage Core * */ class IndigoSession extends IndigoSingleton { ///// public static function GetInstance() { return parent::GetInstance(__CLASS__); } ///// } ?> АТОМ PHP: <?php /** * * @package Indigo * @subpackage Patterns * * @author Andrey Lugovoy * @version 1.0 * @copyright CopyRight (c) 2007 Fabrika-koda.ru */ /** * * Базовый класс. * * От класса наследуют все потомки системы * * @access public * */ class IndigoAtom { /** * Конструктор * * @return bool */ public function __construct() { return true; } /** * Деструктор * * @return bool */ public function __destruct() { return true; } /** * Преоразование к строке * * используется для получения мени класса в операциях и выражениях * <br><b>Пример использования</b><br><code> * $classname = $this; * $this->Notify($name,$this);</code> * * @return bool */ protected function __toString() { return strtolower(get_class($this)); } public function Dump() { print('<hr><pre>'); ob_start(); print('CLASS: '.$this.'<hr>'); var_dump($this); var_dump($_REQUEST); $buf = ob_get_contents(); ob_end_clean(); print(htmlentities($buf)); print('</pre><hr>'); } /** * @param $error string error */ protected function Error($error = 'ошибка') { print(get_class($this).': '); print($error); exit(); } } ?>
когда в проекте будет больше 1 и проект будет вестись как положено такого там не будат по определению. а на своих маленьких страничках каждый волен делать как считает нужным. только почему-то проблемы, кторые возникают, решают не сами, а спрашивают у тех, кто пишет немноо по другому. если еще навесить CSV и трекеры и удалнную разработку, то вообще... и во-вторых такой подход увеличивает скорость разработки в разы. вот надо тебе еще подключить какую либу и что? в каждый скрипт дописывать очередной инклуд? а если инклудов 30? а если из них нужно только 5? поверь на слово. так веселее. =) p.s. кто так писал и делал - скажут.
PHP: $db = Locator::instance()->getDb(); Где-то ранее PHP: Locator::instance()->setDb(new Database()); PHP: <?php class Locator { private $registry; private static $instance; private function __construct() { $this->registry = new Registry(); } public static function instance() { if (!self::$instance) { self::$instance = new self(); } return self::$instance; } public function __call($name, $args) { if (preg_match('/^set([a-z]+)$/i', $name, $m) && isset($args[0])) { $this->registry->set($m[1], $args[0]); } else if (preg_match('/^get([a-z]+)$/i', $name, $m)) { if ($this->registry->has($m[1])) { return $this->registry->get($m[1]); } else { throw new Exception("Object '{$m[1]}' is not set in locator."); } } } }
хехе. Блин. вот оно... __CLASS__ надо определять с наружи метода. Как всегда, когда поймешь, все так банально и очевидно...
Интересно, вот это зачем? И ещё вопрос - зачем синглетон наследует атом, а все остальные наследуют синглетон? Почему бы синглетон в атоме не сделать и все остальные потомки наследовали бы атом?
Например, чтобы быстро вывести имя класса для объекта. Потому что не все классы наследуют синглетон, но могут наследовать атом. Это нечно похожее на множественное наследование. Незачем нагружать класс лишним функционалом.
Там есть метод для дампа объекта =) Можно и другие функции на него повесить. Базовый объект. Зачем в не синглетоне метод getInstance() синглетона? Он там явно лишний.
Ну так же можно другие функции и на атом с методом синглетон повесить. А, что мешает? Почему лишний. Ладно, всё понятно, это субъективное решение.