За последние 24 часа нас посетил 54261 программист и 1781 робот. Сейчас ищут 1157 программистов ...

Проблема с динамически подключаемыми класамиCannot redeclare

Тема в разделе "Прочие вопросы по PHP", создана пользователем oranze123, 31 авг 2007.

  1. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    Доброго времяни суток.
    Проблемка следующевого характера
    проэкт полностью на 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 - пробовал, никакой реакции
    Вопрос в том что может кто сталкивался с такой ерундой или на вскидку может предлодить другой способ?
     
  2. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    изменить имя класса
     
  3. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    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...
     
  4. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    xotja soobrazenija i mjisli, mozet kto-to kak-to po drugomu takoe izvle4enie mozet pridumatj?
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    дописываю движек то же полностью на аяксе с модульной системой.

    1. все написано на классах и грузится с помощью __autoload(). тем самым н икаких include() мне не требуется и я дже про это НЕ думаю. просто пишу классы.

    2. есть базовый класс Modul. все модули наследуют от него с различными именами. никаких проблем с пространством имен нет в принципе.


    судя по вашему коду и примеру у вас функциональный подход, а совсем не ООП.
     
  6. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    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!!!
     
  7. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    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
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    начни свое понимание ООП с "Патернов". тогда функции будут востребованы именно в тех местах, где они нужны.

    пример класса? без основных базовых коассов код будет бесполезен.

    PHP:
    1. <?php
    2.  
    3. /**
    4. *
    5. * Паттерн для работы только с одним экземпляром класса
    6. *
    7. * @package      Indigo
    8. * @subpackage   Patterns
    9. *
    10. */
    11.  
    12. class IndigoSingleton extends IndigoAtom {
    13.  
    14.     // хранилище экземпляров классов
    15.     private static $instance = array();
    16.    
    17.    // что б не могли клонировать
    18.     private function __clone() {
    19.         return false;
    20.     }
    21.    
    22.     // синглетоним...
    23.     public static function GetInstance($class=__CLASS__) {
    24.  
    25.         if (!isset(self::$instance[$class]))
    26.             self::$instance[$class] = new $class;
    27.        
    28.         return self::$instance[$class];
    29.    
    30.    }
    31.  
    32. }
    33.  
    34. ?>
    далее в ЛЮБОМ месте кода я пишу

    $Session = IndigoSession::GetInstance();

    и получаю:

    1. я не думаю об инклудах, т.к. все грузится автоматом.
    2. в любом месте я получаю доступ к ЕДИНСТВЕННОМУ экземпляру класса, что гарантирует мне уникальность сессии в коде.
    3. для включения нового класса я просто создаю его в нужном каталоге(ах)
    4. модули - отдельная песня с наследованием классов, буферизацией и View() и Dispatch() патернами. в двух словах не расскажешь.
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PHP:
    1. <?php
    2.  
    3. /**
    4. * Автозагрузчик классов
    5. *
    6. * Используется для автоматической загрузки классов в код
    7. *
    8. * @package      Indigo
    9. * @subpackage   Core
    10. *
    11. * @link [url=http://www.fabrika-koda.ru]http://www.fabrika-koda.ru[/url]
    12. * @license    [url=http://www.fabrika-koda.ru/license]http://www.fabrika-koda.ru/license[/url]
    13. * @author     Alexandre Kalendarev <akalend@mail.ru>
    14. * @author     Andrey Lugovoy <root@440hz.ru>
    15. * @version    $Id: autoload.php  $
    16. * @copyright  Copyright (c) fabrika Koda 2007
    17. *
    18. * @access public
    19. *
    20. */
    21.  
    22. /**
    23. * получаем список директориев для сканирования
    24. */
    25. function autoloadscandirs($dir,&$dirs) {
    26.  
    27.     if (is_dir($dir)) {
    28.         $dirs[] = $dir;
    29.         if ($dh = opendir($dir)) {
    30.             while (($file = readdir($dh)) !== false) {
    31.                 if($file[0] == '.') continue;
    32.                 $filename = $dir.$file;
    33.                 if(is_dir($filename)) autoloadscandirs($filename.'/',$dirs);
    34.             }
    35.             closedir($dh);
    36.         }
    37.     }
    38.  
    39.  
    40.  
    41.  
    42. }
    43.  
    44. /**
    45. * получаем список файлов для сканирования
    46. */
    47. function autoloadscanfiles($dir,&$dirs) {
    48.  
    49.     if (is_dir($dir)) {
    50.         if ($dh = opendir($dir)) {
    51.             while (($file = readdir($dh)) !== false) {
    52.                 if($file[0] == '.') continue;
    53.                 $filename = $dir.$file;
    54.                 if(is_dir($filename)) autoloadscanfiles($filename.'/',$dirs);
    55.                 if(is_file($filename))     
    56.                     $dirs[] = $file;
    57.  
    58.             }
    59.             closedir($dh);
    60.         }
    61.     }
    62.  
    63.  
    64.  
    65.  
    66. }
    67.  
    68. /**
    69. *
    70. * Автозагрузчик
    71. *
    72. * @param $name string
    73. * @return bool
    74. * @access public
    75. */
    76. function __autoload($name) {
    77.  
    78.     static $dirs = false;
    79.  
    80.     if(!$dirs) autoloadscandirs(INDIGO_CLASS_ROOT.'/',$dirs);
    81.  
    82.     // получмили имя класса
    83.     $name = strtolower(basename($name)).'.php';
    84.  
    85.     foreach($dirs AS $dir) {
    86.         $filename = $dir.$name;
    87.         if(file_exists($filename)) {
    88.             require_once($filename);
    89.             return true;
    90.         }
    91.     }
    92.  
    93.     die("не могу загрузить класс [$name]");
    94.  
    95.     return false;
    96.  
    97. }
    98.  
    99. ?>
    суть в том, чт о встретив упоминание о класса php запросит _-autoload() при необходимости загрузить класс. понятно?
     
  10. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    nu bolee menee! Spasibo tebe ogromnoe xotj mjislj kuda kopatj. popoze otpiwusj kak delo obstoit
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я вынес все вспомогательные функции в один класс и теперь делаю так:

    $ip = Tools::GetIP();

    идея понятна?

    ЯНО в ООП главное не переборщить и очень вдумчиво и еще раз вдумчиво планировать иерархию классов, потому как при дальнейшей разработке это все превращается или в удобную штуку или в ад, которому конца не видно.

    ну и на последок все мои классы наследуют от единого:

    PHP:
    1. <?php
    2.  
    3. /**
    4. *
    5. * @package      Indigo
    6. * @subpackage   Patterns
    7. *
    8. * @author Andrey Lugovoy
    9. * @version 1.0
    10. * @copyright CopyRight (c) 2007 Fabrika-koda.ru
    11. */
    12.  
    13. /**
    14. *
    15. * Базовый класс.
    16. *
    17. * От класса наследуют все потомки системы
    18. *
    19. * @access       public
    20. *
    21. */
    22. class IndigoAtom {
    23.  
    24.     /**
    25.     * Конструктор
    26.     *
    27.     * @return bool
    28.     */
    29.     public function __construct() {
    30.         return true;
    31.     }
    32.  
    33.     /**
    34.     * Деструктор
    35.     *
    36.     * @return bool
    37.     */
    38.     public function __destruct() {
    39.         return true;
    40.     }
    41.  
    42.     /**
    43.     * Преоразование к строке
    44.     *
    45.     * используется для получения мени класса в операциях и выражениях
    46.     * <br><b>Пример использования</b><br><code>
    47.     *  $classname = $this;  
    48.     *  $this->Notify($name,$this);</code>
    49.     *
    50.     * @return bool
    51.     */
    52.     protected function __toString() {
    53.  
    54.         return get_class($this);
    55.  
    56.     }
    57.  
    58.     public function Dump() {
    59.  
    60.         print('<hr><pre>');
    61.  
    62.         ob_start();
    63.        
    64.         print('CLASS: '.$this.'<hr>');
    65.         var_dump($this);
    66.  
    67.         var_dump($_REQUEST);
    68.        
    69.         $buf = ob_get_contents();
    70.         ob_end_clean();
    71.  
    72.         print(htmlentities($buf));
    73.  
    74.         print('</pre><hr>');
    75.     }
    76.  
    77.     /**
    78.     * @param $error string error
    79.     */
    80.     protected function Error($error = 'ошибка') {
    81.  
    82.  
    83.         print('<hr>');
    84.         print(get_class($this).': ');
    85.         print($error);
    86.         print('<hr>');
    87.  
    88.         exit();
    89.  
    90.         return true;
    91.  
    92.     }
    93.  
    94. }
    95.  
    96. ?>
    и теперь абсолютно в ЛЮБОМ месте ЛЮБОГО класса я могу написать:

    $this->Error('Cant connect to db');

    и мне гарантировано обработают ошибку или чего-нить еще.
     
  12. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    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
     
  13. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PHP:
    1. <?
    2. class MyClass {};
    3.  
    4. $classname = 'MyClass';
    5. $me = new $classname;
    6.  
    7. ?>
    идея понятна?
     
  15. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    o a eto mjislj :) ranjwe ne podumal ob etom :) spasibo boljwoe :) k utru dam rezuljtat - sei4as bezatj nuzno.
     
  16. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    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
     
  17. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    oranze123
    пиши русскими буквами
    1. Латинские буквы противоречат правилам
    2. Твои сообщения никто не читает - лично мне лень напрягать мозг.
     
  18. oranze123

    oranze123 Активный пользователь

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    Извеняюсь, превычка к транслиту. Тему можно закрывать. То что тут есть + доки = plugin system