cvs: phpdoc-ru /language exceptions.xml namespaces.xml
| From: | Antony Dovgal | Date: | Fri, 25 Jan 2008 14:40:48 +0000 |
| Subject: | cvs: phpdoc-ru /language exceptions.xml namespaces.xml | ||
| Groups: | php.doc.ru | ||
| Request: | Send a blank email to doc-ru+get-841@lists.php.net to get a copy of this message | ||
tony2001 Fri Jan 25 14:40:48 2008 UTC
Added files:
/phpdoc-ru/language namespaces.xml exceptions.xml
Log:
add newly translated files by Max Antonov
http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/namespaces.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/namespaces.xml +++ phpdoc-ru/language/namespaces.xml <?xml version = "1.0" encoding = "utf-8"?> <!-- EN-Revision: 1.3 Status: ready --> <!-- $Revision: 1.1 $ --> <chapter xmlns="http://docbook.org/ns/docbook" version="1.1" xml:id="language.namespaces" xmlns:xml="http://www.w3.org/XML/1998/namespace"> <title>ÐÑоÑÑÑанÑÑва имÑн</title> <sect1 xml:id="language.namespaces.rationale"> <title>ÐÐ±Ð·Ð¾Ñ Ð¿ÑоÑÑÑанÑÑв имÑн</title> <simpara> ÐÑоÑÑÑанÑÑва имÑн Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð² PHP Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¿Ñоблем в болÑÑÐ¸Ñ PHP-библиоÑÐµÐºÐ°Ñ . Ð PHP вÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов глобалÑнÑ, поÑÑÐ¾Ð¼Ñ Ð°Ð²ÑоÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑбиÑаÑÑ ÑникалÑнÑе имена Ð´Ð»Ñ ÑоздаваемÑÑ Ð¸Ð¼Ð¸ клаÑÑов. ÐÑо делаеÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñи иÑполÑзовании библиоÑеки ÑовмеÑÑно Ñ Ð´ÑÑгими библиоÑеками не возникало конÑликÑов имÑн. ÐбÑÑно ÑÑо доÑÑигаеÑÑÑ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ в имена клаÑÑов пÑеÑикÑов. ÐапÑимеÑ: еÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ <classname>dataBase</classname> - велика веÑоÑÑноÑÑÑ, ÑÑо Ñакое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа бÑÐ´ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð¸ в дÑÑÐ³Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÐ°Ñ , а пÑи Ð¸Ñ ÑовмеÑÑном иÑполÑзовании Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð²ÑнÑÐ¶Ð´ÐµÐ½Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа дÑÑгое имÑ. ÐапÑимеÑ: <classname>ourLibraryDataBase</classname> Такие дейÑÑÐ²Ð¸Ñ Ð¿ÑиводÑÑ Ðº ÑеÑезмеÑÐ½Ð¾Ð¼Ñ Ð²ÑÑаÑÑÐ°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ Ð¸Ð¼Ñн клаÑÑов. </simpara> <simpara> ÐÑоÑÑÑанÑÑва имÑн позволÑÑÑ ÑазÑабоÑÑÐ¸ÐºÑ ÑпÑавлÑÑÑ Ð·Ð¾Ð½Ð°Ð¼Ð¸ видимоÑÑи имÑн, ÑÑо избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑеÑикÑов и ÑеÑезмеÑно длиннÑÑ Ð¸Ð¼Ñн. ÐÑе ÑÑо ÑлÑÐ¶Ð¸Ñ Ð¿Ð¾Ð²ÑÑÐµÐ½Ð¸Ñ ÑиÑабелÑноÑÑи кода. </simpara> <simpara> ÐÑоÑÑÑанÑÑва имÑн доÑÑÑÐ¿Ð½Ñ Ð² PHP наÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 5.3.0. ÐÐ°Ð½Ð½Ð°Ñ ÑекÑÐ¸Ñ ÑкÑпеÑименÑалÑна и возможно бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð²ÐµÑжена изменениÑм. </simpara> </sect1> <sect1 xml:id="language.namespaces.definition"> <title>ÐпÑеделение пÑоÑÑÑанÑÑва имÑн</title> <para> ÐÑоÑÑÑанÑÑво имÑн опÑеделÑеÑÑÑ Ð¿Ð¾ÑÑедÑÑвом клÑÑевого Ñлова <literal>namespace</literal>, коÑоÑое должно Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² Ñамом наÑале Ñайла. ÐÑимеÑ: <example> <title>ÐпÑеделение пÑоÑÑÑанÑÑва имÑн.</title> <programlisting role="php"><![CDATA[ <?php namespace MyProject::DB; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?> ]]></programlisting> </example> ÐÑо пÑоÑÑÑанÑÑво имÑн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано в ÑазнÑÑ ÑÐ°Ð¹Ð»Ð°Ñ . </para> <para> ÐÑоÑÑÑанÑÑва имÑн могÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов, конÑÑÐ°Ð½Ñ Ð¸ ÑÑнкÑий. Ðо не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð±ÑÑного кода. </para> <para> ÐпÑеделение пÑоÑÑÑанÑÑва имÑн ÑабоÑÐ°ÐµÑ Ñак: <itemizedlist> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑе имена клаÑÑов, ÑÑнкÑий и конÑÑÐ°Ð½Ñ Ð°Ð²ÑомаÑиÑеÑки бÑдÑÑ Ð¿ÑеÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ пÑоÑÑÑанÑÑва имÑн. Ðмена клаÑÑов пÑи вÑзове Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð½Ñми, Ñак напÑÐ¸Ð¼ÐµÑ Ð¿Ñи вÑзове клаÑÑа из пÑимеÑа вÑÑе должно иÑполÑзоваÑÑÑÑ ÑледÑÑÑее Ð¸Ð¼Ñ <classname>MyProject::DB::Connection</classname>. </simpara> </listitem> <listitem> <simpara> ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ ÑоздаÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, ÑоÑÑоÑÑие из имени пÑоÑÑÑанÑÑва имÑн и имени конÑÑанÑÑ. Ðак и конÑÑанÑÑ ÐºÐ»Ð°ÑÑов - конÑÑанÑÑ Ð¿ÑоÑÑÑанÑÑва имÑн могÑÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе ÑолÑко ÑкалÑÑного Ñипа. </simpara> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени клаÑÑа (Ñ.е. не ÑодеÑжаÑего <literal>::</literal>) оÑÑÑеÑÑвлÑеÑÑÑ Ð² ÑледÑÑÑей поÑледоваÑелÑноÑÑи: <orderedlist> <listitem> <simpara> ÐопÑÑка найÑи клаÑÑ Ð² ÑекÑÑем пÑоÑÑÑанÑÑве имÑн (Ñ.е. пÑеÑикÑиÑование клаÑÑа именем ÑекÑÑего пÑоÑÑÑанÑÑва имÑн) без попÑÑки <link linkend="language.oop5.autoload">авÑозагÑÑзки (autoload)</link>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка найÑи клаÑÑ Ð² глобалÑном пÑоÑÑÑанÑÑве имÑн без попÑÑки <link linkend="language.oop5.autoload">авÑозагÑÑзки (autoload)</link>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка авÑозагÑÑзки в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн. </simpara> </listitem> <listitem> <simpara>Ð ÑлÑÑае неÑдаÑи пÑедÑдÑÑего - оÑказ.</simpara> </listitem> </orderedlist> </para> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени ÑÑнкÑии (Ñ.е. не вклÑÑаÑÑего <literal>::</literal>) во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑÑÑ ÑнаÑала в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн, заÑем в глобалÑном пÑоÑÑÑанÑÑве имÑн. </para> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени конÑÑанÑÑ Ð¿ÑоизводиÑÑÑ ÑнаÑала в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн, заÑем ÑÑеди глобалÑно обÑÑвленнÑÑ ÐºÐ¾Ð½ÑÑанÑ. </para> </listitem> </itemizedlist> СмоÑÑи Ñак же <link linkend="language.namespaces.rules">пÑавила ÑазбоÑа имÑн</link>. </para> </sect1> <sect1 xml:id="language.namespaces.using" > <title>ÐÑполÑзование пÑоÑÑÑанÑÑв имÑн</title> <para> Ðа имена клаÑÑов и ÑÑнкÑий, обÑÑвленÑÑ Ð²Ð½ÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑегда можно ÑоÑлаÑÑÑÑ Ð¿Ð¾ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ñ Ð¸Ð¼ÐµÐ½Ð¸: <classname>MyProject::DB::Connection</classname> или <classname>MyProject::DB::connect</classname> . <example> <title>ÐÑполÑзование имÑн, обÑÑвленнÑÑ Ð²Ð½ÑÑÑи пÑоÑÑÑанÑÑв имÑн</title> <programlisting role="php"><![CDATA[ <?php require 'MyProject/Db/Connection.php'; $x = new MyProject::DB::Connection; MyProject::DB::connect(); ?> ]]></programlisting> </example> </para> <para> ÐÑоÑÑÑанÑÑва имÑн могÑÑ Ð±ÑÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² ÑекÑÑий конÑекÑÑ (глобалÑнÑй или пÑоÑÑÑанÑÑво имÑн) пÑи помоÑи опеÑаÑоÑа <literal>use</literal>. СинÑакÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа use: <informalexample> <programlisting role="php"><![CDATA[ <?php /* ... */ use Some::Name as Othername; // Ð¡Ð°Ð¼Ð°Ñ Ð¿ÑоÑÑÐ°Ñ ÑоÑма : use Foo::Bar; // ÑÑо Ñо же ÑÑо и : use Foo::Bar as Bar; ?> ]]></programlisting> </informalexample> ÐмпоÑÑиÑованнÑе пÑоÑÑÑанÑÑва имÑн ÑабоÑаÑÑ ÑледÑÑÑим обÑазом: каждÑй Ñаз, когда компилÑÑÐ¾Ñ Ð²ÑÑÑеÑÐ°ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ñное Ð¸Ð¼Ñ <literal>Othername</literal> (как пÑоÑÑое Ð¸Ð¼Ñ Ð¸Ð»Ð¸ как пÑеÑÐ¸ÐºÑ Ð±Ð¾Ð»ÐµÐµ длинного, Ñазделенного <literal>::</literal> имени), импоÑÑиÑованное Ð¸Ð¼Ñ <literal>Some::Name</literal> заменÑеÑÑÑ. </para> <para> ÐпеÑаÑÐ¾Ñ <literal>use</literal> Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован ÑолÑко в глобалÑном пÑоÑÑÑанÑÑве имÑн - не внÑÑÑи клаÑÑа или ÑÑнкÑии. ÐмпоÑÑиÑованнÑе имена дейÑÑвÑÑÑ Ñ ÑоÑки импоÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ конÑа ÑекÑÑего Ñайла. РекомендÑеÑÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ Ð¸Ð¼ÐµÐ½Ð° в наÑале Ñайла во избежание пÑÑаниÑÑ. </para> <para> <example> <title>ÐмпоÑÑиÑование пÑоÑÑÑанÑÑв имÑн и доÑÑÑп к ним</title> <programlisting role="php"><![CDATA[ <?php require 'MyProject/Db/Connection.php'; use MyProject::DB; use MyProject::DB::Connection as DbConnection; $x = new MyProject::DB::Connection(); $y = new DB::connection(); $z = new DbConnection(); DB::connect(); ?> ]]></programlisting> </example> </para> <para> <note> <simpara> ÐпеÑаÑÐ¸Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа пÑоÑÑÑанÑÑв имÑн вÑполнÑеÑÑÑ ÑолÑко во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. ÐÑе локалÑнÑе имена заменÑÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑом на Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñе ÑквиваленÑÑ. ÐамеÑÑÑе, ÑÑо ÑÑо не пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° в ÑÑÑоки. Таким обÑазом динамиÑеÑкий импоÑÑ Ð¿ÑоÑÑÑанÑÑв имÑн невозможен. </simpara> </note> </para> </sect1> <sect1 xml:id="language.namespaces.global"> <title>ÐлобалÑное пÑоÑÑÑанÑÑво имÑн</title> <para> Ðез опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо пÑоÑÑÑанÑÑва имÑн, вÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов и ÑÑнкÑиий оказÑваÑÑÑÑ Ð² глобалÑном пÑоÑÑÑанÑÑве - как ÑÑо бÑло в PHP до поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑоÑÑÑанÑÑв имÑн. ÐÑеÑикÑиÑование имени знаками <literal>::</literal> ÑказÑваеÑ, ÑÑо Ð¸Ð¼Ñ Ð¸Ð· глобалÑного пÑоÑÑÑанÑÑва имÑн - ÑабоÑÐ°ÐµÑ Ð´Ð°Ð¶Ðµ в конÑекÑÑе пÑоÑÑÑанÑÑва имÑн. <example> <title>ÐÑполÑзование ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° глобалÑное пÑоÑÑÑанÑÑво имÑн </title> <programlisting role="php"><![CDATA[ <?php namespace A::B::C; /* This function is A::B::C::fopen */ function fopen() { /* ... */ $f = ::fopen(...); // вÑзÑÐ²Ð°ÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ fopen return $f; } ?> ]]></programlisting> </example> </para> </sect1> <sect1 xml:id="language.namespaces.constant"> <title>__NAMESPACE__</title> <para> ÐонÑÑанÑа вÑемени компилÑÑии <constant>__NAMESPACE__</constant> опÑеделÑÐµÑ ÑекÑÑее пÑоÑÑÑанÑÑво имÑн. Ðне пÑоÑÑÑанÑÑва имÑн ÑÑа конÑÑанÑа Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение пÑÑÑой ÑÑÑоки. ÐÑа конÑÑанÑа иÑполÑзÑеÑÑÑ ÐºÐ¾Ð³Ð´Ð° ÑÑебÑеÑÑÑ ÑÑоÑмиÑоваÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ i Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа или ÑÑнкÑии из ÑекÑÑего пÑоÑÑÑанÑÑва имÑн. <example> <title>ÐÑполÑзование __NAMESPACE__</title> <programlisting role="php"><![CDATA[ <?php namespace A::B::C; function foo() { // do stuff } set_error_handler(__NAMESPACE__ . "::foo"); ?> ]]></programlisting> </example> </para> </sect1> <sect1 xml:id="language.namespaces.rules"> <title>ÐÑавила ÑазбоÑа имÑн</title> <para> Ð Ð°Ð·Ð±Ð¾Ñ Ð¸Ð¼Ñн пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑледÑÑÑим пÑавилам: <orderedlist> <listitem> <simpara> ÐÑе квалиÑиÑиÑованнÑе имена ÑÑанÑлиÑÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии в ÑооÑвеÑÑÑвии Ñ ÑекÑÑими импоÑÑиÑованнÑми пÑоÑÑÑанÑÑвами имÑн. РпÑимеÑÑ, еÑли импоÑÑиÑовано поÑÑÑанÑÑво имÑн A::B::C, вÑзов <code>C::D::e()</code> бÑÐ´ÐµÑ ÑÑанÑлиÑован как <code>A::B::C::D::e()</code>. </simpara> </listitem> <listitem> <simpara> ÐеквалиÑиÑиÑованнÑе имена клаÑÑов ÑÑанÑлиÑÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии в ÑооÑвеÑÑÑвии Ñ ÑекÑÑими импоÑÑиÑованнÑми пÑоÑÑÑанÑÑвами имÑн (полнÑе имена заменÑÑÑ ÐºÐ¾ÑоÑкие импоÑÑиÑованнÑе имена). РпÑимеÑÑ, еÑли пÑоÑÑÑанÑÑво имÑн <literal>A::B::C</literal> импоÑÑиÑовано, <code>new C()</code> бÑÐ´ÐµÑ ÑÑанÑлиÑовано как <code>new A::B::C()</code>. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑзов неквалиÑиÑиÑованнÑÑ ÑÑнкÑий, опÑеделеннÑÑ Ð² ÑÑом же пÑоÑÑÑанÑÑве имÑн инÑеÑпеÑÑиÑÑеÑÑÑ ÐºÐ°Ðº вÑзов в данном пÑоÑÑÑанÑÑве имÑн во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн (напÑÐ¸Ð¼ÐµÑ <literal>A::B</literal>) вÑзов неквалиÑиÑиÑованнÑÑ ÑÑнкÑий, не опÑеделеннÑÑ Ð² ÑÑом пÑоÑÑÑанÑÑве имÑн бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐÑзов ÑÑнкÑии <literal>foo()</literal> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом: </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн: <literal>A::B::foo()</literal>. </simpara> </listitem> <listitem> <simpara> ÐоиÑк <emphasis>внÑÑÑенней</emphasis> PHP ÑÑнкÑии <literal>foo()</literal>. </simpara> </listitem> </orderedlist> <simpara> Ð ÑлÑÑае неÑдаÑи вÑÐµÑ Ð¿ÑедÑдÑÑÐ¸Ñ Ð¿Ð¾Ð¿ÑÑок бÑÐ´ÐµÑ Ð¸ÑполÑзован вÑзов опÑеделенной в глобалÑном пÑоÑÑÑанÑÑве имÑн ÑÑнкÑии <literal>::foo()</literal>. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн (напÑÐ¸Ð¼ÐµÑ <literal>A::B</literal>), вÑзов неквалиÑиÑиÑованнÑÑ ÐºÐ»Ð°ÑÑов ÑазÑеÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐапÑÐ¸Ð¼ÐµÑ Ð²Ñзов <code>new C()</code> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом: </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк клаÑÑа в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн: <literal>A::B::C</literal>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка вÑзова <emphasis>внÑÑÑеннего</emphasis> PHP-клаÑÑа <literal>C</literal>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка авÑозагÑÑзки <literal>A::B::C</literal>. </simpara> </listitem> </orderedlist> <simpara> Ð ÑлÑÑае неÑдаÑи вÑÐµÑ Ð¿ÑедÑдÑÑÐ¸Ñ , бÑÐ´ÐµÑ Ð¸ÑполÑзован вÑзов <code>new ::C()</code>. </simpara> </listitem> <listitem> <simpara> ÐÑзов квалиÑиÑиÑованнÑÑ ÑÑнкÑий ÑазÑеÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐапÑÐ¸Ð¼ÐµÑ Ð²Ñзов <literal>A::B::foo()</literal> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом : </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк ÑÑнкÑии <literal>foo()</literal> в пÑоÑÑÑанÑÑве имÑн <literal>A::B</literal>. </simpara> </listitem> <listitem> <simpara> ÐоиÑк клаÑÑа <literal>A::B</literal> и вÑзов его ÑÑаÑиÑеÑкого меÑода <literal>foo()</literal>. ÐÑÐ´ÐµÑ Ñделана авÑозагÑÑзка клаÑÑа, еÑли Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾. </simpara> </listitem> </orderedlist> </listitem> <listitem> <simpara> ÐвалиÑиÑиÑованнÑе имена клаÑÑов ÑазÑеÑаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии, как клаÑÑÑ ÑооÑвеÑÑÑвÑÑÑего пÑоÑÑÑанÑÑва имÑн. РпÑимеÑÑ <code>new A::B::C()</code> бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° клаÑÑ <classname>C</classname> пÑоÑÑÑанÑÑва имÑн <literal>A::B</literal>. </simpara> </listitem> </orderedlist> </para> <example> <title>ÐÑимеÑÑ ÑазбоÑа имÑн</title> <programlisting role="php"><![CDATA[ <?php namespace A; // вÑÐ·Ð¾Ð²Ñ ÑÑнкÑий foo(); // ÑнаÑала попÑÑка вÑзваÑÑ "foo" опÑеделеннÑÑ Ð² пÑоÑÑÑанÑÑве имÑн "A" // заÑем вÑзов внÑÑÑенней ÑÑнкÑии "foo" ::foo(); // вÑÐ·Ð¾Ñ ÑÑнкÑии "foo" опÑеделенной глобалÑно // class references new B(); // ÑнаÑала попÑÑка ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ»Ð°ÑÑа "B" опÑеделенного в пÑоÑÑÑанÑÑве имÑн "A" // заÑем Ñоздание обÑекÑа внÑÑÑеннего клаÑÑа "B" new ::B(); // ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ»Ð°ÑÑа "B" опÑеделенного глобалÑно // ÑÑаÑиÑеÑкие меÑодÑ/ÑÑнкÑии пÑоÑÑÑанÑÑва имÑн из дÑÑÐ³Ð¸Ñ (не ÑекÑÑÐ¸Ñ ) пÑоÑÑÑанÑÑв имÑн B::foo(); // ÑнаÑала попÑÑка вÑзваÑÑ ÑÑнкÑÐ¸Ñ "foo" из пÑоÑÑÑанÑÑва имÑн "A::B" // заÑем вÑзов меÑода "foo" внÑÑÑеннего клаÑÑа "B" ::B::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" из пÑоÑÑÑанÑÑва имÑн "B" // заÑем вÑзов меÑода "foo" клаÑÑа "B" из глобалÑного пÑоÑÑÑанÑÑва имÑн // ÑÑаÑиÑеÑкие меÑодÑ/ÑÑнкÑии пÑоÑÑÑанÑÑва имÑн из ÑекÑÑего пÑоÑÑÑанÑÑва имÑн A::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A::A" // заÑем попÑÑка вÑзова меÑода "foo" клаÑÑа "A" из пÑоÑÑÑанÑÑва имÑн "A" // заÑем попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A" // заÑем вÑзов меÑода "foo" внÑÑÑеннего клаÑÑа "A" ::A::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A" // заÑем вÑзов меÑода "foo" клаÑÑа "A" из глобалÑного пÑоÑÑÑанÑÑва имÑн ?> ]]></programlisting> </example> </sect1> </chapter> <!-- 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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/exceptions.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/exceptions.xml +++ phpdoc-ru/language/exceptions.xml <?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 1.5 Status: ready --> <!-- $Revision: 1.1 $ --> <chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook"> <title>ÐÑклÑÑениÑ</title> <para> ÐÐ¾Ð´ÐµÐ»Ñ Ð¸ÑклÑÑений (exceptions) в PHP 5 пÑоÑе, Ñем в дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐÑклÑÑение можно ÑгенеÑиÑоваÑÑ (как говоÑÑÑ, "вÑбÑоÑиÑÑ") пÑи помоÑи опеÑаÑоÑа <literal>throw</literal>, и можно пеÑÐµÑ Ð²Ð°ÑиÑÑ (или, как говоÑÑÑ, "поймаÑÑ") опеÑаÑоÑом <literal>catch</literal>. Ðод вÑбÑаÑÑваÑÑий иÑклÑÑение, должен бÑÑÑ Ð¾ÐºÑÑжен блоком <literal>try</literal>, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло пеÑÐµÑ Ð²Ð°ÑиÑÑ Ð¸ÑклÑÑение. ÐаждÑй блок <literal>try</literal> должен имеÑÑ ÐºÐ°Ðº минимÑм один ÑооÑвеÑÑÑвÑÑÑий блок <literal>catch</literal>. Так же можно иÑполÑзоваÑÑ Ð½ÐµÑколÑко блоков <literal>catch</literal>, пеÑÐµÑ Ð²Ð°ÑÑваÑÑÐ¸Ñ ÑазлиÑнÑе клаÑÑÑ Ð¸ÑклÑÑений. ÐоÑмалÑное вÑполнение (когда не генеÑиÑÑеÑÑÑ Ð¸ÑклÑÑений в Ð±Ð»Ð¾ÐºÐ°Ñ <literal>try</literal> или когда клаÑÑ Ð²ÑбÑоÑенного иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÐºÐ»Ð°ÑÑами, обÑÑвленнÑми в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ°Ñ <literal>catch</literal>) бÑÐ´ÐµÑ Ð¿Ñодолжено за поÑледним блоком <literal>catch</literal>. ÐÑклÑÑÐµÐ½Ð¸Ñ Ñак же могÑÑ Ð±ÑÑÑ ÑгенеÑиÑÐ¾Ð²Ð°Ð½Ð½Ñ (или пеÑегеÑеÑиÑÐ¾Ð²Ð°Ð½Ñ - Ñ.е. вÑбÑоÑÐµÐ½Ñ Ñнова) опеÑаÑоÑом <literal>throw</literal> внÑÑÑи блока <literal>catch</literal>. </para> <para> ÐÑи генеÑаÑии иÑклÑÑениÑ, код ÑледÑÑÑий ниже опеÑаÑоÑа <literal>throw</literal> иÑполнен не бÑдеÑ, а PHP пÑедпÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð¿ÑÑÐºÑ Ð½Ð°Ð¹Ñи пеÑвÑй блок <literal>catch</literal>, пеÑÐµÑ Ð²Ð°ÑÑваÑÑий иÑклÑÑение данного клаÑÑа. ÐÑли иÑклÑÑение не бÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено, PHP вÑдаÑÑ ÑообÑение об оÑибке: "<literal>Uncaught Exception ...</literal>" (ÐепеÑÐµÑ Ð²Ð°Ñенное иÑклÑÑение), еÑли конеÑно не бÑл опÑеделен обÑабоÑÑик оÑибок пÑи помоÑи ÑÑнкÑии <function>set_exception_handler</function>. </para> <example> <title>ÐÑбÑÐ¾Ñ Ð¸ÑклÑÑений</title> <programlisting role="php"> <![CDATA[ <?php function inverse($x) { if (!$x) { throw new Exception('Ðеление на нолÑ.'); } else return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'ÐÑбÑоÑено иÑклÑÑение: ', $e->getMessage(), "\n"; } // ÐÑодолжение вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ echo 'Hello World'; ?> ]]> </programlisting> &example.outputs; <screen> <![CDATA[ 0.2 ÐÑбÑоÑено иÑклÑÑение: Ðеление на нолÑ. Hello World ]]> </screen> </example> <sect1 xml:id="language.exceptions.extending"> <title>ÐаÑледование иÑклÑÑений</title> <para> ÐпÑеделеннÑй полÑзоваÑелем клаÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¾Ð¿Ñеделен, как клаÑÑ ÑаÑÑиÑÑÑÑий (наÑледÑÑÑий) вÑÑÑоеннÑй клаÑÑ Exception. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва клаÑÑа Exception, доÑÑÑпнÑе доÑеÑним клаÑÑам. </para> <example> <title>ÐÑÑÑоенÑй клаÑÑ Exception</title> <programlisting role="php"> <![CDATA[ <?php class Exception { protected $message = 'Unknown exception'; // ÑообÑение protected $code = 0; // Ðод иÑклÑÑениÑ, опÑеделÑемÑй полÑзоваÑелем protected $file; // Ñайл в коÑоÑом бÑло вÑбÑоÑено иÑклÑÑение protected $line; // ÑÑÑока в коÑоÑой бÑло вÑбÑоÑено иÑклÑÑение function __construct($message = null, $code = 0); final function getMessage(); // ÐозвÑаÑÐ°ÐµÑ ÑообÑение иÑклÑÑÐµÐ½Ð¸Ñ final function getCode(); // Ðод иÑклÑÑÐµÐ½Ð¸Ñ final function getFile(); // Файл, где вÑбÑоÑено иÑклÑÑение final function getLine(); // СÑÑока, вÑбÑоÑивÑÐ°Ñ Ð¸ÑклÑÑени final function getTrace(); // ÐаÑÑив backtrace() final function getTraceAsString(); // ÐбÑаÑÐ½Ð°Ñ ÑÑаÑÑиÑовка как ÑÑÑока /* Overrideable - Ñ.е. Ñо, ÑÑо можно пеÑеопÑеделиÑÑ */ function __toString(); // должен веÑнÑÑÑ ÑоÑмаÑиÑованнÑÑ ÑÑÑокÑ, Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ } ?> ]]> </programlisting> </example> <para> ÐÑли клаÑÑ, наÑледÑемÑй Ð¾Ñ Exception пеÑеопÑеделÑÐµÑ <link linkend="language.oop5.decon">конÑÑÑÑкÑоÑ</link>, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑзваÑÑ Ð² конÑÑÑÑкÑоÑе <link linkend="language.oop5.paamayim-nekudotayim" >parent::__construct()</link>, ÑÑÐ¾Ð±Ñ Ð±ÑÑÑ ÑвеÑеннÑм, ÑÑо вÑе дÑннÑе бÑдÑÑ Ð´Ð¾ÑÑÑпнÑ. ÐеÑод <link linkend="language.oop5.magic">__toString()</link> Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделен, ÑÑо Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð½ÑжнÑй вÑвод, когда обÑÐµÐºÑ Ð¿ÑеобÑазÑеÑÑÑ Ð² ÑÑÑокÑ. </para> <example> <title>ÐаÑледование клаÑÑа Exception</title> <programlisting role="php"> <![CDATA[ <?php /** * ÐпÑеделим Ñвой клаÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ */ class MyException extends Exception { // ÐеÑеопÑеделим иÑклÑÑение Ñак, ÑÑо паÑамеÑÑ message ÑÑÐ°Ð½ÐµÑ Ð¾Ð±ÑзаÑелÑнÑм public function __construct($message, $code = 0) { // какой-Ñо код parent::__construct($message, $code); } // ÐеÑеопÑеделим ÑÑÑоковое пÑедÑÑавление обÑекÑа. public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ опÑеделÑÑÑ Ð½Ð¾Ð²Ñе меÑÐ¾Ð´Ñ Ð² наÑледÑемом клаÑÑе\n"; } } /** * Создадим клаÑÑ Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ */ class TestException { public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // ÐÑоÑаем ÑобÑÑвенное иÑклÑÑение throw new MyException('1 - непÑавилÑнÑй паÑамеÑÑ', 5); break; case self::THROW_DEFAULT: // ÐÑоÑаем вÑÑÑоеное иÑклÑÑение throw new Exception('2 - недопÑÑÑимÑй паÑамеÑÑ', 6); break; default: // ÐÐ¸ÐºÐ°ÐºÐ¸Ñ Ð¸ÑклÑÑений, обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñоздан. $this->var = $avalue; break; } } } // Example 1 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (MyException $e) { // Will be caught echo "Ðоймано ÑобÑÑвенное, пеÑеопÑеделенное иÑклÑÑение\n", $e; $e->customFunction(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÑопÑÑено. echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑÑÑда бÑÐ´ÐµÑ Ð¿Ñодолжено вÑполнение пÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 2 try { $o = new TestException(TestException::THROW_DEFAULT); } catch (MyException $e) { // Тип иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÑ echo "Ðоймано пеÑеопÑеделенное иÑклÑÑение\n", $e; $e->customFunction(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено echo "ÐеÑÐµÑ Ð²Ð°Ñено вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑÑÑда бÑÐ´ÐµÑ Ð¿Ñодолжено вÑполнение пÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 3 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено. echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑодолжение иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 4 try { $o = new TestException(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÑопÑÑено, Ñ.к. иÑклÑÑение не вÑкидÑваеÑÑÑ echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑодолжение вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; ?> ]]> </programlisting> </example> </sect1> </chapter> <!-- 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 -->
http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/namespaces.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/namespaces.xml +++ phpdoc-ru/language/namespaces.xml <?xml version = "1.0" encoding = "utf-8"?> <!-- EN-Revision: 1.3 Status: ready --> <!-- $Revision: 1.1 $ --> <chapter xmlns="http://docbook.org/ns/docbook" version="1.1" xml:id="language.namespaces" xmlns:xml="http://www.w3.org/XML/1998/namespace"> <title>ÐÑоÑÑÑанÑÑва имÑн</title> <sect1 xml:id="language.namespaces.rationale"> <title>ÐÐ±Ð·Ð¾Ñ Ð¿ÑоÑÑÑанÑÑв имÑн</title> <simpara> ÐÑоÑÑÑанÑÑва имÑн Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð² PHP Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¿Ñоблем в болÑÑÐ¸Ñ PHP-библиоÑÐµÐºÐ°Ñ . Ð PHP вÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов глобалÑнÑ, поÑÑÐ¾Ð¼Ñ Ð°Ð²ÑоÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑбиÑаÑÑ ÑникалÑнÑе имена Ð´Ð»Ñ ÑоздаваемÑÑ Ð¸Ð¼Ð¸ клаÑÑов. ÐÑо делаеÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñи иÑполÑзовании библиоÑеки ÑовмеÑÑно Ñ Ð´ÑÑгими библиоÑеками не возникало конÑликÑов имÑн. ÐбÑÑно ÑÑо доÑÑигаеÑÑÑ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ в имена клаÑÑов пÑеÑикÑов. ÐапÑимеÑ: еÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ <classname>dataBase</classname> - велика веÑоÑÑноÑÑÑ, ÑÑо Ñакое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа бÑÐ´ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð¸ в дÑÑÐ³Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÐ°Ñ , а пÑи Ð¸Ñ ÑовмеÑÑном иÑполÑзовании Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð²ÑнÑÐ¶Ð´ÐµÐ½Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа дÑÑгое имÑ. ÐапÑимеÑ: <classname>ourLibraryDataBase</classname> Такие дейÑÑÐ²Ð¸Ñ Ð¿ÑиводÑÑ Ðº ÑеÑезмеÑÐ½Ð¾Ð¼Ñ Ð²ÑÑаÑÑÐ°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ Ð¸Ð¼Ñн клаÑÑов. </simpara> <simpara> ÐÑоÑÑÑанÑÑва имÑн позволÑÑÑ ÑазÑабоÑÑÐ¸ÐºÑ ÑпÑавлÑÑÑ Ð·Ð¾Ð½Ð°Ð¼Ð¸ видимоÑÑи имÑн, ÑÑо избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑеÑикÑов и ÑеÑезмеÑно длиннÑÑ Ð¸Ð¼Ñн. ÐÑе ÑÑо ÑлÑÐ¶Ð¸Ñ Ð¿Ð¾Ð²ÑÑÐµÐ½Ð¸Ñ ÑиÑабелÑноÑÑи кода. </simpara> <simpara> ÐÑоÑÑÑанÑÑва имÑн доÑÑÑÐ¿Ð½Ñ Ð² PHP наÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 5.3.0. ÐÐ°Ð½Ð½Ð°Ñ ÑекÑÐ¸Ñ ÑкÑпеÑименÑалÑна и возможно бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð²ÐµÑжена изменениÑм. </simpara> </sect1> <sect1 xml:id="language.namespaces.definition"> <title>ÐпÑеделение пÑоÑÑÑанÑÑва имÑн</title> <para> ÐÑоÑÑÑанÑÑво имÑн опÑеделÑеÑÑÑ Ð¿Ð¾ÑÑедÑÑвом клÑÑевого Ñлова <literal>namespace</literal>, коÑоÑое должно Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² Ñамом наÑале Ñайла. ÐÑимеÑ: <example> <title>ÐпÑеделение пÑоÑÑÑанÑÑва имÑн.</title> <programlisting role="php"><![CDATA[ <?php namespace MyProject::DB; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?> ]]></programlisting> </example> ÐÑо пÑоÑÑÑанÑÑво имÑн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано в ÑазнÑÑ ÑÐ°Ð¹Ð»Ð°Ñ . </para> <para> ÐÑоÑÑÑанÑÑва имÑн могÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов, конÑÑÐ°Ð½Ñ Ð¸ ÑÑнкÑий. Ðо не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð±ÑÑного кода. </para> <para> ÐпÑеделение пÑоÑÑÑанÑÑва имÑн ÑабоÑÐ°ÐµÑ Ñак: <itemizedlist> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑе имена клаÑÑов, ÑÑнкÑий и конÑÑÐ°Ð½Ñ Ð°Ð²ÑомаÑиÑеÑки бÑдÑÑ Ð¿ÑеÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ пÑоÑÑÑанÑÑва имÑн. Ðмена клаÑÑов пÑи вÑзове Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð½Ñми, Ñак напÑÐ¸Ð¼ÐµÑ Ð¿Ñи вÑзове клаÑÑа из пÑимеÑа вÑÑе должно иÑполÑзоваÑÑÑÑ ÑледÑÑÑее Ð¸Ð¼Ñ <classname>MyProject::DB::Connection</classname>. </simpara> </listitem> <listitem> <simpara> ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ ÑоздаÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, ÑоÑÑоÑÑие из имени пÑоÑÑÑанÑÑва имÑн и имени конÑÑанÑÑ. Ðак и конÑÑанÑÑ ÐºÐ»Ð°ÑÑов - конÑÑанÑÑ Ð¿ÑоÑÑÑанÑÑва имÑн могÑÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе ÑолÑко ÑкалÑÑного Ñипа. </simpara> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени клаÑÑа (Ñ.е. не ÑодеÑжаÑего <literal>::</literal>) оÑÑÑеÑÑвлÑеÑÑÑ Ð² ÑледÑÑÑей поÑледоваÑелÑноÑÑи: <orderedlist> <listitem> <simpara> ÐопÑÑка найÑи клаÑÑ Ð² ÑекÑÑем пÑоÑÑÑанÑÑве имÑн (Ñ.е. пÑеÑикÑиÑование клаÑÑа именем ÑекÑÑего пÑоÑÑÑанÑÑва имÑн) без попÑÑки <link linkend="language.oop5.autoload">авÑозагÑÑзки (autoload)</link>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка найÑи клаÑÑ Ð² глобалÑном пÑоÑÑÑанÑÑве имÑн без попÑÑки <link linkend="language.oop5.autoload">авÑозагÑÑзки (autoload)</link>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка авÑозагÑÑзки в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн. </simpara> </listitem> <listitem> <simpara>Ð ÑлÑÑае неÑдаÑи пÑедÑдÑÑего - оÑказ.</simpara> </listitem> </orderedlist> </para> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени ÑÑнкÑии (Ñ.е. не вклÑÑаÑÑего <literal>::</literal>) во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑÑÑ ÑнаÑала в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн, заÑем в глобалÑном пÑоÑÑÑанÑÑве имÑн. </para> </listitem> <listitem> <para> ÐоиÑк неквалиÑиÑиÑованного имени конÑÑанÑÑ Ð¿ÑоизводиÑÑÑ ÑнаÑала в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн, заÑем ÑÑеди глобалÑно обÑÑвленнÑÑ ÐºÐ¾Ð½ÑÑанÑ. </para> </listitem> </itemizedlist> СмоÑÑи Ñак же <link linkend="language.namespaces.rules">пÑавила ÑазбоÑа имÑн</link>. </para> </sect1> <sect1 xml:id="language.namespaces.using" > <title>ÐÑполÑзование пÑоÑÑÑанÑÑв имÑн</title> <para> Ðа имена клаÑÑов и ÑÑнкÑий, обÑÑвленÑÑ Ð²Ð½ÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑегда можно ÑоÑлаÑÑÑÑ Ð¿Ð¾ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ñ Ð¸Ð¼ÐµÐ½Ð¸: <classname>MyProject::DB::Connection</classname> или <classname>MyProject::DB::connect</classname> . <example> <title>ÐÑполÑзование имÑн, обÑÑвленнÑÑ Ð²Ð½ÑÑÑи пÑоÑÑÑанÑÑв имÑн</title> <programlisting role="php"><![CDATA[ <?php require 'MyProject/Db/Connection.php'; $x = new MyProject::DB::Connection; MyProject::DB::connect(); ?> ]]></programlisting> </example> </para> <para> ÐÑоÑÑÑанÑÑва имÑн могÑÑ Ð±ÑÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² ÑекÑÑий конÑекÑÑ (глобалÑнÑй или пÑоÑÑÑанÑÑво имÑн) пÑи помоÑи опеÑаÑоÑа <literal>use</literal>. СинÑакÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа use: <informalexample> <programlisting role="php"><![CDATA[ <?php /* ... */ use Some::Name as Othername; // Ð¡Ð°Ð¼Ð°Ñ Ð¿ÑоÑÑÐ°Ñ ÑоÑма : use Foo::Bar; // ÑÑо Ñо же ÑÑо и : use Foo::Bar as Bar; ?> ]]></programlisting> </informalexample> ÐмпоÑÑиÑованнÑе пÑоÑÑÑанÑÑва имÑн ÑабоÑаÑÑ ÑледÑÑÑим обÑазом: каждÑй Ñаз, когда компилÑÑÐ¾Ñ Ð²ÑÑÑеÑÐ°ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ñное Ð¸Ð¼Ñ <literal>Othername</literal> (как пÑоÑÑое Ð¸Ð¼Ñ Ð¸Ð»Ð¸ как пÑеÑÐ¸ÐºÑ Ð±Ð¾Ð»ÐµÐµ длинного, Ñазделенного <literal>::</literal> имени), импоÑÑиÑованное Ð¸Ð¼Ñ <literal>Some::Name</literal> заменÑеÑÑÑ. </para> <para> ÐпеÑаÑÐ¾Ñ <literal>use</literal> Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован ÑолÑко в глобалÑном пÑоÑÑÑанÑÑве имÑн - не внÑÑÑи клаÑÑа или ÑÑнкÑии. ÐмпоÑÑиÑованнÑе имена дейÑÑвÑÑÑ Ñ ÑоÑки импоÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ конÑа ÑекÑÑего Ñайла. РекомендÑеÑÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ Ð¸Ð¼ÐµÐ½Ð° в наÑале Ñайла во избежание пÑÑаниÑÑ. </para> <para> <example> <title>ÐмпоÑÑиÑование пÑоÑÑÑанÑÑв имÑн и доÑÑÑп к ним</title> <programlisting role="php"><![CDATA[ <?php require 'MyProject/Db/Connection.php'; use MyProject::DB; use MyProject::DB::Connection as DbConnection; $x = new MyProject::DB::Connection(); $y = new DB::connection(); $z = new DbConnection(); DB::connect(); ?> ]]></programlisting> </example> </para> <para> <note> <simpara> ÐпеÑаÑÐ¸Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа пÑоÑÑÑанÑÑв имÑн вÑполнÑеÑÑÑ ÑолÑко во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. ÐÑе локалÑнÑе имена заменÑÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑом на Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñе ÑквиваленÑÑ. ÐамеÑÑÑе, ÑÑо ÑÑо не пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° в ÑÑÑоки. Таким обÑазом динамиÑеÑкий импоÑÑ Ð¿ÑоÑÑÑанÑÑв имÑн невозможен. </simpara> </note> </para> </sect1> <sect1 xml:id="language.namespaces.global"> <title>ÐлобалÑное пÑоÑÑÑанÑÑво имÑн</title> <para> Ðез опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо пÑоÑÑÑанÑÑва имÑн, вÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑов и ÑÑнкÑиий оказÑваÑÑÑÑ Ð² глобалÑном пÑоÑÑÑанÑÑве - как ÑÑо бÑло в PHP до поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑоÑÑÑанÑÑв имÑн. ÐÑеÑикÑиÑование имени знаками <literal>::</literal> ÑказÑваеÑ, ÑÑо Ð¸Ð¼Ñ Ð¸Ð· глобалÑного пÑоÑÑÑанÑÑва имÑн - ÑабоÑÐ°ÐµÑ Ð´Ð°Ð¶Ðµ в конÑекÑÑе пÑоÑÑÑанÑÑва имÑн. <example> <title>ÐÑполÑзование ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° глобалÑное пÑоÑÑÑанÑÑво имÑн </title> <programlisting role="php"><![CDATA[ <?php namespace A::B::C; /* This function is A::B::C::fopen */ function fopen() { /* ... */ $f = ::fopen(...); // вÑзÑÐ²Ð°ÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ fopen return $f; } ?> ]]></programlisting> </example> </para> </sect1> <sect1 xml:id="language.namespaces.constant"> <title>__NAMESPACE__</title> <para> ÐонÑÑанÑа вÑемени компилÑÑии <constant>__NAMESPACE__</constant> опÑеделÑÐµÑ ÑекÑÑее пÑоÑÑÑанÑÑво имÑн. Ðне пÑоÑÑÑанÑÑва имÑн ÑÑа конÑÑанÑа Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение пÑÑÑой ÑÑÑоки. ÐÑа конÑÑанÑа иÑполÑзÑеÑÑÑ ÐºÐ¾Ð³Ð´Ð° ÑÑебÑеÑÑÑ ÑÑоÑмиÑоваÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ i Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа или ÑÑнкÑии из ÑекÑÑего пÑоÑÑÑанÑÑва имÑн. <example> <title>ÐÑполÑзование __NAMESPACE__</title> <programlisting role="php"><![CDATA[ <?php namespace A::B::C; function foo() { // do stuff } set_error_handler(__NAMESPACE__ . "::foo"); ?> ]]></programlisting> </example> </para> </sect1> <sect1 xml:id="language.namespaces.rules"> <title>ÐÑавила ÑазбоÑа имÑн</title> <para> Ð Ð°Ð·Ð±Ð¾Ñ Ð¸Ð¼Ñн пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑледÑÑÑим пÑавилам: <orderedlist> <listitem> <simpara> ÐÑе квалиÑиÑиÑованнÑе имена ÑÑанÑлиÑÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии в ÑооÑвеÑÑÑвии Ñ ÑекÑÑими импоÑÑиÑованнÑми пÑоÑÑÑанÑÑвами имÑн. РпÑимеÑÑ, еÑли импоÑÑиÑовано поÑÑÑанÑÑво имÑн A::B::C, вÑзов <code>C::D::e()</code> бÑÐ´ÐµÑ ÑÑанÑлиÑован как <code>A::B::C::D::e()</code>. </simpara> </listitem> <listitem> <simpara> ÐеквалиÑиÑиÑованнÑе имена клаÑÑов ÑÑанÑлиÑÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии в ÑооÑвеÑÑÑвии Ñ ÑекÑÑими импоÑÑиÑованнÑми пÑоÑÑÑанÑÑвами имÑн (полнÑе имена заменÑÑÑ ÐºÐ¾ÑоÑкие импоÑÑиÑованнÑе имена). РпÑимеÑÑ, еÑли пÑоÑÑÑанÑÑво имÑн <literal>A::B::C</literal> импоÑÑиÑовано, <code>new C()</code> бÑÐ´ÐµÑ ÑÑанÑлиÑовано как <code>new A::B::C()</code>. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн вÑзов неквалиÑиÑиÑованнÑÑ ÑÑнкÑий, опÑеделеннÑÑ Ð² ÑÑом же пÑоÑÑÑанÑÑве имÑн инÑеÑпеÑÑиÑÑеÑÑÑ ÐºÐ°Ðº вÑзов в данном пÑоÑÑÑанÑÑве имÑн во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн (напÑÐ¸Ð¼ÐµÑ <literal>A::B</literal>) вÑзов неквалиÑиÑиÑованнÑÑ ÑÑнкÑий, не опÑеделеннÑÑ Ð² ÑÑом пÑоÑÑÑанÑÑве имÑн бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐÑзов ÑÑнкÑии <literal>foo()</literal> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом: </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн: <literal>A::B::foo()</literal>. </simpara> </listitem> <listitem> <simpara> ÐоиÑк <emphasis>внÑÑÑенней</emphasis> PHP ÑÑнкÑии <literal>foo()</literal>. </simpara> </listitem> </orderedlist> <simpara> Ð ÑлÑÑае неÑдаÑи вÑÐµÑ Ð¿ÑедÑдÑÑÐ¸Ñ Ð¿Ð¾Ð¿ÑÑок бÑÐ´ÐµÑ Ð¸ÑполÑзован вÑзов опÑеделенной в глобалÑном пÑоÑÑÑанÑÑве имÑн ÑÑнкÑии <literal>::foo()</literal>. </simpara> </listitem> <listitem> <simpara> ÐнÑÑÑи пÑоÑÑÑанÑÑва имÑн (напÑÐ¸Ð¼ÐµÑ <literal>A::B</literal>), вÑзов неквалиÑиÑиÑованнÑÑ ÐºÐ»Ð°ÑÑов ÑазÑеÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐапÑÐ¸Ð¼ÐµÑ Ð²Ñзов <code>new C()</code> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом: </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк клаÑÑа в ÑекÑÑем пÑоÑÑÑанÑÑве имÑн: <literal>A::B::C</literal>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка вÑзова <emphasis>внÑÑÑеннего</emphasis> PHP-клаÑÑа <literal>C</literal>. </simpara> </listitem> <listitem> <simpara> ÐопÑÑка авÑозагÑÑзки <literal>A::B::C</literal>. </simpara> </listitem> </orderedlist> <simpara> Ð ÑлÑÑае неÑдаÑи вÑÐµÑ Ð¿ÑедÑдÑÑÐ¸Ñ , бÑÐ´ÐµÑ Ð¸ÑполÑзован вÑзов <code>new ::C()</code>. </simpara> </listitem> <listitem> <simpara> ÐÑзов квалиÑиÑиÑованнÑÑ ÑÑнкÑий ÑазÑеÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐапÑÐ¸Ð¼ÐµÑ Ð²Ñзов <literal>A::B::foo()</literal> бÑÐ´ÐµÑ ÑазÑеÑаÑÑÑÑ ÑледÑÑÑим обÑазом : </simpara> <orderedlist> <listitem> <simpara> ÐоиÑк ÑÑнкÑии <literal>foo()</literal> в пÑоÑÑÑанÑÑве имÑн <literal>A::B</literal>. </simpara> </listitem> <listitem> <simpara> ÐоиÑк клаÑÑа <literal>A::B</literal> и вÑзов его ÑÑаÑиÑеÑкого меÑода <literal>foo()</literal>. ÐÑÐ´ÐµÑ Ñделана авÑозагÑÑзка клаÑÑа, еÑли Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾. </simpara> </listitem> </orderedlist> </listitem> <listitem> <simpara> ÐвалиÑиÑиÑованнÑе имена клаÑÑов ÑазÑеÑаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии, как клаÑÑÑ ÑооÑвеÑÑÑвÑÑÑего пÑоÑÑÑанÑÑва имÑн. РпÑимеÑÑ <code>new A::B::C()</code> бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° клаÑÑ <classname>C</classname> пÑоÑÑÑанÑÑва имÑн <literal>A::B</literal>. </simpara> </listitem> </orderedlist> </para> <example> <title>ÐÑимеÑÑ ÑазбоÑа имÑн</title> <programlisting role="php"><![CDATA[ <?php namespace A; // вÑÐ·Ð¾Ð²Ñ ÑÑнкÑий foo(); // ÑнаÑала попÑÑка вÑзваÑÑ "foo" опÑеделеннÑÑ Ð² пÑоÑÑÑанÑÑве имÑн "A" // заÑем вÑзов внÑÑÑенней ÑÑнкÑии "foo" ::foo(); // вÑÐ·Ð¾Ñ ÑÑнкÑии "foo" опÑеделенной глобалÑно // class references new B(); // ÑнаÑала попÑÑка ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ»Ð°ÑÑа "B" опÑеделенного в пÑоÑÑÑанÑÑве имÑн "A" // заÑем Ñоздание обÑекÑа внÑÑÑеннего клаÑÑа "B" new ::B(); // ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ»Ð°ÑÑа "B" опÑеделенного глобалÑно // ÑÑаÑиÑеÑкие меÑодÑ/ÑÑнкÑии пÑоÑÑÑанÑÑва имÑн из дÑÑÐ³Ð¸Ñ (не ÑекÑÑÐ¸Ñ ) пÑоÑÑÑанÑÑв имÑн B::foo(); // ÑнаÑала попÑÑка вÑзваÑÑ ÑÑнкÑÐ¸Ñ "foo" из пÑоÑÑÑанÑÑва имÑн "A::B" // заÑем вÑзов меÑода "foo" внÑÑÑеннего клаÑÑа "B" ::B::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" из пÑоÑÑÑанÑÑва имÑн "B" // заÑем вÑзов меÑода "foo" клаÑÑа "B" из глобалÑного пÑоÑÑÑанÑÑва имÑн // ÑÑаÑиÑеÑкие меÑодÑ/ÑÑнкÑии пÑоÑÑÑанÑÑва имÑн из ÑекÑÑего пÑоÑÑÑанÑÑва имÑн A::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A::A" // заÑем попÑÑка вÑзова меÑода "foo" клаÑÑа "A" из пÑоÑÑÑанÑÑва имÑн "A" // заÑем попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A" // заÑем вÑзов меÑода "foo" внÑÑÑеннего клаÑÑа "A" ::A::foo(); // ÑнаÑала попÑÑка вÑзова ÑÑнкÑии "foo" пÑоÑÑÑанÑÑва имÑн "A" // заÑем вÑзов меÑода "foo" клаÑÑа "A" из глобалÑного пÑоÑÑÑанÑÑва имÑн ?> ]]></programlisting> </example> </sect1> </chapter> <!-- 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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/exceptions.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/exceptions.xml +++ phpdoc-ru/language/exceptions.xml <?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 1.5 Status: ready --> <!-- $Revision: 1.1 $ --> <chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook"> <title>ÐÑклÑÑениÑ</title> <para> ÐÐ¾Ð´ÐµÐ»Ñ Ð¸ÑклÑÑений (exceptions) в PHP 5 пÑоÑе, Ñем в дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐÑклÑÑение можно ÑгенеÑиÑоваÑÑ (как говоÑÑÑ, "вÑбÑоÑиÑÑ") пÑи помоÑи опеÑаÑоÑа <literal>throw</literal>, и можно пеÑÐµÑ Ð²Ð°ÑиÑÑ (или, как говоÑÑÑ, "поймаÑÑ") опеÑаÑоÑом <literal>catch</literal>. Ðод вÑбÑаÑÑваÑÑий иÑклÑÑение, должен бÑÑÑ Ð¾ÐºÑÑжен блоком <literal>try</literal>, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло пеÑÐµÑ Ð²Ð°ÑиÑÑ Ð¸ÑклÑÑение. ÐаждÑй блок <literal>try</literal> должен имеÑÑ ÐºÐ°Ðº минимÑм один ÑооÑвеÑÑÑвÑÑÑий блок <literal>catch</literal>. Так же можно иÑполÑзоваÑÑ Ð½ÐµÑколÑко блоков <literal>catch</literal>, пеÑÐµÑ Ð²Ð°ÑÑваÑÑÐ¸Ñ ÑазлиÑнÑе клаÑÑÑ Ð¸ÑклÑÑений. ÐоÑмалÑное вÑполнение (когда не генеÑиÑÑеÑÑÑ Ð¸ÑклÑÑений в Ð±Ð»Ð¾ÐºÐ°Ñ <literal>try</literal> или когда клаÑÑ Ð²ÑбÑоÑенного иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÐºÐ»Ð°ÑÑами, обÑÑвленнÑми в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ°Ñ <literal>catch</literal>) бÑÐ´ÐµÑ Ð¿Ñодолжено за поÑледним блоком <literal>catch</literal>. ÐÑклÑÑÐµÐ½Ð¸Ñ Ñак же могÑÑ Ð±ÑÑÑ ÑгенеÑиÑÐ¾Ð²Ð°Ð½Ð½Ñ (или пеÑегеÑеÑиÑÐ¾Ð²Ð°Ð½Ñ - Ñ.е. вÑбÑоÑÐµÐ½Ñ Ñнова) опеÑаÑоÑом <literal>throw</literal> внÑÑÑи блока <literal>catch</literal>. </para> <para> ÐÑи генеÑаÑии иÑклÑÑениÑ, код ÑледÑÑÑий ниже опеÑаÑоÑа <literal>throw</literal> иÑполнен не бÑдеÑ, а PHP пÑедпÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð¿ÑÑÐºÑ Ð½Ð°Ð¹Ñи пеÑвÑй блок <literal>catch</literal>, пеÑÐµÑ Ð²Ð°ÑÑваÑÑий иÑклÑÑение данного клаÑÑа. ÐÑли иÑклÑÑение не бÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено, PHP вÑдаÑÑ ÑообÑение об оÑибке: "<literal>Uncaught Exception ...</literal>" (ÐепеÑÐµÑ Ð²Ð°Ñенное иÑклÑÑение), еÑли конеÑно не бÑл опÑеделен обÑабоÑÑик оÑибок пÑи помоÑи ÑÑнкÑии <function>set_exception_handler</function>. </para> <example> <title>ÐÑбÑÐ¾Ñ Ð¸ÑклÑÑений</title> <programlisting role="php"> <![CDATA[ <?php function inverse($x) { if (!$x) { throw new Exception('Ðеление на нолÑ.'); } else return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'ÐÑбÑоÑено иÑклÑÑение: ', $e->getMessage(), "\n"; } // ÐÑодолжение вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ echo 'Hello World'; ?> ]]> </programlisting> &example.outputs; <screen> <![CDATA[ 0.2 ÐÑбÑоÑено иÑклÑÑение: Ðеление на нолÑ. Hello World ]]> </screen> </example> <sect1 xml:id="language.exceptions.extending"> <title>ÐаÑледование иÑклÑÑений</title> <para> ÐпÑеделеннÑй полÑзоваÑелем клаÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¾Ð¿Ñеделен, как клаÑÑ ÑаÑÑиÑÑÑÑий (наÑледÑÑÑий) вÑÑÑоеннÑй клаÑÑ Exception. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва клаÑÑа Exception, доÑÑÑпнÑе доÑеÑним клаÑÑам. </para> <example> <title>ÐÑÑÑоенÑй клаÑÑ Exception</title> <programlisting role="php"> <![CDATA[ <?php class Exception { protected $message = 'Unknown exception'; // ÑообÑение protected $code = 0; // Ðод иÑклÑÑениÑ, опÑеделÑемÑй полÑзоваÑелем protected $file; // Ñайл в коÑоÑом бÑло вÑбÑоÑено иÑклÑÑение protected $line; // ÑÑÑока в коÑоÑой бÑло вÑбÑоÑено иÑклÑÑение function __construct($message = null, $code = 0); final function getMessage(); // ÐозвÑаÑÐ°ÐµÑ ÑообÑение иÑклÑÑÐµÐ½Ð¸Ñ final function getCode(); // Ðод иÑклÑÑÐµÐ½Ð¸Ñ final function getFile(); // Файл, где вÑбÑоÑено иÑклÑÑение final function getLine(); // СÑÑока, вÑбÑоÑивÑÐ°Ñ Ð¸ÑклÑÑени final function getTrace(); // ÐаÑÑив backtrace() final function getTraceAsString(); // ÐбÑаÑÐ½Ð°Ñ ÑÑаÑÑиÑовка как ÑÑÑока /* Overrideable - Ñ.е. Ñо, ÑÑо можно пеÑеопÑеделиÑÑ */ function __toString(); // должен веÑнÑÑÑ ÑоÑмаÑиÑованнÑÑ ÑÑÑокÑ, Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ } ?> ]]> </programlisting> </example> <para> ÐÑли клаÑÑ, наÑледÑемÑй Ð¾Ñ Exception пеÑеопÑеделÑÐµÑ <link linkend="language.oop5.decon">конÑÑÑÑкÑоÑ</link>, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑзваÑÑ Ð² конÑÑÑÑкÑоÑе <link linkend="language.oop5.paamayim-nekudotayim" >parent::__construct()</link>, ÑÑÐ¾Ð±Ñ Ð±ÑÑÑ ÑвеÑеннÑм, ÑÑо вÑе дÑннÑе бÑдÑÑ Ð´Ð¾ÑÑÑпнÑ. ÐеÑод <link linkend="language.oop5.magic">__toString()</link> Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделен, ÑÑо Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð½ÑжнÑй вÑвод, когда обÑÐµÐºÑ Ð¿ÑеобÑазÑеÑÑÑ Ð² ÑÑÑокÑ. </para> <example> <title>ÐаÑледование клаÑÑа Exception</title> <programlisting role="php"> <![CDATA[ <?php /** * ÐпÑеделим Ñвой клаÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ */ class MyException extends Exception { // ÐеÑеопÑеделим иÑклÑÑение Ñак, ÑÑо паÑамеÑÑ message ÑÑÐ°Ð½ÐµÑ Ð¾Ð±ÑзаÑелÑнÑм public function __construct($message, $code = 0) { // какой-Ñо код parent::__construct($message, $code); } // ÐеÑеопÑеделим ÑÑÑоковое пÑедÑÑавление обÑекÑа. public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ опÑеделÑÑÑ Ð½Ð¾Ð²Ñе меÑÐ¾Ð´Ñ Ð² наÑледÑемом клаÑÑе\n"; } } /** * Создадим клаÑÑ Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ */ class TestException { public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // ÐÑоÑаем ÑобÑÑвенное иÑклÑÑение throw new MyException('1 - непÑавилÑнÑй паÑамеÑÑ', 5); break; case self::THROW_DEFAULT: // ÐÑоÑаем вÑÑÑоеное иÑклÑÑение throw new Exception('2 - недопÑÑÑимÑй паÑамеÑÑ', 6); break; default: // ÐÐ¸ÐºÐ°ÐºÐ¸Ñ Ð¸ÑклÑÑений, обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñоздан. $this->var = $avalue; break; } } } // Example 1 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (MyException $e) { // Will be caught echo "Ðоймано ÑобÑÑвенное, пеÑеопÑеделенное иÑклÑÑение\n", $e; $e->customFunction(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÑопÑÑено. echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑÑÑда бÑÐ´ÐµÑ Ð¿Ñодолжено вÑполнение пÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 2 try { $o = new TestException(TestException::THROW_DEFAULT); } catch (MyException $e) { // Тип иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÑ echo "Ðоймано пеÑеопÑеделенное иÑклÑÑение\n", $e; $e->customFunction(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено echo "ÐеÑÐµÑ Ð²Ð°Ñено вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑÑÑда бÑÐ´ÐµÑ Ð¿Ñодолжено вÑполнение пÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 3 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñено. echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑодолжение иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; // Example 4 try { $o = new TestException(); } catch (Exception $e) { // ÐÑÐ´ÐµÑ Ð¿ÑопÑÑено, Ñ.к. иÑклÑÑение не вÑкидÑваеÑÑÑ echo "Ðоймано вÑÑÑоенное иÑклÑÑение\n", $e; } // ÐÑодолжение вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ var_dump($o); echo "\n\n"; ?> ]]> </programlisting> </example> </sect1> </chapter> <!-- 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 -->