- Введение
- «деструкторы» PEAR
- Важно!
- Обработка ошибок в PEAR
- Примеры
- Использование глобальных переменных
- Class: PEAR
- Inherited Variables
- Inherited Methods
- Class Details
- Class Variables
- $bivalentMethods = array( ‘setErrorHandling’ => true, ‘raiseError’ => true, ‘throwError’ => true, ‘pushErrorHandling’ => true, ‘popErrorHandling’ => true, )
- Method Detail
- PEAR (Constructor) [line 192]
- Parameters:
Введение
Базовый класс PEAR предоставляет стандартную функциональность, которая может быть использована большинством классов PEAR. Обычно не требуется создавать объект этого класса, для этого используется наследование от него.
«деструкторы» PEAR
Если ваш класс ClassName наследует класс PEAR, то вы можете объявить метод _ ClassName (имя класса с префиксом в виде подчеркивания), которые будет вызван по окончанию обработки запроса. Этот метод не является деструктором в том смысле, что вы можете «удалить» объект с его помощью, это метод объекта, который вызывается при завершении работы РНР. См. пример.
Важно!
Для того, чтобы обеспечить работу деструкторов, вы должны создавать объект вашего класса с помощью оператора «=& new». Вот так: this:
Если вы будете использовать «= new», то объект, который будет зарегистрирован — будет его копией на тот момент, когда будет вызван конструктор. Соответственно, «деструктор» будет вызван именно у копии вашего объекта.
Обработка ошибок в PEAR
Базовый класс PEAR также предоставляет инструмент для обработки ошибок более сложных, чем возврат значений true/false или числовых кодов. Ошибка в PEAR — это объект, который является экземпляром класса PEAR_Error или класса, который наследует PEAR_Error.
Один из основных принципов обработки ошибок в PEAR гласит, что ошибки не должны автоматически приводить к выводу на экран пользователя, ошибки должны обрабатываться вообще без какого-либо вывода на экран, если это требуется. Это позволяет обрабатывать ошибки «вежливо», кроме того, это позволяет избежать нежелательного вывода тогда, когда вы используете не HTML, а, например, XML или WML.
Класс ошибок позволяет настроить себя так, что при возникновении ошибки (т.е. при создании экземпляра этого класса) могут выполняться различные действия. Например, вывод сообщения об ошибке, вывод сообщения и прекращение выполнения программы, вывод сообщения с помощью функции trigger_error(), вызов заранее назначенной функции или ничего из вышеперечисленного. Обычно эти параметры указываются в конструкторе PEAR_Error, но все эти параметры являются опциональными и вы можете использовать установки по умолчанию для ошибок, которые используются в классах, наследующих класс PEAR. См. примеры ошибок PEAR и документацию по PEAR_Error для более полной информации.
Примеры
Пример, приведенный ниже, показывает как использовать «деструкторы для бедных» PEAR для того, чтобы создать объект, содержимым которого является файл; объект позволяет добавлять данные в конец и записывает их при окончании обработки запроса:
Эмулируемые деструкторы PEAR
class FileContainer extends PEAR
var $file = » ;
var $contents = » ;
var $modified = 0 ;
function FileContainer ( $file )
$this -> PEAR (); // вызов конструктора родительского класса
$fp = fopen ( $file , «r» );
if (! is_resource ( $fp )) return;
>
while ( $data = fread ( $fp , 2048 )) $this -> contents .= $data ;
>
fclose ( $fp );
>
function append ( $str )
$this -> contents .= $str ;
$this -> modified ++;
>
// Деструктор зовется также, как и конструктор, но с приставкой в виде
// подчеркивания
function _FileContainer ()
if ( $this -> modified ) $fp = fopen ( $this -> file , «w» );
if (! is_resource ( $fp )) return;
>
fwrite ( $fp , $this -> contents );
fclose ( $fp );
>
>
>
$fileobj =& new FileContainer ( «testfile» );
$fileobj -> append ( «this ends up at the end of the file\n» );
// При окончании обработки запроса, когда PHP прекращает свою работу,
// вызывается деструктор объекта $fileobj и записывает файл на диск.
?>
Следующие примеры иллюстрируют различные пути использования механизма обработки ошибок PEAR.
Пример обработки ошибок в PEAR (1)
function mysockopen ( $host = «localhost» , $port = 8090 )
$fp = fsockopen ( $host , $port , $errno , $errstr );
if (! is_resource ( $fp )) return new PEAR_Error ( $errstr , $errno );
>
return $fp ;
>
?php
$sock = mysockopen ();
if ( PEAR :: isError ( $sock )) print «mysockopen error: » . $sock -> getMessage (). «\n»
>
?>
В примере используется враппер для fsockopen(), который при возникновении ошибки возвращает её код и текст в виде объекта PEAR_Error. Заметьте, что PEAR::isError() используется для того, чтобы определить является ли ошибкой возвращаемое значение.
PEAR_Error в этом примере работает в режиме, при котором ошибка просто возвращается, а её обработка ложится на плечи программиста. Это поведение является поведением по умолчанию.
В следующем примере мы покажем вам как использовать поведение по умолчанию:
class TCP_Socket extends PEAR
var $sock ;
?php
function TCP_Socket ()
$this -> PEAR ();
>
function connect ( $host , $port )
$sock = fsockopen ( $host , $port , $errno , $errstr );
if (! is_resource ( $sock )) return $this -> raiseError ( $errstr , $errno );
>
>
>
$sock = new TCP_Socket ;
$sock -> setErrorHandling ( PEAR_ERROR_DIE );
$sock -> connect ( «localhost» , 8090 );
print «still alive\n» ;
?>
Здесь мы сначала меняем поведение по умолчанию на PEAR_ERROR_DIE, а потом, т.к. мы не указываем режим работы в raiseError() (это должно было бы быть 3-м параметром), raiseError() использует поведение по умолчанию и прекращает выполнение скрипта при завершении fsockopen() с ошибкой.
Использование глобальных переменных
Класс PEAR использует несколько глобальных переменных для установок по умолчанию, а список объектов используется для работы «деструкторов». Все глобальные переменные, которые использует класс PEAR носят имя с префиксом _PEAR_.
Если не установлен режим по умолчанию, то этот режим будет использован. Должен быть равен PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE или PEAR_ERROR_CALLBACK.
Не меняйте значение это переменной напрямую, используйте PEAR::setErrorHandling()для этого:
Если используется режим работы PEAR_ERROR_TRIGGER, то должна иметь значение E_USER_NOTICE, E_USER_WARNING или E_USER_ERROR.
Не меняйте значение это переменной напрямую, используйте PEAR::setErrorHandling() для этого:
Если при возврате ошибки не был указан параметр options и используется режим обработки ошибок PEAR_ERROR_CALLBACK, то значение этой переменной используется как имя функции, которая будет вызвана при появлении ошибки. Это означает, что вы можете временно переключить режим обработки ошибок без повторного указания имени функции-обработчика. Может иметь ст Here is an example of how you can switch back and forth without specifying the callback function again: роковое значение с именем функции или двухэлементный массив с объектом по индексу 0 и с именем метода по индексу 1.
Еще раз повторим: не меняйте значение этой переменной напрямую, используйте PEAR::setErrorHandling() для этого:
Следующий пример показывает как можно переключаться между режимами обработки ошибок без повторного указания функции-обработчика:
PEAR :: setErrorHandling ( PEAR_ERROR_CALLBACK , «my_function_handler» );
do_some_stuff ();
PEAR :: setErrorHandling ( PEAR_ERROR_DIE );
do_some_critical_stuff ();
PEAR :: setErrorHandling ( PEAR_ERROR_CALLBACK );
// здесь мы вернули предыдущий режим, в котором используется обработчик
// my_function_handler()
?>?php
Class: PEAR
PEAR_Common Class providing common functionality for PEAR administration classes. PEAR_Command_Common PEAR commands base class PEAR_Frontend Singleton-based frontend for PEAR user input/output PEAR_Config This is a class for storing configuration data, keeping track of which are system-defined, user-defined or defaulted. PEAR_Registry Administration class used to maintain the installed package database.
Inherited Variables
Inherited Methods
Class Details
If you want a destructor in your class, inherit PEAR and make a destructor method called _yourclassname (same name as the constructor, but with a «_» prefix). Also, in your constructor you have to call the PEAR constructor: $this->PEAR();. The destructor method will be called without parameters. Note that at in some SAPI implementations (such as Apache), any output during the request shutdown (in which destructors are called) seems to be discarded. If you need to get any debug information from your destructor, use error_log(), syslog() or something similar.
IMPORTANT! To use the emulated destructors you need to create the objects by reference: $obj =& new PEAR_child;
- Author: Stig Bakken
- Author: Greg Beaver
- Author: Tomas V.V. Cox
- Version: Release: 1.10.12
- Copyright: 1997-2006 The PHP Group
- See:PEAR_Error
- Link:http://pear.php.net/manual/en/core.pear.php#core.pear.pear
- Link:http://pear.php.net/package/PEAR
- Since: Class available since PHP 4.0.2
- License:New BSD License
Class Variables
$bivalentMethods = array(
‘setErrorHandling’ => true,
‘raiseError’ => true,
‘throwError’ => true,
‘pushErrorHandling’ => true,
‘popErrorHandling’ => true,
)
List of methods that can be called both statically and non-statically.
Method Detail
PEAR (Constructor) [line 192]
E.g. Archive_Tar calls $this->PEAR() in its constructor.