svn: /phpdoc/ru/trunk/ language/oop5/decon.xml reference/quickhash/quickhashinthash/add.xml

[email protected] (Andrey Gromov) Thu, 26 Nov 2020 09:10:09 +0000
Newsgroups php.doc.ru
Message-ID <[email protected]>
rjhdby                                   Thu, 26 Nov 2020 09:10:09 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=351666

Log:
upd, new

Changed paths:
    U   phpdoc/ru/trunk/language/oop5/decon.xml
    A   phpdoc/ru/trunk/reference/quickhash/quickhashinthash/add.xml
svn-diffs-351666.txt (text/x-diff, 23.4 KB)
Modified: phpdoc/ru/trunk/language/oop5/decon.xml
===================================================================
--- phpdoc/ru/trunk/language/oop5/decon.xml	2020-11-26 09:10:02 UTC (rev 351665)
+++ phpdoc/ru/trunk/language/oop5/decon.xml	2020-11-26 09:10:09 UTC (rev 351666)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- EN-Revision: 351129 Maintainer: shein Status: ready -->
+<!-- EN-Revision: 351474 Maintainer: shein Status: ready -->
 <!-- Reviewed: yes -->
 <!-- $Revision$ -->
 <sect1 xml:id="language.oop5.decon" xmlns="http://docbook.org/ns/docbook">
@@ -7,12 +7,12 @@

  <sect2 xml:id="language.oop5.decon.constructor">
   <title>Конструктор</title>
-   <methodsynopsis xml:id="object.construct">
-    <type>void</type><methodname>__construct</methodname>
-    <methodparam rep="repeat"><type>mixed</type><parameter>values</parameter><initializer>""</initializer></methodparam>
-   </methodsynopsis>
+  <methodsynopsis xml:id="object.construct">
+   <type>void</type><methodname>__construct</methodname>
+   <methodparam rep="repeat"><type>mixed</type><parameter>values</parameter><initializer>""</initializer></methodparam>
+  </methodsynopsis>
   <para>
-   PHP 5 позволяет объявлять методы-конструкторы. Классы, в которых
+   PHP позволяет объявлять методы-конструкторы. Классы, в которых
    объявлен метод-конструктор, будут вызывать этот метод при каждом
    создании нового объекта, так что это может оказаться полезным,
    например, для инициализации какого-либо состояния объекта
@@ -31,7 +31,7 @@
    </simpara>
   </note>
   <example>
-   <title>Использование унифицированных конструкторов</title>
+   <title>Конструкторы при наследовании</title>
    <programlisting role="php">
 <![CDATA[
 <?php
@@ -66,24 +66,6 @@
    </programlisting>
   </example>
   <para>
-   В целях обратной совместимости, если PHP 5 не может обнаружить
-   объявленный метод <link linkend="object.construct">__construct()</link>, то
-   вызов конструктора произойдет по устаревшей схеме, через обращение к методу,
-   имя которого соответствует имени класса. Может возникнуть только
-   одна проблема совместимости старого кода, если в нём присутствуют
-   классы с методами <link linkend="object.construct">__construct()</link>,
-   использующиеся для других целей.
-  </para>
-  <!-- Not using an entity because I want specific wording here, since we're
-   not deprecating constructors in general. -->
-  <warning>
-   <simpara>
-    Конструкторы старого типа объявлены <emphasis>УСТАРЕВШИМИ</emphasis> в PHP 7.0
-    и будут удалены в будущих версиях. В новом коде всегда используйте
-    <link linkend="object.construct">__construct()</link>.
-   </simpara>
-  </warning>
-  <para>
    В отличие от других методов, PHP не будет генерировать ошибку
    уровня <constant>E_STRICT</constant>, если
    <link linkend="object.construct">__construct()</link>
@@ -92,27 +74,186 @@
    <link linkend="object.construct">__construct()</link>.
   </para>
   <para>
-   Начиная с PHP 5.3.3, методы с именами, совпадающими с
-   последним элемeнтом имени класса, находящимся в пространстве имен,
-   больше не будут считаться конструкторами. Это изменение не влияет
-   на классы, не находящиеся в пространстве имен.
+   Конструкторы - это обычные методы, которые вызываются при
+   инстанциировании соответствующих объектов. Следовательно, они могут иметь
+   произвольное количество аргументов, которые могут быть обязательными, могут
+   быть типизированными и иметь значения по умолчанию. Аргументы конструктора
+   указываются в круглых скобках после имени класса.
   </para>
   <example>
-   <title>Конструкторы в классах, находящихся в пространстве имен</title>
+   <title>Использование аргументов в конструкторах</title>
    <programlisting role="php">
 <![CDATA[
 <?php
-namespace Foo;
-class Bar {
-    public function Bar() {
-        // рассматривается как конструктор в версиях PHP 5.3.0-5.3.2
-        // и как обычный метод, начиная с версии PHP 5.3.3
+class Point {
+    protected int $x;
+    protected int $y;
+
+    public function __construct(int $x, int $y = 0) {
+        $this->x = $x;
+        $this->y = $y;
     }
 }
+
+// Передаём оба параметра.
+$p1 = new Point(4, 5);
+// Передаём только обязательные параметры. Для $y используется значеие по умолчанию 0.
+$p2 = new Point(4);
+// Вызываем с именованными параметрами (начиная с PHP 8.0):
+$p3 = new Point(y: 5, x: 4);
 ?>
 ]]>
+   </programlisting>
+  </example>
+  <para>
+   Если у класса нет конструктора, или его конструктор не имеет обязательных парметров, скобки
+   после имени класса можно не писать.
+  </para>
+  <sect3>
+   <title>Конструкторы в старом стиле</title>
+   <para>
+    До PHP 8.0.0, классы в глобальном пространстве имен будут интерпретировать метод,
+    названный так же, как класс, как конструктор старого стиля. Этот синтаксис считается
+    устаревшим и будет вызывать ошибку уровня <constant>E_DEPRECATED</constant>, но
+    всё равно эти методы будут вызываться в качестве конструктора.
+    Если в классе присутствуют и <link linkend="object.construct">__construct()</link>
+    и метод с именем класса, то в качестве конструктора будет вызван
+    <link linkend="object.construct">__construct()</link>.
+   </para>
+   <para>
+    Для классов, находящихся в собственном пространстве имён и для всех классов, начиная с
+    PHP 8.0.0, метод названный по имени класса будет игнорироваться.
+   </para>
+   <para>В новом коде всегда используйте <link linkend="object.construct">__construct()</link>.
+   </para>
+  </sect3>
+  <sect3 xml:id="language.oop5.decon.constructor.promotion">
+   <title>Определение свойств объекта в конструкторе</title>
+   <para>
+    Начиная с PHP 8.0.0, параметры конструктора можно использовать для задания
+    соответствующих свойств объекта. Это довольно распространённая практика, присваивать
+    свойствам объекта параметры переданые в конструктор не производя никаких дополнительных
+    преобразований. Определение свойств класса в конструкторе позволяет значительно
+    сократить количество шаблонного кода для такого случая. Пример выше можно будет
+    переписать следующим образом.
+   </para>
+   <example>
+    <title>Использование определения свойств в конструкторе</title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+class Point {
+    public function __construct(protected int $x, protected int $y = 0) {
+    }
+}
+]]>
     </programlisting>
-  </example>
+   </example>
+   <para>
+    Если декларация аргумент конструктора включает модификатор видимости, PHP интерпритирует
+    его одновременно и как аргумент конструктора и как свойство объекта и автоматически
+    присвоит свойству значение, переданное в конструктор. При этом, если не предполагается
+    какой либо дополнительной логики, тело конструктора можно оставить пустым. Код
+    конструктора выполнится после того, как все аргументы присвоятся всем соответствующим
+    свойствам.
+   </para>
+   <para>
+    В случае, если необходимо передать в конструктор аргументы, не являющиеся
+    свойствами объекта - это можно сделать. В конструкторе можно задавать как обычные
+    аргументы так и являющиеся свойствами объекта в любом порядке. Аргументы-свойства
+    никак не влияют на код, исполняемый в конструкторе.
+   </para>
+   <note>
+    <para>
+     Свойства объектов не могут быть типа <type>callable</type> в связи с неоднозначностью
+     которую они представляют для движка PHP. Соответственно и свойства определяемые
+     в конструкторе также не могут быть типа <type>callable</type>. Любые другие
+     <link linkend="language.types.declarations">декларации типов</link> допустимы.
+    </para>
+   </note>
+   <note>
+    <para>
+     <!-- This should be linked once attributes are documented. -->
+     Атрибуты, заданные для таких аргументов, будут применены как для них самих, так и для
+     соответствующих свойств.
+    </para>
+   </note>
+  </sect3>
+  <sect3 xml:id="language.oop5.decon.constructor.static">
+   <title>Статические методы создания объекта</title>
+   <para>
+    PHP поддерживает только один конструктор для класса. Однако в некоторых случаях есть
+    необходимость создавать объект разными путями в зависимости от разных входных даных.
+    Рекомендуемый способ - использовать статические методы как обёртки над конструктором.
+   </para>
+   <example>
+    <title>Использование статических методов для создания объектов</title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+class Product {
+
+    private ?int $id;
+    private ?string $name;
+
+    private function __construct(?int $id = null, ?string $name = null) {
+        $this->id = $id;
+        $this->name = $name;
+    }
+
+    public static function fromBasicData(int $id, string $name): static {
+        $new = new static($id, $name);
+        return $new;
+    }
+
+    public static function fromJson(string $json): static {
+        $data = json_decode($json);
+        return new static($data['id'], $data['name']);
+    }
+
+    public static function fromXml(string $xml): static {
+        // Put your own logic here.
+        $data = convert_xml_to_array($xml);
+        $new = new static();
+        $new->id = $data['id'];
+        $new->name = $data['name'];
+        return $new;
+    }
+}
+
+$p1 = Product::fromBasicData(5, 'Widget');
+$p2 = Product::fromJson($some_json_string);
+$p3 = Product::fromXml($some_xml_string);
+]]>
+    </programlisting>
+   </example>
+   <para>
+    Конструктор можно сделать скрытым или защищённым для предотвращения его прямого вызова.
+    В таком случае для инстанциации останется только вариант со статическими методами.
+    Так как это методы того же класса, они имеют доступ ко всем его скрытым методам даже
+    если они относятся к разным экземплярам класса. Скрытый конструктор опционален и
+    может присутствовать или отсутствовать по необходимости.
+   </para>
+   <para>
+    В примере выше три публичных статических метода демонстрируют различные способы
+    создания экземпляра объекта.
+   </para>
+   <simplelist>
+    <member><code>fromBasicData()</code> принимает явные параметры, создаёт экземпляр
+     класса через конструктор и возвращает объект.</member>
+    <member><code>fromJson()</code> принимает JSON строку, производит над ней некоторые
+     преобразования, извлекает данные необходимые для создания объекта и, так же как и
+     предыдущий метод, вызывает конструктор и возвращает созданный объект.</member>
+    <member><code>fromXml()</code> принимает XML строку, извлекает нужные данные и, так
+     как в конструкторе нет обязательных параметров, вызывает его без них. После этого, так
+     как ему доступны скрытые свойства, он присваевает им значения напрямую. После чего
+     возвращает готовый объект.</member>
+   </simplelist>
+   <para>
+    Во всех трёх случаях, ключевое слово <code>static</code> транслируется в имя класса
+    в котором этот код вызывается. В нашем случае <code>Product</code>.
+   </para>
+  </sect3>
  </sect2>

  <sect2 xml:id="language.oop5.decon.destructor">
@@ -147,34 +288,34 @@
 $obj = new MyDestructableClass();

 ]]>
-    </programlisting>
-   </example>
+   </programlisting>
+  </example>
+  <para>
+   Как и в случае с конструкторами, деструкторы, объявленные
+   в родительском классе, не будут вызываться автоматически.
+   Для вызова деструктора родительского класса,
+   требуется вызвать <function>parent::__destruct</function> в
+   теле деструктора дочернего класса. Подобно конструкторам, дочерний класс может унаследовать
+   деструктор из родительского класса, если он не определен в нем.
+  </para>
+  <para>
+   Деструктор будет вызываться даже в том случае, если скрипт был остановлен с
+   помощью функции <function>exit</function>. Вызов <function>exit</function>
+   в деструкторе предотвратит запуск всех последующих функций завершения.
+  </para>
+  <note>
    <para>
-    Как и в случае с конструкторами, деструкторы, объявленные
-    в родительском классе, не будут вызываться автоматически.
-    Для вызова деструктора родительского класса,
-    требуется вызвать <function>parent::__destruct</function> в
-    теле деструктора дочернего класса. Подобно конструкторам, дочерний класс может унаследовать
-    деструктор из родительского класса, если он не определен в нем.
+    Деструкторы, вызываемые при завершении скрипта, вызываются после отправки
+    HTTP-заголовков. Рабочая директория во время фазы завершения скрипта
+    может отличаться в некоторых SAPI (например, в Apache).
    </para>
+  </note>
+  <note>
    <para>
-    Деструктор будет вызываться даже в том случае, если скрипт был остановлен с
-    помощью функции <function>exit</function>. Вызов <function>exit</function>
-    в деструкторе предотвратит запуск всех последующих функций завершения.
+    Попытка выбросить исключение из деструктора (вызываемого во время
+    завершения скрипта) вызывает фатальную ошибку.
    </para>
-   <note>
-    <para>
-     Деструкторы, вызываемые при завершении скрипта, вызываются после отправки
-     HTTP-заголовков. Рабочая директория во время фазы завершения скрипта
-     может отличаться в некоторых SAPI (например, в Apache).
-    </para>
-   </note>
-   <note>
-    <para>
-     Попытка выбросить исключение из деструктора (вызываемого во время
-     завершения скрипта) вызывает фатальную ошибку.
-    </para>
-   </note>
+  </note>
  </sect2>

 </sect1>

Added: phpdoc/ru/trunk/reference/quickhash/quickhashinthash/add.xml
===================================================================
--- phpdoc/ru/trunk/reference/quickhash/quickhashinthash/add.xml	                        (rev 0)
+++ phpdoc/ru/trunk/reference/quickhash/quickhashinthash/add.xml	2020-11-26 09:10:09 UTC (rev 351666)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 321911 Maintainer: rjhdby Status: ready -->
+<!-- Reviewed: no -->
+
+<refentry xml:id="quickhashinthash.add" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <refnamediv>
+  <refname>QuickHashIntHash::add</refname>
+  <refpurpose>Добавить элемент в хэш</refpurpose>
+ </refnamediv>
+
+ <refsect1 role="description">
+  &reftitle.description;
+  <methodsynopsis>
+   <modifier>public</modifier> <type>bool</type><methodname>QuickHashIntHash::add</methodname>
+   <methodparam><type>int</type><parameter>key</parameter></methodparam>
+   <methodparam choice="opt"><type>int</type><parameter>value</parameter></methodparam>
+  </methodsynopsis>
+  <para>
+   Добавляет элемент в хэш и возвращает &true; или &false; в зависимости от успешности операции.
+   По умолчанию, добавление происходит всегда, если при создании хэша не использовался флаг
+   QuickHashIntHash::CHECK_FOR_DUPES.
+  </para>
+ </refsect1>
+
+ <refsect1 role="parameters">
+  &reftitle.parameters;
+  <para>
+   <variablelist>
+    <varlistentry>
+     <term><parameter>key</parameter></term>
+     <listitem>
+      <para>
+       Ключ добавляемой записи.
+      </para>
+     </listitem>
+    </varlistentry>
+    <varlistentry>
+     <term><parameter>value</parameter></term>
+     <listitem>
+      <para>
+       Опциональное значение. Если не задано, то будет использоваться <literal>1</literal>.
+      </para>
+     </listitem>
+    </varlistentry>
+   </variablelist>
+  </para>
+ </refsect1>
+
+ <refsect1 role="returnvalues">
+  &reftitle.returnvalues;
+  <para>
+   В случае удачного добавления возвращает &true;. В случае неудачного - &false;.
+  </para>
+ </refsect1>
+
+ <refsect1 role="examples">
+  &reftitle.examples;
+  <para>
+   <example>
+    <title>Пример использования <function>QuickHashIntHash::add</function></title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+echo "without dupe checking\n";
+$hash = new QuickHashIntHash( 1024 );
+var_dump( $hash->exists( 4 ) );
+var_dump( $hash->get( 4 ) );
+var_dump( $hash->add( 4, 22 ) );
+var_dump( $hash->exists( 4 ) );
+var_dump( $hash->get( 4 ) );
+var_dump( $hash->add( 4, 12 ) );
+
+echo "\nwith dupe checking\n";
+$hash = new QuickHashIntHash( 1024, QuickHashIntHash::CHECK_FOR_DUPES );
+var_dump( $hash->exists( 4 ) );
+var_dump( $hash->get( 4 ) );
+var_dump( $hash->add( 4, 78 ) );
+var_dump( $hash->exists( 4 ) );
+var_dump( $hash->get( 4 ) );
+var_dump( $hash->add( 4, 9 ) );
+
+echo "\ndefault value\n";
+var_dump( $hash->add( 5 ) );
+var_dump( $hash->get( 5 ) );
+?>
+]]>
+    </programlisting>
+    &example.outputs.similar;
+    <screen>
+<![CDATA[
+without dupe checking
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+int(22)
+bool(true)
+
+with dupe checking
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+int(78)
+bool(false)
+
+default value
+bool(true)
+int(1)
+]]>
+    </screen>
+   </example>
+  </para>
+ </refsect1>
+
+
+</refentry>
+
+<!-- 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:"~/.phpdoc/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
+-->


Property changes on: phpdoc/ru/trunk/reference/quickhash/quickhashinthash/add.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
\ No newline at end of property