1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-24 07:48:05 +02:00
Files
archived-doc-ru/language/oop5/anonymous.xml
T
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

195 lines
4.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a9edd62d087ab1eb6292c795b7256e14ff9f1234 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.anonymous" xmlns="http://docbook.org/ns/docbook">
<title>Анонимные классы</title>
<para>
Анонимные классы полезны, когда нужно создать простые, одноразовые объекты.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Использование явного класса
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// Использование анонимного класса
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
]]>
</programlisting>
</informalexample>
<para>
Они могут передавать аргументы в конструкторы, расширять другие классы,
реализовывать интерфейсы и использовать трейты как обычный класс:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(class@anonymous)#1 (1) {
["Command line code0x104c5b612":"class@anonymous":private]=>
int(10)
}
]]>
</screen>
</informalexample>
<para>
Вложение анонимного класса в другой класс не даёт ему доступ к закрытым
или защищённым методам и свойствам этого внешнего класса. Для того,
чтобы использовать защищённые свойства и методы внешнего класса, анонимный
класс может расширить внешний класс. Чтобы использовать закрытые
свойства внешнего класса в анонимном классе, их нужно передать в конструктор:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class Outer
{
private $prop = 1;
protected $prop2 = 2;
protected function func1()
{
return 3;
}
public function func2()
{
return new class($this->prop) extends Outer {
private $prop3;
public function __construct($prop)
{
$this->prop3 = $prop;
}
public function func3()
{
return $this->prop2 + $this->prop3 + $this->func1();
}
};
}
}
echo (new Outer)->func2()->func3();
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
6
]]>
</screen>
</informalexample>
<para>
Все объекты, созданные одним и тем же объявлением анонимного класса, являются
экземплярами этого самого класса.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function anonymous_class()
{
return new class {};
}
if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'Тот же класс';
} else {
echo 'Другой класс';
}]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Тот же класс
]]>
</screen>
</informalexample>
<note>
<para>
Обратите внимание, что анонимным классам присваиваются имена движком PHP,
как показано в примере ниже. Это имя следует рассматривать как особенность
реализации, на которую не следует полагаться.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo get_class(new class {});
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
class@anonymous/in/oNi1A0x7f8636ad2021
]]>
</screen>
</informalexample>
</note>
</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:"~/.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
-->