Updated translation and merged review by slimus.

git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@315130 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Shein Alexey
2011-08-18 11:02:19 +00:00
parent db381246cb
commit 4fc6628f42

View File

@ -1,25 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- EN-Revision: 03977edc1f92ef56b1141f05388cf400e3f09fcd Maintainer: irker Status: ready -->
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4f3e16d7854ee82114b8d849731fbd7de57cc627 Maintainer: irker Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.magic" xmlns="http://docbook.org/ns/docbook">
<sect1 xml:id="language.oop5.magic" xmlns="http://docbook.org/ns/docbook">
<title>Магические методы</title>
<para>
Имена методов
<link linkend="language.oop5.decon.constructor"><literal>__construct</literal></link>,
<link linkend="language.oop5.decon.destructor"><literal>__destruct</literal></link>,
<link linkend="language.oop5.overloading.methods"><literal>__call</literal></link>,
<link linkend="language.oop5.overloading.methods"><literal>__callStatic</literal></link>,
<link linkend="language.oop5.overloading.members"><literal>__get</literal></link>,
<link linkend="language.oop5.overloading.members"><literal>__set</literal></link>,
<link linkend="language.oop5.overloading.members"><literal>__isset</literal></link>,
<link linkend="language.oop5.overloading.members"><literal>__unset</literal></link>,
<link linkend="language.oop5.magic.sleep"><literal>__sleep</literal></link>,
<link linkend="language.oop5.magic.sleep"><literal>__wakeup</literal></link>,
<link linkend="language.oop5.magic.tostring"><literal>__toString</literal></link>,
<link linkend="language.oop5.magic.invoke"><literal>__invoke</literal></link>,
<link linkend="language.oop5.magic.set-state"><literal>__set_state</literal></link> и
<link linkend="language.oop5.cloning"><literal>__clone</literal></link>
<link linkend="language.oop5.decon.constructor">__construct()</link>,
<link linkend="language.oop5.decon.destructor">__destruct()</link>,
<link linkend="language.oop5.overloading.methods">__call()</link>,
<link linkend="language.oop5.overloading.methods">__callStatic()</link>,
<link linkend="language.oop5.overloading.members">__get()</link>,
<link linkend="language.oop5.overloading.members">__set()</link>,
<link linkend="language.oop5.overloading.members">__isset()</link>,
<link linkend="language.oop5.overloading.members">__unset()</link>,
<link linkend="language.oop5.magic.sleep">__sleep()</link>,
<link linkend="language.oop5.magic.sleep">__wakeup()</link>,
<link linkend="language.oop5.magic.tostring">__toString()</link>,
<link linkend="language.oop5.magic.invoke">__invoke()</link>,
<link linkend="language.oop5.magic.set-state">__set_state()</link> и
<link linkend="language.oop5.cloning">__clone()</link>
зарезервированы для "магических" методов в PHP.
Не стоит называть свои методы этими именами, если вы не хотите
использовать их "магическую" функциональность.
@ -35,41 +35,47 @@
</caution>
<sect2 xml:id="language.oop5.magic.sleep">
<title><literal>__sleep</literal> и <literal>__wakeup</literal></title>
<title>
<link linkend="language.oop5.magic.sleep">__sleep()</link> и
<link linkend="language.oop5.magic.sleep">__wakeup()</link>
</title>
<para>
Функция <function>serialize</function> проверяет, присутствует ли в вашем
классе метод с "магическим" именем <literal>__sleep</literal>. Если это так,
то этот метод выполняется прежде любой операции сериализации. Он может
классе метод с "магическим" именем <link linkend="language.oop5.magic.sleep">__sleep()</link>.
Если это так, то этот метод выполняется прежде любой операции сериализации. Он может
очистить объект и предполагается, что будет возвращен массив с именами
всех переменных объекта, который должен быть сериализован.
Если метод ничего не возвращает кроме &null;, то это значит, что объект
сериализован и выдается предупреждение <constant>E_NOTICE</constant>.
</para>
<note>
<para>
Недопустимо возвращать в <literal>__sleep</literal> имена приватных свойств
объекта в родительский класс. Это приведет к предупреждению
<constant>E_NOTICE</constant>. Вместо этого вы можете использовать интерфейс
<classname>Serializable</classname>.
</para>
<para>
Недопустимо возвращать в <link linkend="language.oop5.magic.sleep">__sleep()</link>
имена приватных свойств объекта в родительский класс. Это
приведет к предупреждению <constant>E_NOTICE</constant>.
Вместо этого вы можете использовать интерфейс
<classname>Serializable</classname>.
</para>
</note>
<para>
Обычно <literal>__sleep</literal> используется для передачи ожидаемых
данных или для выполнения обычных задач их очистки. Также, этот метод
можно выполнять в тех случаях, когда вы не хотите сохранять очень большие
объекты полностью.
Рекомендованное использование <link linkend="language.oop5.magic.sleep">__sleep()</link>
состоит в завершении работы над данными, ждущими обработки или
других подобных задач очистки. Кроме того, этот метод можно
выполнять в тех случаях, когда нет необходимости сохранять
полностью очень большие объекты.
</para>
<para>
С другой стороны, функция <function>unserialize</function> проверяет
наличие метода с "магическим" именем <literal>__wakeup</literal>.
наличие метода с "магическим" именем
<link linkend="language.oop5.magic.sleep">__wakeup()</link>.
Если такой имеется, то он может воссоздать все ресурсы объекта,
принадлежавшие ему.
</para>
<para>
Обычно <literal>__wakeup</literal> используется для восстановления
любых соединений с базой данных, которые могли быть потеряны во время
операции сериализации и выполнения других операций повторной
инициализации.
Обычно <link linkend="language.oop5.magic.sleep">__wakeup()</link>
используется для восстановления любых соединений с базой данных,
которые могли быть потеряны во время операции сериализации и
выполнения других операций повторной инициализации.
</para>
<example>
<title>Sleep и wakeup</title>
@ -113,9 +119,9 @@ class Connection
</sect2>
<sect2 xml:id="language.oop5.magic.tostring">
<title><literal>__toString</literal></title>
<title><link linkend="language.oop5.magic.tostring">__toString()</link></title>
<para>
Метод <literal>__toString</literal> позволяет классу решать
Метод <link linkend="language.oop5.magic.tostring">__toString()</link> позволяет классу решать
самостоятельно, как он должен реагировать при преобразовании в
строку. Например, что напечатает <literal>echo $obj;</literal>. Этот метод
должен возвращать строку, иначе выдастся неисправимая ошибка
@ -126,7 +132,7 @@ class Connection
<programlisting role="php">
<![CDATA[
<?php
// Декларирование простого класса
// Объявление простого класса
class TestClass
{
public $foo;
@ -155,24 +161,24 @@ echo $class;
</screen>
</example>
<para>
Ранее, до PHP 5.2.0, метод <literal>__toString</literal> вызывался
только непосредственно в сочетании с функциями <function>echo</function>
или <function>print</function>.
Ранее, до PHP 5.2.0, метод <link linkend="language.oop5.magic.tostring">__toString()</link>
вызывался только непосредственно в сочетании с функциями
<function>echo</function> или <function>print</function>.
Начиная с PHP 5.2.0, он вызывается в любом строчном контексте
(например, в <function>printf</function> с модификатором
<literal>%s</literal>), но не в контекстах других типов (например,
с <literal>%d</literal> модификатором).
Начиная с PHP 5.2.0, преобразование объекта в строку при отсутствии
метода <literal>__toString</literal> вызывает ошибку
<constant>E_RECOVERABLE_ERROR</constant>.
метода <link linkend="language.oop5.magic.tostring">__toString()</link>
вызывает ошибку <constant>E_RECOVERABLE_ERROR</constant>.
</para>
</sect2>
<sect2 xml:id="language.oop5.magic.invoke">
<title><literal>__invoke</literal></title>
<title><link linkend="language.oop5.magic.invoke">__invoke()</link></title>
<para>
Метод <literal>__invoke</literal> вызывается, когда скрипты пытается
выполнить объект как функцию.
Метод <link linkend="language.oop5.magic.invoke">__invoke()</link>
вызывается, когда скрипт пытается выполнить объект как функцию.
</para>
<note>
<para>
@ -180,7 +186,7 @@ echo $class;
</para>
</note>
<example>
<title>Использование <literal>__invoke</literal></title>
<title>Использование <link linkend="language.oop5.magic.invoke">__invoke()</link></title>
<programlisting role="php">
<![CDATA[
<?php
@ -188,8 +194,8 @@ class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
@ -208,7 +214,7 @@ bool(true)
</sect2>
<sect2 xml:id="language.oop5.magic.set-state">
<title><literal>__set_state</literal></title>
<title><link linkend="language.oop5.magic.set-state">__set_state()</link></title>
<para>
Этот <link linkend="language.oop5.static">статический</link> метод
вызывается для тех классов, которые экспортируются функцией
@ -219,7 +225,7 @@ bool(true)
свойств в виде <literal>array('property' => value, ...)</literal>.
</para>
<example>
<title>Использование <literal>__set_state</literal> (начиная с PHP 5.1.0)</title>
<title>Использование <link linkend="language.oop5.magic.set-state">__set_state()</link> (начиная с PHP 5.1.0)</title>
<programlisting role="php">
<![CDATA[
<?php