File: bindto.xml

package info (click to toggle)
php-doc 20241205~git.dfcbb86%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 70,956 kB
  • sloc: xml: 968,269; php: 23,883; javascript: 671; sh: 177; makefile: 37
file content (169 lines) | stat: -rw-r--r-- 4,815 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<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>
   Duplicates the closure with a new bound object and class scope
  </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>
   Create and return a new <link linkend="functions.anonymous">anonymous
   function</link> with the same body and bound variables as this one, but
   possibly with a different bound object and a new class scope.
  </para>

  <para>
   The “bound object” determines the value <literal>$this</literal> will
   have in the function body and the “class scope” represents a class
   which determines which private and protected members the anonymous
   function will be able to access. Namely, the members that will be
   visible are the same as if the anonymous function were a method of
   the class given as value of the <parameter>newScope</parameter>
   parameter.
  </para>

  <para>
   Static closures cannot have any bound object (the value of the parameter
   <parameter>newThis</parameter> should be &null;), but this method can
   nevertheless be used to change their class scope.
  </para>

  <para>
   This method will ensure that for a non-static closure, having a bound
   instance will imply being scoped and vice-versa. To this end,
   non-static closures that are given a scope but a &null; instance are made
   static and non-static non-scoped closures that are given a non-null
   instance are scoped to an unspecified class.
  </para>

  <note>
   <para>
    If you only want to duplicate the anonymous functions, you can use
    <link linkend="language.oop5.cloning">cloning</link> instead.
   </para>
  </note>

 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <variablelist>
   <varlistentry>
    <term><parameter>newThis</parameter></term>
    <listitem>
     <para>
      The object to which the given anonymous function should be bound, or
      &null; for the closure to be unbound. 
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term><parameter>newScope</parameter></term>
    <listitem>
     <para>
      The class scope to which the closure is to be associated, or
      'static' to keep the current one. If an object is given, the type of the
      object will be used instead. This determines the visibility of protected
      and private methods of the bound object.
      It is not allowed to pass (an object of) an internal class as this parameter.
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns the newly created <classname>Closure</classname> object
   or &null; on failure.
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <example>
   <title><function>Closure::bindTo</function> example</title>
   <programlisting role="php">
<![CDATA[
<?php

class A
{
    private $val;

    public function __construct($val)
    {
        $this->val = $val;
    }

    public function getClosure()
    {
        // Returns closure bound to this object and scope
        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">Anonymous functions</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
-->