Здравствуйте уважаемые форумчани. Пере до мной постала такая проблема. Ипшу ООП. Есть глобальный класс, в котом все основные настройки и функции. Так же есть функция Load которая подключает другие классы. Задача состоит в том чтобы при каждом подключаемом классе выделялась переменная типа object и туда запихивался класс который я инклюдю на данный момент у меня вот такая конструкция PHP: include_once('/libraries/'.$class.'.php'); $this->class =&instantiate_class(new $class()); ******* function &instantiate_class(&$class_object) { return $class_object; }
тебе нужен синглтон PHP: <?php /** * Singleton * @author padaboo * @link * @abstract */ class Singleton { /** * Self * @var self $instance * @access protected */ protected static $instance; /** * @access * @static * @return self */ public static function getInstance(){ if (!self::$instance instanceof self) { self::$instance = new self(); } return self::$instance; } } ?> потом автолоад http://php.net/manual/en/language.oop5.autoload.html в синглтоне метод add и вызывать его в автолоаде UPD: кароче у меня так сделано PHP: <?php /** * Description of registry * @author padaboo */ abstract class ARegistry implements ArrayAccess { /** * Массив с классами * @var array $vars */ protected $vars = NULL; /** * @param string $key * @param object $var * @return void */ abstract public function set($key, $var); /* * @var string $offset * @return bool */ public function offsetExists($offset){ return isset($this->vars[$offset]); } /* * @var string $offset * @return object */ public function offsetGet($offset){ return $this->vars[$offset]; } /* * @var string $offset * @var object $offset * @return void */ public function offsetSet($offset, $value) { $this->set($offset, $value); } /* * @var string $offset * @return void */ public function offsetUnset($offset) { unset($this->vars[$offset]); } } ?> PHP: <?php /** * @author padaboo * @link */ interface ISingleton { /** * Self * @return self $instance * @static */ public static function getInstance(); }?> PHP: <?php /** * Trashcan Core * @version 0.1 * @since none * @author padaboo * @link * @final */ include_once '/../patterns/singleton/isingleton.php'; include_once '/../patterns/registry/aregistry.php'; final class Core extends ARegistry implements ISingleton { /** * Self * @access private * @staticvar self $instance */ private static $instance; /** * @access public * @return self */ public static function getInstance(){ if (!self::$instance instanceof self) { self::$instance = new self(); } return self::$instance; } /** * Добавляет новое значение в массив * @access public * @param string $key * @param object $var * @return void */ public function set($key, $var){ if (isset($this->vars[$key])){ throw new Exception('Переменная`' . $key . 'уже задана '); } $this->vars[$key] = $var; } /** * Загружает объекты массивом * @access public * @param array $vars * @return void */ public function setVars($vars){ if(is_array($this->vars)){ throw new Exception('Массив уже был загружен'); } $this->vars = $vars; } /** * Перенаправляет на другую * страницу * @access public * @param string $url * @return void */ public function redirect($url){ header("Location: $url"); exit; } } ?>
PHP: <?php $c = Core::getInstance(); $c['db']->query(''); например вот только если в конструкторе какие то аргументы нужны хз только зачем это нужно?
О майн гот. все не так сложно как кажется вот вся функция PHP: <?php function load($props = array()){ /*Проверяем есть ли файл библиотек*/ if (count($props) > 1) { $list_files_libraries = $this->get_librari_file(); foreach ($props as $key => $val) { if(in_array($val.'.php', $list_files_libraries)){ include_once('/libraries/'.$val.'.php'); //$this->init($val); $this->class =& instantiate_class(new $val()); //$this->mod[]=$val; } else { //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'"; //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'") } } } else { $list_files_libraries = $this->get_librari_file(); if(in_array($props.'.php', $list_files_libraries)){ include_once('/libraries/'.$props.'.php'); $this->class =&instantiate_class(new $props()); $this->mod[]=$props; } else { echo "Файл $props не найден, проверте писутствие файла 'libraries/$props.php'"; $GLOBALS->class["Log"]->log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'"); } } }?> а нужно сделать так PHP: <?php function load($props = array()){ /*Проверяем есть ли файл библиотек*/ if (count($props) > 1) { $list_files_libraries = $this->get_librari_file(); foreach ($props as $key => $val) { if(in_array($val.'.php', $list_files_libraries)){ include_once('/libraries/'.$val.'.php'); //$this->init($val); $this->class =& instantiate_class(new $val()); //$this->mod[]=$val; } else { //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'"; //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'") } } } else { $list_files_libraries = $this->get_librari_file(); if(in_array($props.'.php', $list_files_libraries)){ include_once('/libraries/'.$props.'.php'); вот на этом этапе создать переменную и именем которое хранит в себе переменная props //$this->class =&instantiate_class(new $props()); и что то типу $this->имя переменной которую мы создали =&instantiate_class(new $props()); $this->mod[]=$props; } else { echo "Файл $props не найден, проверте писутствие файла 'libraries/$props.php'"; $GLOBALS->class["Log"]->log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'"); } } }?>
wir_wolf я наверное схему буду делать для классов и путей , т.е. при создании класса в автолоаде мы получаем имя класса, оно будет ключем в массиве типа 'name' => 'path' если там нету такого, то рекурсивный поиск по папкам юзера
wir_wolf создай метод add и в нем PHP: public functin add($key, $val){ $this->class[$key] = $val; } тогда вот так будет PHP: <?php foreach ($props as $key => $val) { if(in_array($val.'.php', $list_files_libraries)){ include_once('/libraries/'.$val.'.php'); $this->add( $val, & instantiate_class(new $val())); } else { //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'"; //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'") } }
перефразировал то что у меня сейчас есть, я хочу избавится на данном этопе от массивов а выходит что class это и есть массив
wir_wolf ну он просто массив с объектами, без путей же... я хз как еше сделать, что бы все в одном месте было
А... магические методы http://php.net/manual/en/language.oop5.magic.html PHP: <?php /** * @author padaboo ^^ * Копирование преследуется по закону * и карается смертью через тумба-юмба */ class ThisIsFuckingMagic{ public function __get($name){ return $this->$name; } public function __set($name, $value){ $this->$name = $value; } } $dick = new ThisIsFuckingMagic(); $var = 'ololo'; $dick ->$var = ':D'; echo $dick ->ololo;