X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> запрет на повторный вызов класса
ZhukV
ZhukV
Topic Starter сообщение 23.6.2010, 15:53; Ответить: ZhukV
Сообщение #1


Здарова всем.
Опять с этим ООП лажа
Как можна запретить вызов класса?
Ну типа такого:
[PHP]
class A{
/*...*/
}
$R = new A();

$B = new A();//вот здесь нужно запретить
[/PHP]
Пробывал использовать __destruct() и unset($this), не помогает. Объект все равно находится в памяти :(
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
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
ZhukV
Topic Starter сообщение 23.6.2010, 16:37; Ответить: 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
Letmetouchyou
сообщение 23.6.2010, 16:47; Ответить: Letmetouchyou
Сообщение #4


alexdrob, а что значит & перед названием функции?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
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
ZhukV
Topic Starter сообщение 23.6.2010, 17:30; Ответить: ZhukV
Сообщение #6


(alexdrob @ 23.6.2010, 20:09) *
то я думаю память выделится в любом случае вы можете вернуть ошибку с конструктора но память выделена будет.

Вполне согласен.
Вот тут и прикол. Нужно запретить вызов класса.
Пробывал также __autoload(class), не проходит.
(Letmetouchyou @ 23.6.2010, 19:47) *
а что значит & перед названием функции?

Это жесткая ссылка на переменную.
Вот к примеру при вызове какой то функции, Вам нужно передать уже существующую переменную.
Вот к примеру:
[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
Mulder_hb
сообщение 23.6.2010, 20:45; Ответить: Mulder_hb
Сообщение #7


(ZhukV @ 23.6.2010, 18:53) *
Как можна запретить вызов класса?

Проверять в вызывающей программе был ли уже инициализирован класс?
[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
alexdrob
сообщение 23.6.2010, 21:08; Ответить: alexdrob
Сообщение #8


зачем велосипеды опять, придумали давно и пользуются))
http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 24.6.2010, 0:00; Ответить: Mulder_hb
Сообщение #9


(alexdrob @ 24.6.2010, 00:08) *
зачем велосипеды опять, придумали давно и пользуются))
http://ru.wikipedia.org/wiki/Одиночк...проектирования)

Ссылку режет форум. Разместите ее под тегами code.

Нашел уже сам.

Вот поэтому я и не пишу уроки. Я считаю себя новичком, многое еще не знающего.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.6.2010, 0:19; Ответить: alexdrob
Сообщение #10


(Mulder_hb @ 24.6.2010, 03:00) *
Вот поэтому я и не пишу уроки. Я считаю себя новичком, многое еще не знающего.

да я против вашего способа и не сказал не чего) тоже хороший способ, просто автору не нравится не тот видимо не тот)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлы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-


 



RSS Текстовая версия Сейчас: 28.3.2024, 17:54
Дизайн