Доброго времяни суток. Проблемка следующевого характера проэкт полностью на ajaxe, при загрузке должны быть сформированы списки вызываемых функций из php, есть некии модули которые подключаются динамически в них классы, классы (из-за динамичности подгрузки) имеют одинаковые имена, в каждом классе есть массив содержащий списки функций которые должны быть зарегестрированы для AJAXa в момент загрузки. код выглядит так: динамически подключаемый: class admin { public $TABLE_PREFIX = "admin_auth__"; public $content =''; public $module = 'admin_auth'; public $functions = array(); в основном файле алгоритм: foreach ($install->modules_all as $key) { include_once(ENGINE_DIR.'/modules/'.$key["name"].'/admin.php'); $admin = new admin(); $s=0; while ($s<count($admin->functions)) { array_push($xajax_dinamic_functions_list,$admin->functions[$s]); $s++; } } Если файл таким образом подключен лиш один то все в порядке, проблема в том что их там и думано что будет много. php сразу начинает кричать: Fatal error: Cannot redeclare class admin in.... unset - пробовал, никакой реакции Вопрос в том что может кто сталкивался с такой ерундой или на вскидку может предлодить другой способ?
izmenitj imja klasa on ze dinami4eski probegaet po spisku v tom to i sutj.... mda... navernoe nuzno budet po drugomu sdelatj.... zavtra otpiwusj, raskazu 4to ridumal...
дописываю движек то же полностью на аяксе с модульной системой. 1. все написано на классах и грузится с помощью __autoload(). тем самым н икаких include() мне не требуется и я дже про это НЕ думаю. просто пишу классы. 2. есть базовый класс Modul. все модули наследуют от него с различными именами. никаких проблем с пространством имен нет в принципе. судя по вашему коду и примеру у вас функциональный подход, а совсем не ООП.
Mozew privesti primer klasa roditelja? Interestno bjilo bji vzgljanutj - a voobwe po povodu realizacii Plugin mexanizmov na php informacii oi kak malo. U menja dvizok postroen tak 4to v nego mozno zagruzitj skoljko ugodno modulei i on polnostju dinami4en i nikak ot modulei ne zavisit. Vesj ogorod predjiwuwii navorotil dlja togo 4tobji bjila vozmoznostj zabratj spiski funkcii neobxodimjix dlja registracii pod JavaScript iz zaranee Opredelenjix (opjatj ze dinami4eski) ustanovlenjix modulei. v module estj fail admin.php - v nem soderzjitsja vesj funkcional dlja adminki po nastroike etogo modulja. v nem ze lezjit prostoi masiv4ik kojii dumano v faile adminki izvlekatj pri podklju4enii faila i dobavljatj v uze svoi nasiv i potom regestrirovatj pod javascript.- takoi vot ogorod. Esli pisal 4to - libo podobnoe raskazji (esli mozno s abstranktnjimi primerami, na kolenke napisanjimi) pozalusta kak tji eto realizovjival, a to za dva dnja borjbji s etoi erundoi uze golova krugom idet!!!
A ewe kakim obrazom tji regestriruew objekt klasa, to4nee kakim obrazom tji opredeljaew pri zaprose 4to zaprosili takoi-to i tji uze ispoljzuew ego objekt? eval???? i kak eto realizovano. Zaranee spasibo za ljubuju pomowj
начни свое понимание ООП с "Патернов". тогда функции будут востребованы именно в тех местах, где они нужны. пример класса? без основных базовых коассов код будет бесполезен. 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]; } } ?> далее в ЛЮБОМ месте кода я пишу $Session = IndigoSession::GetInstance(); и получаю: 1. я не думаю об инклудах, т.к. все грузится автоматом. 2. в любом месте я получаю доступ к ЕДИНСТВЕННОМУ экземпляру класса, что гарантирует мне уникальность сессии в коде. 3. для включения нового класса я просто создаю его в нужном каталоге(ах) 4. модули - отдельная песня с наследованием классов, буферизацией и View() и Dispatch() патернами. в двух словах не расскажешь.
PHP: <?php /** * Автозагрузчик классов * * Используется для автоматической загрузки классов в код * * @package Indigo * @subpackage Core * * @link [url=http://www.fabrika-koda.ru]http://www.fabrika-koda.ru[/url] * @license [url=http://www.fabrika-koda.ru/license]http://www.fabrika-koda.ru/license[/url] * @author Alexandre Kalendarev <akalend@mail.ru> * @author Andrey Lugovoy <root@440hz.ru> * @version $Id: autoload.php $ * @copyright Copyright (c) fabrika Koda 2007 * * @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 запросит _-autoload() при необходимости загрузить класс. понятно?
я вынес все вспомогательные функции в один класс и теперь делаю так: $ip = Tools::GetIP(); идея понятна? ЯНО в ООП главное не переборщить и очень вдумчиво и еще раз вдумчиво планировать иерархию классов, потому как при дальнейшей разработке это все превращается или в удобную штуку или в ад, которому конца не видно. ну и на последок все мои классы наследуют от единого: 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 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('<hr>'); print(get_class($this).': '); print($error); print('<hr>'); exit(); return true; } } ?> и теперь абсолютно в ЛЮБОМ месте ЛЮБОГО класса я могу написать: $this->Error('Cant connect to db'); и мне гарантировано обработают ошибку или чего-нить еще.
440Hz nu eto ponjatno. U menja primerno takze estj class functions i tam i vse 4to nado i ne nado vplotj d perevoda v translit i obratno. ne sutj v tom. xitrostj v tom kak sdelatj 4tobji v kazdom module bjil standartnjii nabor i klasov i glavnjii metod i opredelennjie peremennjie i masiv4iki kotorjie to4no tam dolznji bjitj opredelenji so svoimi zna4enijami i potom v faile kotorjii zapuwen pervjii eto vse na moment ego sborki vjibratj iz modulei. Nu kak ja ponimaju registracii klassa ne izbezatj,nikak pri podgruzke faila (eli potljko ne fopen'om otkrjivatj ) no kak sozdatj ekzempljar klassa i potom praviljno opredelitj ego imja, proboval v masiv pixatj: $modules_classes[module_name]= 'copy of class object' - takaja konstrukcija ne rabotaet u menja xotja rugani ot php ja toze ne vizu. t.e. nuzno sozdatj nekuju strukturu globaljnuju 4tobji iz funkcii v glavnom faile k nei mozno bjilo polu4itj dostup. Mozet vsetaki moi variant s massivom ne takoi uz i beznadeznjii? php 5.2
kstati 4itaju pro paternji! Spasibo! esli komu nado link tut http://i2r.ru/static/256/out_16667.shtml
Tam v dvizke boljwaja 4astj napisana na OOP, poka zada4a stoit sobratj ego vo 4to bji to nistalo kak mozno skoree, v daljneiwem navernoe perevedu vse 4to vozmozno na oop, poka prosto ne xvataet na eto vremjani, da i poka ne vse zadumki realizovanji! Kstati kto stalkivalsja s avto obnovleniem? ja vizu dva puti: 1) ka4atj skriptom zip i raspakovjivatj ego v korenj(problemki malenjkie - nekotorjie direktorii pridetsja zatiratj a potom voskrewatj ibo failji so vremjanem mogut izmenitsja) 2) pisatj pod cgi programku kotoraja budet delatj vjiwe opisanoe 3) eto dlja klienta modulj na C++ ili delfi - ne sutj vazno kotorjii budet po ftp delatj vse opisanoe. Kakie estj ewe varianji? interesuet relizacija na php iz samogo skripta
oranze123 пиши русскими буквами 1. Латинские буквы противоречат правилам 2. Твои сообщения никто не читает - лично мне лень напрягать мозг.