cvs: phpdoc-ru /language/oop5 magic.xml

From: Date: Mon, 07 Apr 2008 20:03:47 +0000
Subject: cvs: phpdoc-ru /language/oop5 magic.xml
Groups: php.doc.ru 
Request: Send a blank email to doc-ru+get-906@lists.php.net to get a copy of this message
santiago Mon Apr 7 20:03:47 2008 UTC Modified files: /phpdoc-ru/language/oop5 magic.xml Log: add new translation

http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/oop5/magic.xml?r1=1.3&r2=1.4&diff_format=u Index: phpdoc-ru/language/oop5/magic.xml diff -u /dev/null phpdoc-ru/language/oop5/magic.xml:1.4 --- /dev/null Mon Apr 7 20:03:47 2008 +++ phpdoc-ru/language/oop5/magic.xml Mon Apr 7 20:03:46 2008 @@ -0,0 +1,236 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- $Revision: 1.4 $ --> + <sect1 xml:id="language.oop5.magic" xmlns="http://docbook.org/ns/docbook"> + <title>Магические методы</title> + <para> + Имена методов + <literal>__construct</literal>, + <literal>__destruct</literal> + (см. <link linkend="language.oop5.decon">Конструкторы и деструкторы</link>), + <literal>__call</literal>, + <literal>__callStatic</literal>, + <literal>__get</literal>, + <literal>__set</literal>, + <literal>__isset</literal>, + <literal>__unset</literal> + (см. <link linkend="language.oop5.overloading">Перегрузка</link>), + <literal>__sleep</literal>, + <literal>__wakeup</literal>, + <literal>__toString</literal>, + <literal>__set_state</literal> и + <link linkend="language.oop5.cloning">__clone</link> + являются "магическими" в PHP классах. Если вы хотите, + чтобы "магическая" функциональность была связана с + ними, то вам не стоит называть свои методы этими + именами. + </para> + + <caution> + <simpara> + PHP оставляет за собой право все методы, начинающиеся с __, + считать "магическими". Не рекомендуется использовать имена + методов с __ в PHP пока вы желаете, чтобы был доступен + "магический" функционал. + </simpara> + </caution> + + <sect2 xml:id="language.oop5.magic.sleep"> + <title><literal>__sleep</literal> и <literal>__wakeup</literal></title> + <para> + Функция <function>serialize</function> проверяет, присутствует ли в вашем + классе метод с "магическим" именем <literal>__sleep</literal>. Если это так, + то этот метод выполняется прежде любой операции сериализации. Он может + очистить объект и предполагается, что будет возвращен массив с именами + всех переменных объекта, который должен быть сериализован. + Если метод ничего не возвращает кроме &null;, то это значит, что объект + сериализован и выдается предупреждение E_NOTICE. + </para> + <para> + Обычно, <literal>__sleep</literal> используется для передачи ожидаемых + данных или для выполнения обычных задач их очистки. Также, этот метод + можно выполнять в тех случаях, когда вы не хотите сохранять очень большие + объекты полностью. + </para> + <para> + С другой стороны, функция <function>unserialize</function> проверяет + наличие метода с "магическим" именем <literal>__wakeup</literal>. + Если такой имеется, то он может реконструировать все ресурсы объекта, + которые тот имеет. + </para> + <para> + Обычно, <literal>__wakeup</literal> используется для восстановления + любых соединений с базой данных, которые могли быть потеряны во время + операции сериализации и выполения других операций повторной + инициализации. + </para> + <example> + <title>Sleep и wakeup</title> + <programlisting role="php"> +<![CDATA[ +<?php +class Connection { + protected $link; + private $server, $username, $password, $db; + + public function __construct($server, $username, $password, $db) + { + $this->server = $server; + $this->username = $username; + $this->password = $password; + $this->db = $db; + $this->connect(); + } + + private function connect() + { + $this->link = mysql_connect($this->server, $this->username, $this->password); + mysql_select_db($this->db, $this->link); + } + + public function __sleep() + { + return array('server', 'username', 'password', 'db'); + } + + public function __wakeup() + { + $this->connect(); + } +} +?> +]]> + </programlisting> + </example> + </sect2> + + <sect2 xml:id="language.oop5.magic.tostring"> + <title><literal>__toString</literal></title> + <para> + Метод <literal>__toString</literal> позволяет классу решать + самостоятельно, как он должен реагировать при преобразовании в + строку. + </para> + <example> + <title>Простой пример</title> + <programlisting role="php"> +<![CDATA[ +<?php +// Декларирование простого класса +class TestClass +{ + public $foo; + + public function __construct($foo) { + $this->foo = $foo; + } + + public function __toString() { + return $this->foo; + } +} + +$class = new TestClass('Привет'); +echo $class; +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ +Привет +]]> + </screen> + </example> + <para> + Ранее, до PHP 5.2.0, метод <literal>__toString</literal> вызывался + только непосредственно в сочетании с функциями <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>. + </para> + </sect2> + + <sect2 xml:id="language.oop5.magic.set-state"> + <title><literal>__set_state</literal></title> + <para> + Этот <link linkend="language.oop5.static">статический</link> метод + вызывается для тех классов, которые экспортируются функцией + <function>var_export</function> начиная с PHP 5.1.0. + </para> + <para> + Параметр этого метода должен содержать массив, состоящий из экспортируемых + свойств в виде <literal>array('property' => value, ...)</literal>. + </para> + <example> + <title>Использование <literal>__set_state</literal> (начиная с PHP 5.1.0)</title> + <programlisting role="php"> +<![CDATA[ +<?php + +class A +{ + public $var1; + public $var2; + + public static function __set_state($an_array) // С PHP 5.1.0 + { + $obj = new A; + $obj->var1 = $an_array['var1']; + $obj->var2 = $an_array['var2']; + return $obj; + } +} + +$a = new A; +$a->var1 = 5; +$a->var2 = 'foo'; + +eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array( + // 'var1' => 5, + // 'var2' => 'foo', + // )); +var_dump($b); + +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ +object(A)#2 (2) { + ["var1"]=> + int(5) + ["var2"]=> + string(3) "foo" +} +]]> + </screen> + </example> + </sect2> + </sect1> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:1 +sgml-indent-data:t +indent-tabs-mode:nil +sgml-parent-document:nil +sgml-default-dtd-file:"../../manual.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +vim600: syn=xml fen fdm=syntax fdl=2 si +vim: et tw=78 syn=sgml +vi: ts=1 sw=1 +-->
« previous php.doc.ru (#906) next »