1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-29 02:03:25 +02:00
Files
archived-doc-ru/language/predefined/closure/bindto.xml
T
2024-04-17 02:34:18 +03:00

173 lines
6.8 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 2a4874ed531bcc223ca4bc1b4f9a5292594abaea Maintainer: irker Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="closure.bindto" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>Closure::bindTo</refname>
<refpurpose>
Дублирует замыкание с новым связанным объектом и областью видимости класса
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="Closure">
<modifier>public</modifier> <type class="union"><type>Closure</type><type>null</type></type><methodname>Closure::bindTo</methodname>
<methodparam><type class="union"><type>object</type><type>null</type></type><parameter>newThis</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>object</type><type>string</type><type>null</type></type><parameter>newScope</parameter><initializer>"static"</initializer></methodparam>
</methodsynopsis>
<para>
Метод создаёт и возвращает новую <link linkend="functions.anonymous">анонимную
функцию</link> с телом и связанными переменными как у анонимной функции, которую
связывает метод, но с другим связанным объектом и новой областью видимости класса.
</para>
<para>
«Связанный объект» определяет значение <literal>$this</literal>,
которое будет доступно в теле функции, а «область видимости класса»
представляет класс, который определяет, к каким защищённым
и закрытым членам будет доступ у анонимной функции.
Если точнее, то это те члены, которые будут видны так же, как если бы
анонимная функция была методом класса, который передали как значение
параметра <parameter>newScope</parameter>.
</para>
<para>
Статические замыкания нельзя связывать с объектом — значение параметра
<parameter>newThis</parameter> должно равняться &null;, но эта функция
всё равно умеет изменять область видимости класса статического замыкания.
</para>
<para>
Метод гарантирует, что для нестатического замыкания, которое связали
с объектом, метод задаст область видимости и наоборот.
Для этого а) нестатическим замыканиям, для которых установили область видимости,
но передали &null; вместо объекта, метод создаст статическое замыкание;
б) нестатическим замыканиям, для которых не установили область видимости,
но передали объект, — метод создаст замыкание, которому ограничит область
видимости неопределённым классом.
</para>
<note>
<para>
Вместо этого метода пользуются <link linkend="language.oop5.cloning">клонированием</link>,
когда требуется только дублировать анонимную функцию.
</para>
</note>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>newThis</parameter></term>
<listitem>
<para>
Объект, с которым метод свяжет анонимную функцию,
или &null;, чтобы метод не связывал замыкание.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>newScope</parameter></term>
<listitem>
<para>
Область видимости класса, с которой метод свяжет замыкание, или ключевое слово static
для сохранения текущей области видимости. Если передали объект, то областью видимости
класса будет тип этого объекта. Этот параметр определяет видимость защищённых и закрытых
методов связанного объекта.
Нельзя передавать в параметр название или экземпляр объекта внутреннего PHP-класса.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Метод возвращает новый объект замыкания <classname>Closure</classname>
или &null;, если возникла ошибка.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Пример использования метода <function>Closure::bindTo</function></title>
<programlisting role="php">
<![CDATA[
<?php
class A
{
private $val;
public function __construct($val)
{
$this->val = $val;
}
public function getClosure()
{
// Метод возвращает замыкание, которое он связал с текущими объектом и областью видимости
return function() {
return $this->val;
};
}
}
$ob1 = new A(1);
$ob2 = new A(2);
$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
1
2
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><link linkend="functions.anonymous">Анонимные функции</link></member>
<member><methodname>Closure::bind</methodname></member>
</simplelist>
</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
-->