Реклама на сайте Advertise with us

PHP Конструктируем и декструктируем

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 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...

или что, деструктор выполняется как-то иначе?

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 18.01.06
Сообщения: 322
Рейтинг: 487

Ссылка на сообщениеДобавлено: 05/01/07 в 16:53       Ответить с цитатойцитата 

Э-э, честно говоря не понял при чем тут деструктор, если не ошибаюсь то ошибка связана с открытием файла
Стукнись в асю, пообщаемся на эту тему

3
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 05/01/07 в 16:54       Ответить с цитатойцитата 

бага. А вообще под 5 пока советую не писать, через чур специфично и непредсказуемо.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

6
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 05/01/07 в 17:49       Ответить с цитатойцитата 

попробуй с абсолютными путями, работает нет?

3
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 05/01/07 в 19:16       Ответить с цитатойцитата 

В деструкторе написал
Код:
echo getcwd();
чем получил текущую директорию -
Код:
l:\usr\local\apache
. Весьма странно получается. Тем более директория нигде не меняется..

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362

Ссылка на сообщениеДобавлено: 05/01/07 в 19:59       Ответить с цитатойцитата 

1)Такое писать вообще нельзя , это не ООП , а ононизм в особо извращенной форме и непонимание для чего нужны конструктор\деструктор, собствено и ООП в целом.

2) set_include_path

Последний раз редактировалось: xreload (05/01/07 в 20:41), всего редактировалось 1 раз

-3
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 05/01/07 в 20:35       Ответить с цитатойцитата 

xreload писал:
1)Такое писать вообще нельзя , это не ООП , а ононизм в особо извращенной форме и непонимание для чего нужны конструктор\деструктор.

2) set_include_path


Речь идёт не о ООП, не онанизме и даже не об конструкторах; вопрос о том, как и почему меняется текущая директория в деструкторе.

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 18.01.06
Сообщения: 322
Рейтинг: 487

Ссылка на сообщениеДобавлено: 05/01/07 в 20:38       Ответить с цитатойцитата 

имхо, скорее всего это недокументированный баг ПХП5, выход тока юзать пути абсолютные

1
 



С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362

Ссылка на сообщениеДобавлено: 05/01/07 в 20:43       Ответить с цитатойцитата 

samedi писал:
Речь идёт не о ООП, не онанизме и даже не об конструкторах; вопрос о том, как и почему меняется текущая директория в деструкторе.



потому что ты не умеешь писать программы на php с использованием ООП и не имеешь не мальйшего понятия как оно работает, доступно объяснил ?
Как только ты будешь делать это правильно , вопросов возникать у тебя не будет.

-3
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 05/01/07 в 21:16       Ответить с цитатойцитата 

xreload: бывает так, что "специальное неправильное" написание позволяет увеличить скорость в несколько раз.
А там уже не так и важно, правильное ООП или нет.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

6
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 05/01/07 в 21:30       Ответить с цитатойцитата 

на собственном опыте убедился что лучше сразу юзать абсолютные пути.
так что наличие относительных путей сразу вводит в настороженность, кабы гдебы не потерять директорию

2
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 05/01/07 в 22:02       Ответить с цитатойцитата 

samedi писал:
В деструкторе написал
Код:
echo getcwd();
чем получил текущую директорию -
Код:
l:\usr\local\apache
. Весьма странно получается. Тем более директория нигде не меняется..

а как установлен php как модуль апача?
впринципе возможно это совсем и не баг... нужно понимать что есть деструктор для чего он служит и когда он вызывается.
вот что до слолвно написано в одной моей книженции по php
Цитата:
Деструктор - это специальный метод класса с именем __destructor, который будет гарантированно вызван при потере последней ссылки на объект в программе. Так как деструктор запускается самим php, он не должен принимать никаких параметров.

может в этом и причина.

5
 



С нами с 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 раз(а)

-3
 



С нами с 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
Как раз очень похоже на то, о чем ты говорил. Насчет путей сталкивался сам, но там еще что то про буфферизацию, и еще какие-то нюансы. Так что тут надо акуратнее.

2
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 06/01/07 в 12:52       Ответить с цитатойцитата 

xreload во многом ты прав. Но вопрос не про это. Вопрос про то, как, почему и когда меняются пути в деструкторах. И, согласись, это вполне реальная ситуация, которая может встретиться.

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 06/01/07 в 14:03       Ответить с цитатойцитата 

samedi писал:
Вопрос про то, как, почему и когда меняются пути в деструкторах. И, согласись, это вполне реальная ситуация, которая может встретиться.

вопрос в том кто именно вызывает деструктор и когда,
я писал выше что написанно в одной книге по пхп про деструктор. Более подробной инфо я не нашел нигде, потому вопрос не совсем ясен, но если думать как написанно там то у меня появляются мысли что деструктор вызывается как раз из вне... а если деструктор вызывается из вне то и рабочая директория будет той откуда он вызвался, в данном случае \usr\local\apache
Деструктор служит для освобождения ресурсов, это его основное и единственное назначение, потому абсолютно не важно откуда он вызвался.

1
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 06/01/07 в 15:31       Ответить с цитатойцитата 

Используй абсолютные пути. Конечно неудобно в большинстве случаев, поэтому хинт: попробуй в деструкторе получить имя выполняемого скрипта и выдернуть оттуда путь.

1
 



С нами с 24.03.03
Сообщения: 569
Рейтинг: 278

Ссылка на сообщениеДобавлено: 14/01/07 в 13:09       Ответить с цитатойцитата 

require_once($_SERVER['DOCUMENT_ROOT']. "/content/template/header.php");

-3
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »