Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Codeigniter 2.0 и Деструкторы, Почему не работают деструкторы? 
:(
    Опции темы
WolfAlone
Дата 10.6.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



Добрый день! Вношу изменения в проект на Codeigniter 2.0.

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

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


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


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
SneG0K
Дата 11.6.2011, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



Как минимум для начала включить вывод ошибок и прочитать, что там написано.
PM WWW Skype   Вверх
WolfAlone
Дата 13.6.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



Написано, что вот эта функция не может найти файл (include error)

Код

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

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

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

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


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

Код

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

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


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
WolfAlone
Дата 14.6.2011, 00:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



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

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

Это сообщение отредактировал(а) WolfAlone - 14.6.2011, 00:07


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Shogun
Дата 14.6.2011, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



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

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




--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
MoLeX
Дата 14.6.2011, 06:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



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  


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
WolfAlone
Дата 14.6.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



MoLeX, спасибо большое!

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


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
MoLeX
Дата 14.6.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



имхо, так поведут себе большинство фр-ков

Это сообщение отредактировал(а) MoLeX - 14.6.2011, 12:21


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
SneG0K
Дата 16.6.2011, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



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

Это сообщение отредактировал(а) SneG0K - 16.6.2011, 08:13
PM WWW Skype   Вверх
MoLeX
Дата 16.6.2011, 08:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



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

почему же?

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

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


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
SneG0K
Дата 17.6.2011, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



MoLeX, ты Бетменsmile
PM WWW Skype   Вверх
MoLeX
Дата 17.6.2011, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



 smile 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
WolfAlone
Дата 2.7.2011, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



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


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
systemIV
Дата 2.7.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 28.3.2011

Репутация: -1
Всего: -1



Насколько мне известно в CI только недавно появилась поддержка php5. Возможно там деструкторы ещё не реализованы
PM ICQ Skype   Вверх
WolfAlone
Дата 2.7.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: 1
Всего: 5



Цитата(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!"; //Это будет работать.
}



--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1326 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.