Помощник
|
запрет на повторный вызов класса |
ZhukV
|
Сообщение
#1
|
||
|
|
||
|
|||
alexdrob |
23.6.2010, 16:09;
Ответить: alexdrob
Сообщение
#2
|
|
опять с помощью той же функции )
[PHP]class A { function &getInstance() { static $me; if (is_object($me) == true) { return $me; } $me = new A; return $me; } } $R = &A::getInstance(); //создали $B = &A::getInstance();//не создали))[/PHP] |
|
|
ZhukV
|
Сообщение
#3
|
|
Также подходит, но у меня функция несколько инная:
[PHP] public function LoadModule($MODULE = ''){ if(!is_array($MODULE)){ return $this -> setError("Err:201", __FUNCTION__, __LINE__, __FILE__); } $CONST = "PSUIT_REGISTER_OBJECT_" . $MODULE["NAME"]; $CODE = $MODULE["ERROR"] ? $MODULE["ERROR"] : "203"; if(defined($CONST)){ return $this -> setError("Err:{$CODE}", __FUNCTION__, __LINE__, __FILE__); } $YES = false; $MODULE['PARAM'] = str_replace("THIS", "\$this", $MODULE['PARAM']); if(class_exists($MODULE['NAME'])){ $TEXT = "\$this -> {$MODULE['NAME']} = new {$MODULE['NAME']}({$MODULE['PARAM']}); if(is_object(\$this -> {$MODULE['NAME']})){ \$YES = true; }"; eval($TEXT); if($YES !== true){ return $this -> setError("Err:1", __FUNCTION__, __LINE__, __FILE__, __CLASS__, E_USER_ERROR); } if(method_exists($this -> $MODULE['NAME'], "initError")){ $this -> $MODULE["NAME"] -> initError(); } }else{ return $this -> setError("Err:2", __FUNCTION__, __LINE__, __FILE__); } define($CONST, true); $this -> LOAD_MODULE[] = $MODULE; return true; } [/PHP] Она порверяет по константе, был ли класс инициализирован. Наверное, опять не очень обяснил суть. :( Нужно предвидеть, что где-то он може инициализироватся. Тоесть, есть ядро, к которому подключаются модули (классы). Также есть дефоултные, которые поргрузятся обезательно в начале загрузки ядра. Вот к примеру одним из модулей есть CHPU (ЧПУ). Он загружается в память вмете с ядром. Если кто-то его опять вызвет, он опять создастся: [PHP] $R = new CHPU();//получили еще одну копию :) [/PHP] Вот именно на этой строчке мне нужно запретить, вернуть ошибку. P.S. Ядро слаживается не для меня, а для многих сайтов. Если бы только я ним управлял, то на такие мелочи можна было б внимание не давать. А так я не знаю, кто за него сядет. В результате, нужно порверять и предвидеть все ошибки. |
|
|
Letmetouchyou |
23.6.2010, 16:47;
Ответить: Letmetouchyou
Сообщение
#4
|
|
alexdrob, а что значит & перед названием функции?
|
|
|
alexdrob |
23.6.2010, 17:09;
Ответить: alexdrob
Сообщение
#5
|
|
просто с функцией getInstance вы не выделите память еслу уже создан объект, а вот если 2 раза вызвать
[PHP]$R = new A(); $B = new A();[/PHP] то я думаю память выделится в любом случае вы можете вернуть ошибку с конструктора но память выделена будет. Letmetouchyou, просто тут [PHP]$R = &A::getInstance(); [/PHP] мы получаем указатель на класс |
|
|
ZhukV
|
Сообщение
#6
|
|
то я думаю память выделится в любом случае вы можете вернуть ошибку с конструктора но память выделена будет. Вполне согласен. Вот тут и прикол. Нужно запретить вызов класса. Пробывал также __autoload(class), не проходит. а что значит & перед названием функции? Это жесткая ссылка на переменную. Вот к примеру при вызове какой то функции, Вам нужно передать уже существующую переменную. Вот к примеру: [PHP] $array = array(); //В мамяти уже есть массив function add_to_array(&$a){ $a[] = count($a); /* именно вот здесь и прикол. При помощи & Вы указали, что эта жесткая ссылка на переменную, и нужно изменять тот массив, на который указывает эта ссылка */ } add_to_array($array); [/PHP] Из этого простого примера видно, что функция не возвращает ничего, а только добавляет запись в массив, на который установлены эта ссылка. Вот некоторая подобная функция: [PHP] //Функция ПАПКОПОТРОШИЛКА function Directory($DIR, &$ARRAY_DIR = array()){ $H = opendir($DIR); while($file = readdir($H)){ if( $file!=="." && $file!==".."){ if(preg_match('/\./', $file)){ $ARRAY_DIR[] = $DIR . "/" . $file; }else{ Directory($DIR . "/" . $file, $ARRAY_DIR); } } } closedir($H); } [/PHP] Вызови из любого корня сайта, увидиш [PHP] Directory($_SERVER['DOCUMENT_ROOT'], $R); print_r($R); [/PHP] Думаю, что этой функцией все и объясняется |
|
|
Mulder_hb |
23.6.2010, 20:45;
Ответить: Mulder_hb
Сообщение
#7
|
|
Как можна запретить вызов класса? Проверять в вызывающей программе был ли уже инициализирован класс? [php] class Counter { public static $count = 0; public function __construct() { self::$count++; } public function __destruct() { self::$count--; } } if (!isset(Counter::$count) OR Counter::$count == 0) { $a = new Counter(); } [/php] |
|
|
alexdrob |
23.6.2010, 21:08;
Ответить: alexdrob
Сообщение
#8
|
|
зачем велосипеды опять, придумали давно и пользуются))
http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования) |
|
|
Mulder_hb |
24.6.2010, 0:00;
Ответить: Mulder_hb
Сообщение
#9
|
|
зачем велосипеды опять, придумали давно и пользуются)) http://ru.wikipedia.org/wiki/Одиночк...проектирования) Ссылку режет форум. Разместите ее под тегами code. Нашел уже сам. Вот поэтому я и не пишу уроки. Я считаю себя новичком, многое еще не знающего. |
|
|
alexdrob |
24.6.2010, 0:19;
Ответить: alexdrob
Сообщение
#10
|
|
|
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
PROXY-SALE.COM - Приватные прокси премиум класса IPv4/IPv6 socks5/https. Поддержка 24/7, 30+ локаций | 51 | Makez | 43493 | 17.5.2023, 15:43 автор: Makez |
|
CrakRevenue "Декабрьский Вызов!" | 0 | joncrakrevenue | 996 | 30.11.2021, 18:54 автор: joncrakrevenue |
|
Запрет о копировании материалов | 5 | Info-Mans | 1293 | 3.2.2015, 17:24 автор: Info-Mans |
|
Запрет вывода при другом разрешение | 2 | Barmaley | 6275 | 14.12.2014, 3:47 автор: -danil-html- |
|
Запрет входа на сайт через IE | 5 | rasanau | 8984 | 10.8.2013, 17:36 автор: -crotone- |
Текстовая версия | Сейчас: 28.3.2024, 19:11 |