С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 05/01/07 в 16:23 |
Столкнулся на днях с интересным моментом.
Код: |
class Page_Video {
public function __construct()
{
require_once('content/template/header.php');
require_once('content/template/footer.php');
}
}
|
работает, а так - нет
Код: |
class Page_Video {
public function __construct()
{
require_once('content/template/header.php');
}
public function __destruct()
{
require_once('content/template/footer.php');
}
}
|
говорит
Цитата: | Warning: Page_Video::require_once(content/template/footer.php) [function.Page-Video-include-once]: failed to open stream: No such file or directory... |
или что, деструктор выполняется как-то иначе?
|
|
|
|
С нами с 18.01.06
Сообщения: 322
Рейтинг: 487
|
Добавлено: 05/01/07 в 16:53 |
Э-э, честно говоря не понял при чем тут деструктор, если не ошибаюсь то ошибка связана с открытием файла
Стукнись в асю, пообщаемся на эту тему
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 05/01/07 в 16:54 |
бага. А вообще под 5 пока советую не писать, через чур специфично и непредсказуемо.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
6
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 05/01/07 в 17:49 |
попробуй с абсолютными путями, работает нет?
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 05/01/07 в 19:16 |
В деструкторе написал чем получил текущую директорию - . Весьма странно получается. Тем более директория нигде не меняется..
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 05/01/07 в 19:59 |
1)Такое писать вообще нельзя , это не ООП , а ононизм в особо извращенной форме и непонимание для чего нужны конструктор\деструктор, собствено и ООП в целом.
2) set_include_path
Последний раз редактировалось: xreload (05/01/07 в 20:41), всего редактировалось 1 раз
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 05/01/07 в 20:35 |
xreload писал: | 1)Такое писать вообще нельзя , это не ООП , а ононизм в особо извращенной форме и непонимание для чего нужны конструктор\деструктор.
2) set_include_path |
Речь идёт не о ООП, не онанизме и даже не об конструкторах; вопрос о том, как и почему меняется текущая директория в деструкторе.
|
|
|
|
С нами с 18.01.06
Сообщения: 322
Рейтинг: 487
|
Добавлено: 05/01/07 в 20:38 |
имхо, скорее всего это недокументированный баг ПХП5, выход тока юзать пути абсолютные
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 05/01/07 в 20:43 |
samedi писал: | Речь идёт не о ООП, не онанизме и даже не об конструкторах; вопрос о том, как и почему меняется текущая директория в деструкторе. |
потому что ты не умеешь писать программы на php с использованием ООП и не имеешь не мальйшего понятия как оно работает, доступно объяснил ?
Как только ты будешь делать это правильно , вопросов возникать у тебя не будет.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 05/01/07 в 21:16 |
xreload: бывает так, что "специальное неправильное" написание позволяет увеличить скорость в несколько раз.
А там уже не так и важно, правильное ООП или нет.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
6
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 05/01/07 в 21:30 |
на собственном опыте убедился что лучше сразу юзать абсолютные пути.
так что наличие относительных путей сразу вводит в настороженность, кабы гдебы не потерять директорию
|
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 05/01/07 в 22:02 |
samedi писал: | В деструкторе написал чем получил текущую директорию - . Весьма странно получается. Тем более директория нигде не меняется.. |
а как установлен php как модуль апача?
впринципе возможно это совсем и не баг... нужно понимать что есть деструктор для чего он служит и когда он вызывается.
вот что до слолвно написано в одной моей книженции по php
Цитата: | Деструктор - это специальный метод класса с именем __destructor, который будет гарантированно вызван при потере последней ссылки на объект в программе. Так как деструктор запускается самим php, он не должен принимать никаких параметров. |
может в этом и причина.
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 05/01/07 в 23:08 |
Stek я согласен с тобой , что иногда в обход правил нужно делать по-другому и это дает гораздо большую пользу , однако у нас тут конкретный случай , по нему я и написал.
О ! Наконец , хоть кто-то додумался залезть в книгу и прочитать , а не кричать о багах...и вспомнить,
что деструктор это - не просто функция.
p.s.
Кстати если бы автор и некоторые выступившие был бы внимателены и имел базовые понятия синтаксиса ООП в php , то заметили бы :
samedi писал: |
Warning: Page_Video(->)::(<-)require_once(content/template/footer.php) [function.Page-Video-include-once]: failed to open stream: No such file or directory...
|
Что говорит о том , что дестркутор думает - что это функция-член класса Page_Video , а не оператор.
И не какие пути там непричем!
И правильно думает , т.к. еще одно отличие деструктора , в том что он выполняется неявно и разрешения такой конструкции привело бы к непредсказуемому поведению деструктора и потом бы на конференциях по php говорил бы не только об register globals , но и о том как хуево вставлять include в дестркуторы :)
Последний раз редактировалось: xreload (05/01/07 в 23:57), всего редактировалось 8 раз(а)
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 05/01/07 в 23:41 |
По всей видимости механизм работы деструктора схож с функцией register_shutdown_function. Эта функция присутствовала еще до 5го пхп, и выполняет код при завершении работы скрипта. Т.е. гарантирует, что в каком бы месте не завершился скрипт (и каким бы образом, в т.ч. с ошибкой) код функции будет выполнен. Что написано по ней: http://www.php.net/manual/en/function.register-shutdown-function.php
Как раз очень похоже на то, о чем ты говорил. Насчет путей сталкивался сам, но там еще что то про буфферизацию, и еще какие-то нюансы. Так что тут надо акуратнее.
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 06/01/07 в 12:52 |
xreload во многом ты прав. Но вопрос не про это. Вопрос про то, как, почему и когда меняются пути в деструкторах. И, согласись, это вполне реальная ситуация, которая может встретиться.
|
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 06/01/07 в 14:03 |
samedi писал: | Вопрос про то, как, почему и когда меняются пути в деструкторах. И, согласись, это вполне реальная ситуация, которая может встретиться. |
вопрос в том кто именно вызывает деструктор и когда,
я писал выше что написанно в одной книге по пхп про деструктор. Более подробной инфо я не нашел нигде, потому вопрос не совсем ясен, но если думать как написанно там то у меня появляются мысли что деструктор вызывается как раз из вне... а если деструктор вызывается из вне то и рабочая директория будет той откуда он вызвался, в данном случае \usr\local\apache
Деструктор служит для освобождения ресурсов, это его основное и единственное назначение, потому абсолютно не важно откуда он вызвался.
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 06/01/07 в 15:31 |
Используй абсолютные пути. Конечно неудобно в большинстве случаев, поэтому хинт: попробуй в деструкторе получить имя выполняемого скрипта и выдернуть оттуда путь.
|
|
|
|
С нами с 24.03.03
Сообщения: 569
Рейтинг: 278
|
Добавлено: 14/01/07 в 13:09 |
require_once($_SERVER['DOCUMENT_ROOT']. "/content/template/header.php");
|
|
|
|