Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Codeigniter 2.0 и Деструкторы


Автор: WolfAlone 10.6.2011, 18:40
Добрый день! Вношу изменения в проект на Codeigniter 2.0.

Немного переписал контроллер, для удобства:
Код

__destruct() {
$this->load->view('view', $data);
}


При использовании функции ВНЕ деструктора - всё работает отлично. При попытке перенести её в деструктор - возникает "Ошибка 500". Можно это как-то исправить?

Автор: SneG0K 11.6.2011, 10:14
Как минимум для начала включить вывод ошибок и прочитать, что там написано.

Автор: WolfAlone 13.6.2011, 00:17
Написано, что вот эта функция не может найти файл (include error)

Код

include(APPPATH.'errors/error_php'.EXT);

Хотя, файл там есть 100%.

Сделал проще. Открыл строку где вызывалась эта функция, закомментировал её... Ошибки больше нет, но теперь деструктор просто НЕ работает. То есть:
Код

$this->load->view('view1'); //не приводит к желаемому результату!


Добавлено через 3 минуты и 6 секунд
Точнее будет сказать, деструктор сам по себе вообще работает, например:

Код

function __destruct() {
echo "Hello world";
}

Работает как надо! А вот, код приведённый выше не работает. Причём не работает он исключительно в деструкторе!

Автор: WolfAlone 14.6.2011, 00:07
Уважаемые коллеги, никто и никогда не пытался править чужие проекты на CI 2.0 (или создавать свои) или просто никто и никогда не использовал в CI 2.0 деструкторы?

P.S. Начинаю подозревать, что как только программист доходит до полного понимания ООП и деструкторов в частности - он переходит на более продвинутый FW...  smile  Но в таком случае, остаётся вопрос, как быть с кодом написанным кем-то другим, и на CI... переписывать весь проект что-то мне не хочется!

Автор: Shogun 14.6.2011, 01:14
Попробуйте через try / catch словить ошибку в деструкторе и записать в лог фаил, может что-то прояснится.
Можно также сохранить дамп на $this и проверить может чего не хватает.

А вообще ошибка 500 это "Internal Server Error - Внутренняя ошибка сервера", непонятно как она может тут вылезть.


Автор: MoLeX 14.6.2011, 06:31
destruct - происходит во время уничтожения класса. Причем, самый ранний класс уничтожится самым первым. 
Пример
Код

class Test1{
    
    function __construct()
    {
        echo __METHOD__.'<br />';
    }
    
    function  __destruct()
    {
        echo __METHOD__.'<br />';
    }
}

class Test2{
    
    function __construct()
    {
        echo __METHOD__.'<br />';
    }
    
    function  __destruct()
    {
        echo __METHOD__.'<br />';
    }
}
new Test1();
new Test2();


в итоге получим 
Код

Test1::__construct
Test1::__destruct
Test2::__construct
Test2::__destruct



Соответственно твой код не будет работать, если уже завершилось ядро фр-ка, а оно уже завершилось  smile  

Автор: WolfAlone 14.6.2011, 11:16
MoLeX, спасибо большое!

P.S. Чем больше работаю с CodeIgniter (в большинстве случаев по необходимости, а не по собственному желанию) - тем меньше он мне нравиться!

Автор: MoLeX 14.6.2011, 12:20
имхо, так поведут себе большинство фр-ков

Автор: SneG0K 16.6.2011, 08:13
Хм, вот сейчас столкнулся с такой-же ситуацией, у меня класс User в методе __destruct() должен был сохранять свои настройки в базу, но по-скольку класс адаптер к БД уже уничтожен, то вылетает ошибка.
Как тогда поступать в такой ситуации? Использовать какой-то метод, который будет вызываться до деструктора?
Я думаю это большое упущение PHP в целом, а не конкретного фреймворка(хотя кто его знает, может это и плюс).

Автор: MoLeX 16.6.2011, 08:17
Цитата(SneG0K @  16.6.2011,  08:13 Найти цитируемый пост)
Я думаю это большое упущение PHP в целом

почему же?

SneG0K, WolfAlone, есть решение в лоб - объявить перед всеми классами свой, в котором и делать деструктор. Но это не красиво

Добавлено через 4 минуты и 27 секунд
может стоит глянуть на альтернативу? http://ru2.php.net/register_shutdown_function

Автор: SneG0K 17.6.2011, 05:12
MoLeX, ты Бетменsmile

Автор: MoLeX 17.6.2011, 06:51
 smile 

Автор: WolfAlone 2.7.2011, 15:42
В CI 2.0 нет случайно какого-нибудь хука, для вызова некоей функции, которая бы выполнила роль деструктора?

Автор: systemIV 2.7.2011, 20:02
Насколько мне известно в CI только недавно появилась поддержка php5. Возможно там деструкторы ещё не реализованы

Автор: WolfAlone 2.7.2011, 23:13
Цитата(MoLeX @  14.6.2011,  12:20 Найти цитируемый пост)
имхо, так поведут себе большинство фр-ков


Последнее время (около года), в случае необходимости использования FW - мы применяем Yii и некоторые другие фреймворки (CodeIgniter не входит в их список). В них необходимости использования деструкторов либо не возникает вообще, либо этой проблемы не существует, либо для неё есть решение средствами самого FW.

То есть, в данный момент "проблема деструкторов" лично для меня существует только в CodeIgniter, а так как проекты переписывать не очень хочется (иногда они бывают реально "не маленькие") - приходится решать проблему именно в рамках данного FW.

На данный момент "извращения" дошли до того, что пришлось написать свои функции для рендеринга (т.к. в CI нет такого понятия как "layout"). И постоянно вызывать функцию типа:
Код

self::render();

что крайне не удобно, в виду чего я и хотел засунуть её в деструктор... *но из этого ничего не вышло.

И это лишь одна из "проблем" встречающаяся в этом FW (*лично для меня).

Цитата(systemIV @  2.7.2011,  20:02 Найти цитируемый пост)
Насколько мне известно в CI только недавно появилась поддержка php5. Возможно там деструкторы ещё не реализованы 

Я бы сказал не "появилась поддержка PHP-5", а скорее "исчезла поддержка PHP-4"... Деструкторы "там" реализованы, но в деструкторе нельзя вызывать ничего, что касается самого CI, то есть функции CI в деструкторе использовать нельзя. Например:
Код

$this->load->view('view_name'); //Вызвать это в деструкторе не получится.

за то
Код

__destruct() {
    echo "Hello world!"; //Это будет работать.
}

Автор: systemIV 3.7.2011, 11:41
Цитата(WolfAlone @  2.7.2011,  23:13 Найти цитируемый пост)
На данный момент "извращения" дошли до того, что пришлось написать свои функции для рендеринга (т.к. в CI нет такого понятия как "layout"). И постоянно вызывать функцию типа:

просто используй yii

Автор: WolfAlone 3.7.2011, 15:23
Цитата(systemIV @  3.7.2011,  11:41 Найти цитируемый пост)
просто используй yii 

Дело в том, что я и так не редко использую в т.ч. и YII (о чём я собственно и писал выше). Но, переносить готовый проект солидного размера с CI на YII или другой FW... - занятие мало рациональное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)