cvs: phpdoc-ru /language/oop5 autoload.xml patterns.xml static.xml visibility.xml

From: Date: Fri, 21 Mar 2008 09:34:30 +0000
Subject: cvs: phpdoc-ru /language/oop5 autoload.xml patterns.xml static.xml visibility.xml
Groups: php.doc.ru 
Request: Send a blank email to doc-ru+get-897@lists.php.net to get a copy of this message
tony2001 Fri Mar 21 09:34:30 2008 UTC Added files: /phpdoc-ru/language/oop5 autoload.xml patterns.xml static.xml visibility.xml Log: add new translations by Alexey Romanenko <santiago at ofoto dot ru>

http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/oop5/autoload.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/oop5/autoload.xml +++ phpdoc-ru/language/oop5/autoload.xml <?xml version="1.0" encoding="utf-8" ?> <!-- EN-Revision: 1.9 --> <!-- $Revision: 1.1 $ --> <sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook"> <title>Автоматическая загрузка объектов</title> <para> Большинство разработчиков объектно-ориентированных приложений создают для каждого определения класса отдельный файл с кодом PHP. Одной из самых больших неприятностей в этом случае является необходимость писать в начале каждого скрипта длинный список подгружаемых файлов. </para> <para> Если используется PHP 5, то делать это не обязательно. Вы можете определить функцию __autoload, которая автоматически вызывается в том случае, когда вы пытаетесь использовать класс, который не был определен ранее. Вызов этой функции - это последний шанс для интерпретатора загрузить класс прежде, чем он закончит выполнение скрипта с ошибкой. </para> <note> <para> Исключения, вызванные в функции __autoload, не могут быть перехвачены в блоке <link linkend="language.exceptions">catch</link> и завершатся с неисправимой ошибкой. </para> </note> <note> <para> Автоматическая загрузка не доступна в случае использования PHP в командной строке в <link linkend="features.commandline">интерактивном режиме</link>. </para> </note> <note> <para> Если имя класса используется, например, для вызова через <function>call_user_func</function>, то оно может содержать некоторые опасные символы, такие как <literal>../</literal>. Поэтому, рекомендуется не использовать данные от пользователей в таких функциях или же, как минимум, проверять значения в <function>__autoload</function>. </para> </note> <para> <example> <title>Пример автоматической загрузки</title> <para> В этом примере функция пытается загрузить классы <literal>MyClass1</literal> и <literal>MyClass2</literal> из файлов <filename>MyClass1.php</filename> и <filename>MyClass2.php</filename> соответственно. </para> <programlisting role="php"> <![CDATA[ <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2(); ?> ]]> </programlisting> </example> </para> </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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/oop5/patterns.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/oop5/patterns.xml +++ phpdoc-ru/language/oop5/patterns.xml <?xml version="1.0" encoding="utf-8" ?> <!-- EN-Revision: 1.10 --> <!-- $Revision: 1.1 $ --> <sect1 xml:id="language.oop5.patterns" xmlns="http://docbook.org/ns/docbook"> <title>Шаблоны проектирования</title> <para> Шаблоны - это способ описания оптимальных методов и хороших дизайнов проектирования. Они предоставляют универсальные пути решения общих проблем программирования. </para> <sect2 xml:id="language.oop5.patterns.factory"> <title>Фабрика (Factory)</title> <para> Шаблон Фабрика позволяет создавать объекты во время работы программы. Этот шаблон называется Фабрикой потому, что он отвечает за производство объекта. Параметризированная фабрика принимает в качестве аргумента имя класса, объект которого создается. </para> <example> <title>Параметризированный фабричный метод</title> <programlisting role="php"> <![CDATA[ <?php class Example { // Параметризированный фабричный метод public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') { $classname = 'Driver_' . $type; return new $classname; } else { throw new Exception ('Драйвер не найден'); } } } ?> ]]> </programlisting> <para> Определение этого метода в классе позволяет драйверам быть загруженными "на лету". В случае, если класс <literal>Example</literal> был бы классом абстрактного доступа к базе данных, то загрузка драйвера <literal>MySQL</literal> и <literal>SQLite</literal> может быть выполнена следующим образом: </para> <programlisting role="php"> <![CDATA[ <?php // Загрузка драйвера MySQL $mysql = Example::factory('MySQL'); // Загрузка драйвера SQLite $sqlite = Example::factory('SQLite'); ?> ]]> </programlisting> </example> </sect2> <sect2 xml:id="language.oop5.patterns.singleton"> <title>Синглтон (Singleton)</title> <para> Шаблон проектирования Синглтон применяется в тех ситуациях, когда нужно получить единственный экземпляр класса. Большинство примеров, связанных с этим - это взаимодействие с базой данных. Реализация этого шаблона позволяют программисту создать единственный экземпляр класса, к которому будут иметь доступ остальные объекты. </para> <example> <title>Функция Синглтон</title> <programlisting role="php"> <![CDATA[ <?php class Example { // Содержит экземпляр класса private static $instance; // Закрытый конструктор; предотвращает прямой доступ к // созданию объекта private function __construct() { echo 'Я конструктор'; } // Метод синглтон public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // Метод для примера public function bark() { echo 'Гав!'; } // Предотвращает клонирование экземпляра класса public function __clone() { trigger_error('Клонирование запрещено.', E_USER_ERROR); } } ?> ]]> </programlisting> <para> Позволяет вернуть единственный экземпляр класса <literal>Example</literal> </para> <programlisting role="php"> <![CDATA[ <?php // Такой вариант завершится неудачей, так как конструктор // объявлен как private $test = new Example; // Это всегда возвращает единственный экземпляр класса $test = Example::singleton(); $test->bark(); // Это вызовет ошибку E_USER_ERROR. $test_clone = clone $test; ?> ]]> </programlisting> </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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/oop5/static.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/oop5/static.xml +++ phpdoc-ru/language/oop5/static.xml <?xml version="1.0" encoding="utf-8" ?> <!-- EN-Revision: 1.17 --> <!-- $Revision: 1.1 $ --> <sect1 xml:id="language.oop5.static" xmlns="http://docbook.org/ns/docbook"> <title>Ключевое слово "static"</title> <para> Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Атрибут класса, объявленный статическим, не можеть быть доступен посредством экземпляра класса (но статический метод может быть вызван). </para> <para> В целях совместимости с PHP 4, сделано так, что если не использовалось определение <link linkend="language.oop5.visibility">области видимости</link>, то член или метод будет рассматриваться, как если бы он был объявлен как <literal>public</literal>. </para> <para> Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная <varname>$this</varname> не доступна внутри метода, объявленного статическим. </para> <para> Доступ к статическим свойствам класса не может быть получен через оператор -&gt;. </para> <para> При попытке вызова нестатических методов статически выводится предупреждение уровня E_STRICT. </para> <para> Начиная с версии PHP 5.3.0 существует возможность ссылаться на класс используя переменную. Поэтому значение переменной в таком случае не может быть ключевым словом (например, <literal>self</literal>, <literal>parent</literal> и <literal>static</literal>). </para> <example> <title>Пример статического свойства</title> <programlisting role="php"> <![CDATA[ <?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } class Bar extends Foo { public function fooStatic() { return parent::$my_static; } } print Foo::$my_static . "\n"; $foo = new Foo(); print $foo->staticValue() . "\n"; print $foo->my_static . "\n"; // Не определено свойство my_static print $foo::$my_static . "\n"; $classname = 'Foo'; print $classname::$my_static . "\n"; // Начиная только с PHP 5.3.0 print Bar::$my_static . "\n"; $bar = new Bar(); print $bar->fooStatic() . "\n"; ?> ]]> </programlisting> </example> <example> <title>Пример статического метода</title> <programlisting role="php"> <![CDATA[ <?php class Foo { public static function aStaticMethod() { // ... } } Foo::aStaticMethod(); $classname = 'Foo'; $classname::aStaticMethod(); // Начиная только с PHP 5.3.0 ?> ]]> </programlisting> </example> </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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ru/language/oop5/visibility.xml?view=markup&rev=1.1 Index: phpdoc-ru/language/oop5/visibility.xml +++ phpdoc-ru/language/oop5/visibility.xml <?xml version="1.0" encoding="utf-8" ?> <!-- EN-Revision: 1.15 --> <!-- $Revision: 1.1 $ --> <sect1 xml:id="language.oop5.visibility" xmlns="http://docbook.org/ns/docbook"> <title>Область видимости</title> <para> Область видимости свойства или метода может быть определена путем использования следующих ключевых слов в объявлении: public, protected или private. Доступ к свойствам и методам классам, объявленным как public (общедоступный), может происходить из любого места. Модификатор protected (защищенный) позволяет иметь доступ наследуемым и родительским классам (а, также классу, в котором определен сам член класса). Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ. </para> <sect2 xml:id="language.oop5.visiblity-members"> <title>Область видимости свойств</title> <para> Свойства класса должны быть определены через модификаторы public, private, или protected. </para> <para> <example> <title>Объявление свойства класса</title> <programlisting role="php"> <![CDATA[ <?php /** * Определение MyClass */ class MyClass { public $public = 'Общий'; protected $protected = 'Защищенный'; private $private = 'Закрытый'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // Работает echo $obj->protected; // Неисправимая ошибка echo $obj->private; // Неисправимая ошибка $obj->printHello(); // Выводит Общий, Защищенный и Закрытый /** * Определение MyClass2 */ class MyClass2 extends MyClass { // Мы можем переопределить public и protected методы, но не private protected $protected = 'Защищенный2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // Работает echo $obj2->private; // Неопределен echo $obj2->protected; // Неисправимая ошибка $obj2->printHello(); // Выводит Общий, Защищенный2 и Закрытый ?> ]]> </programlisting> </example> </para> <note> <simpara> Метод объявления переменной через ключевое слово <emphasis>var</emphasis>, принятый в PHP 4, до сих пор поддерживается в целях совместимости (как синоним ключевого слова public). В версиях PHP 5 ниже 5.1.3 такое использование выводит предупреждение <constant>E_STRICT</constant>. </simpara> </note> </sect2> <sect2 xml:id="language.oop5.visiblity-methods"> <title>Область видимости метода</title> <para> Методы класса должны быть определены через модификаторы public, private, или protected. Методы, где определение модификатора отсутствует, определяются как public. </para> <para> <example> <title>Объявление метода</title> <programlisting role="php"> <![CDATA[ <?php /** * Определение MyClass */ class MyClass { // Объявление общедоступного конструктора public function __construct() { } // Объявление общедоступного метода public function MyPublic() { } // Объявление защищенного метода protected function MyProtected() { } // Объявление закрытого метода private function MyPrivate() { } // Это общедоступный метод function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // Работает $myclass->MyProtected(); // Неисправимая ошибка $myclass->MyPrivate(); // Неисправимая ошибка $myclass->Foo(); // Работает общий, защищенный и закрытый /** * Определение MyClass2 */ class MyClass2 extends MyClass { // Это общедоступный метод function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // Неисправимая ошибка } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // Работает $myclass2->Foo2(); // Работает общий и защищенный, закрытый не работает class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?> ]]> </programlisting> </example> </para> </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 (#897) next »