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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не совсем понятный пример из ZEND cerification boo 
V
    Опции темы
Muerto
Дата 10.9.2010, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 4



Хочу пройти сертификацию Zend, и изучаю ихнею книгу...

Наткнулся на такой пример (Страницы 34 если это кому то важно)
Код

$oldErrorHandler = ’’;
function myErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext) {
global $oldErrorHandler;
logToFile("Error $errStr in $errFile at line $errLine");
// Call the old error handler
if ($oldErrorHandler) {
$oldErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext);
}
}
$oldErrorHandler = set_error_handler (’myErrorHandler’);



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

Код

$oldErrorHandler = ’’;//здесь вопросов нету...
function myErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext) {//здесь вопросов нету...
global $oldErrorHandler;//вОт здесь начинается лажа...
logToFile("Error $errStr in $errFile at line $errLine");//Отлично записали в лог ошибок, теперь можно заканчивать функцию, но нет...
// Call the old error handler
if ($oldErrorHandler) {//Все бы от лично, но мы уже писали в лог... нафиг опять? здесь else если уже нужно ставить
$oldErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext);//ну и нафиг надо? уже записали в лог... чего добиваемся?
Рискну опозориться и сказать что такой вызов может вообще запустить функцию рекурсивно+ бесконечно ибо конца здесь нету...
}
}
$oldErrorHandler = set_error_handler (’myErrorHandler’);//все бы хорошо если бы это не запускало имхо бесконечный цикл



По мне так ихний пример кароч, создает бесконечный цикл рекурсивно...






--------------------
user posted image
PM MAIL   Вверх
IgorIV
Дата 10.9.2010, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 8



Создается массив, а не вызов функции. Я так вижу ...
PM MAIL   Вверх
SneG0K
Дата 10.9.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Рекурсии не будет. Сначала вызовется новый обработчик, далее старый и все. Не похоже ли?
Код

class A {
    public function __construct() {
        echo 'A';
    }
}

class B extends A{
    public function __construct() {
        echo 'B';
        parent::__construct();
    }
}

new B;


Добавлено @ 10:06
Тут что-то вроде этого, только без ООП

Добавлено через 12 минут и 32 секунды
Только вот зачем?

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


Эксперт
***


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

Репутация: 3
Всего: 4



SneG0K, Мне не очень понятно...

Если мы сделали вот такое 
Код

$oldErrorHandler = set_error_handler (’myErrorHandler’);

То что получил $oldErrorHandler ?
И что собственно сделает вызов $oldErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext);

Будет дли двойная запись в лог? или даже этого не будет?


--------------------
user posted image
PM MAIL   Вверх
enoff
Дата 10.9.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



set_error_handler возвращает предыдущий обработчик ошибок, если он был.
В callback функции выполняются нужные действия + вызывается старый обработчик.
Цитата(Muerto @  10.9.2010,  12:10 Найти цитируемый пост)
Будет дли двойная запись в лог?

Зависит от реализации стандартного и своего обработчика.

Добавлено через 1 минуту и 30 секунд
Например logToFile() пишет ошибку в лог, а $oldErrorHandler выводит ошибку и завершает работу скрипта.
PM MAIL ICQ Skype GTalk   Вверх
Muerto
Дата 10.9.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 4



В общем я тупанул немного... но тем не менее не до конца ещё ясно что тут к чему...
Я чет когда с книги смотрел, не заметил что logToFile это функция которая не часть php и её нужно писать...

Протестировал немного, и ещё больше запутался

Код

<?php
$a = '';
function myErrorHandler2 ($errNo, $errStr, $errFile, $errLine, $errContext) {
global $a;
if ($a) {
echo "$errNo, $errStr, $errFile, $errLine, $errContext";
$a($errNo, $errStr, $errFile, $errLine, $errContext);
}
}
$a = set_error_handler ('myErrorHandler2');
$gaga=$blaba+$zus;
?>


Этот код, НИЧЕГО НЕ ВЫВОДИТ

если пытаться посмотреть что в $a , то там пустота...
в тот час как 
Код

echo set_error_handler ('myErrorHandler2');
 выводит myErrorHandler2

Если же записать
Код

 echo "$errNo, $errStr, $errFile, $errLine, $errContext";


до IF
то выведет...

Значит свою роль оно делает... оно назначило функцию myErrorHandler2 как наш оброботчик ошибок...
но зачем мы просто не  сделали 
set_error_handler ('myErrorHandler2');
А сделали $a=set_error_handler ('myErrorHandler2');
Для меня все же загадка

К примеру если после

Код

$a = set_error_handler ('myErrorHandler2');


добавить
Код

$a='myErrorHandler2';

У нас будет рекурсивный вызов...и вам распечатает 8, Undefined variable: zus, /home/tim/www/linux.rf/test.php, 14, Array8, пару десятков тысач раз


Поэтому с моей точки зрения пример просто ужастный... цель $a = set_error_handler все же не понятна увы

Это сообщение отредактировал(а) Muerto - 10.9.2010, 13:34


--------------------
user posted image
PM MAIL   Вверх
enoff
Дата 10.9.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Muerto @  10.9.2010,  14:29 Найти цитируемый пост)
цель $a = set_error_handler все же не понятна увы

Есть обработчик ошибок. Как уже говорил, например, он выводит ошибку на экран и останавливает работу скрипта.
Нам нужно расширить этот обработчик, добавить запись в лог.
Пишем свою функцию, записываем в лог, а в конце вызывает старый обработчик, если он существует.

Что тут непонятно?

Код снежка в начале темы показывает, что когда вызывается.
Код

$oldErrorHandler = '';
function myErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext) { //Callback функция для обработки ошибок.
global $oldErrorHandler;
logToFile("Error $errStr in $errFile at line $errLine"); //Делаем, что хотели.
// Call the old error handler
if ($oldErrorHandler) { //Если был обработчик до установки пользовательской функции
$oldErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext); //Вызываем его!!!
}
}
$oldErrorHandler = set_error_handler (’myErrorHandler’); //Устанавливаем новый обработчик, старый сохраняем в переменную.


Добавлено @ 14:23
В переменной $oldErrorHandler содержится название старой функции.

upd
Может быть непонятно
Код

$var($args); //???


upd2
Цитата(Muerto @  10.9.2010,  14:29 Найти цитируемый пост)
У нас будет рекурсивный вызов...и вам распечатает 8, Undefined variable: zus, /home/tim/www/linux.rf/test.php, 14, Array8, пару десятков тысач раз

ну да, еще можно в while(true){} засунуть, эффект тот же. Степень бредовости тоже.

Это сообщение отредактировал(а) enoff - 10.9.2010, 14:41
PM MAIL ICQ Skype GTalk   Вверх
Muerto
Дата 10.9.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 4



Я себе примерчик намутил и примерно стало ясно что оно делает...
Код

<?php
$a = '';
function myErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext){
echo "xxx<br/>";
}
function myErrorHandler2 ($errNo, $errStr, $errFile, $errLine, $errContext){
echo "zzz<br/>";
}
function myErrorHandler3 ($errNo, $errStr, $errFile, $errLine, $errContext) {
global $a;
//logToFile("Error $errStr in $errFile at line $errLine");
// Call the old error handler  echo "$errNo, $errStr, $errFile, $errLine, $errContext";
if ($a) {
echo "yyy<br/>";
$a($errNo, $errStr, $errFile, $errLine, $errContext);
}
}
$a = set_error_handler ('myErrorHandler');
$a = set_error_handler ('myErrorHandler2');
$a = set_error_handler ('myErrorHandler3');
//$a='myErrorHandler2';
$gaga=$blaba+$zus;
?>


Вывело 

yyy
zzz
yyy
zzz


Я просто ожидал что 
$a = set_error_handler ('myErrorHandler3'); перенесет в $a параметр 'myErrorHandler3'
А на деле оно переносит 'myErrorHandler2' и затем объявляет новый обработчик...

Это сообщение отредактировал(а) Muerto - 10.9.2010, 14:55


--------------------
user posted image
PM MAIL   Вверх
enoff
Дата 10.9.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(enoff @  10.9.2010,  12:19 Найти цитируемый пост)
set_error_handler возвращает предыдущий обработчик ошибок, если он был.


Цитата(enoff @  10.9.2010,  15:22 Найти цитируемый пост)
в конце вызывает старый обработчик,


Цитата(enoff @  10.9.2010,  15:22 Найти цитируемый пост)
старый сохраняем в переменную.


Цитата(php.net)

Returns a string containing the previously defined error handler (if any).


Цитата(Muerto @  10.9.2010,  15:54 Найти цитируемый пост)

Я просто ожидал что 
$a = set_error_handler ('myErrorHandler3'); перенесет в $a параметр 'myErrorHandler3'
А на деле оно переносит 'myErrorHandler2' и затем объявляет новый обработчик...

ладно мне, но мануалу то, наверное, можно верить? ###
PM MAIL ICQ Skype GTalk   Вверх
Muerto
Дата 10.9.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 4



enoff, Здесь дело не в вере =-)

Просто зациклился на том что роль set_error_handler () только выставить нынешний хэндлер...



--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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