вызов include/require из под __destruct

running

Новичок
Столкнулся с интересним моментом. Есть функция которая инклудит нужный файл. Если эту функцию писать в __construct всё выполняется без каких либо проблем. Но если её перенести в __destruct (сам вызов функции само собой) тогда include\reuqire тупо не срабатывают и скрипт "дохнет" на этом месте.

С чем это может быть связано?
 

Beavis

Banned
когда скрипт дохнет, в логах появляются описания ошибок
 

AmdY

Пью пиво
Команда форума
нужно помнить, что в деструкторе нельзя бросать исключения
 

korpus

злой бобёр
У меня проблемы были даже когда подключался файл внутри любого метода класса. Я пытался подключит некий файл с заданными переменными внутри.
Зачем в деструкторе что-то подключать, когда он предназначен для уничтожения класса? Не надо использовать такие выверты.
 

weregod

unserializer
running,
test.php
PHP:
<?php

error_reporting(E_ALL);

class Foo
{
    public function __destruct()
    {
        echo '[', __LINE__, '] ', __FILE__, "\n";
        require 'included.from.destructor.php';
    }
}

new Foo;

included.from.destructor.php
PHP:
<?php

echo '[', __LINE__, '] ', __FILE__, "\n";
PHP 5.3.6 (cli) (built: Mar 17 2011 10:37:07)
Код:
> php -v
PHP 5.3.6 (cli) (built: Mar 17 2011 10:37:07)

> php test.php
[9] F:\test.php
[3] F:\included.from.destructor.php
 

korpus

злой бобёр
Значит PHP был старой версии или что-то ещё такое было, что повлияло на результат. Сейчас не узнать.
 

running

Новичок
ответ оказался проще чем думается, все думаю знают _getcwd(). Не могу даже предположить по каким причинам но в конструкторе путь "родной" (правильный) а в дестракторе совершенно другой, поэтому и файлы не инклудились

PS: смени прицеп, теперь через define создаю путь к файлам и по ним инклудю
 

running

Новичок
а по поводу "Зачем в деструкторе что-то подключать, когда он предназначен для уничтожения класса?"

у меня в деструкторе вызывается "подключить обьект и запустить его метод" (само собой там не код, а всего лишь вызов нужной функции). т.е. при самом создании класса - создаются\считаются данные, после уже "когда весь класс" пробежали - запускаем действие (метод) + показываем что получилось (самый последний метод что выполняется в __destruct)

возможно это не правильный подход, но на данный момент такой вариант мне подходит

да и я не увидел нислова о "предназначен для уничтожения класса"
void __destruct ( void )

PHP 5 предоставляет концепцию деструкторов, сходную с теми, что применяются в других ОО языках, таких, как C++. Деструктор будет вызван при освобождении всех ссылок на определенный объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).
 

Sufir

Я не волшебник, я только учусь
Ну дак:
PHP 5 предоставляет концепцию деструкторов, сходную с теми, что применяются в других ОО языках, таких, как C++.
Дестуктор в общем-то во всех языках служит для уничтожения объекта.
 

running

Новичок
Дестуктор в общем-то во всех языках служит для уничтожения объекта.
Хотите сказать что функция __destruct() "уничтожает" обьект? Да ладно.... Насколько описано выше, эта функция вызывается сама когда обьект полностью сформирован.

Не знаю как там в C++, но по факту мы ведь сейчас говорим о php . . .
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Хотите сказать что функция __destruct() "уничтожает" обьект? Да ладно.... Насколько описано выше, эта функция вызывается сама когда обьект полностью сформирован.
где там такое написано?
 
Сверху