Skip to content

Commit e0e74c0

Browse files
CrellGirgias
andauthored
Hooks reflection (#4110)
* Add reflection stubs for property hooks * Document getHook(). * Document hasHook() * Document getSettableType() * Document getHooks() * Document hasHooks() * Document isFinal() * Document isPrivateSet() and isProtectedSet() * Document setRawValue() * Document getRawValue() * Document isVirtual() * Document PropertyHookType. * Document isAbstract() --------- Co-authored-by: Gina Peter Banyard <[email protected]>
1 parent 2c6c9a4 commit e0e74c0

16 files changed

+1166
-0
lines changed

reference/reflection/book.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
&reference.reflection.reflectionattribute;
5151
&reference.reflection.reflector;
5252
&reference.reflection.reflectionexception;
53+
&reference.reflection.propertyhooktype;
5354

5455
</book>
5556

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<reference xmlns="http://docbook.org/ns/docbook" xml:id="enum.reflection.propertyhooktype" role="enum">
3+
<title>The \PropertyHookType Enum</title>
4+
<titleabbrev>\PropertyHookType</titleabbrev>
5+
6+
<partintro>
7+
<section xml:id="enum.reflection.propertyhooktype.intro">
8+
&reftitle.intro;
9+
<simpara>
10+
The <enumname>\PropertyHookType</enumname> enum lists the legal
11+
types of <link linkend="language.oop5.property-hooks">property hook</link>.
12+
</simpara>
13+
</section>
14+
15+
<section xml:id="enum.reflection.propertyhooktype.synopsis">
16+
&reftitle.enumsynopsis;
17+
18+
<enumsynopsis>
19+
<enumname>\PropertyHookType</enumname>
20+
21+
<enumitem>
22+
<enumidentifier>Get</enumidentifier>
23+
<enumitemdescription>
24+
Indicates a <literal>get</literal> hook.
25+
</enumitemdescription>
26+
</enumitem>
27+
28+
<enumitem>
29+
<enumidentifier>Set</enumidentifier>
30+
<enumitemdescription>
31+
Indicates a <literal>set</literal> hook.
32+
</enumitemdescription>
33+
</enumitem>
34+
</enumsynopsis>
35+
</section>
36+
</partintro>
37+
</reference>
38+
<!-- Keep this comment at the end of the file
39+
Local variables:
40+
mode: sgml
41+
sgml-omittag:t
42+
sgml-shorttag:t
43+
sgml-minimize-attributes:nil
44+
sgml-always-quote-attributes:t
45+
sgml-indent-step:1
46+
sgml-indent-data:t
47+
indent-tabs-mode:nil
48+
sgml-parent-document:nil
49+
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
50+
sgml-exposed-tags:nil
51+
sgml-local-catalogs:nil
52+
sgml-local-ecat-files:nil
53+
End:
54+
vim600: syn=xml fen fdm=syntax fdl=2 si
55+
vim: et tw=78 syn=sgml
56+
vi: ts=1 sw=1
57+
-->
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<refentry xml:id="reflectionproperty.gethook" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
3+
<refnamediv>
4+
<refname>ReflectionProperty::getHook</refname>
5+
<refpurpose>Returns a reflection object for a specified hook.</refpurpose>
6+
</refnamediv>
7+
8+
<refsect1 role="description">
9+
&reftitle.description;
10+
<methodsynopsis role="ReflectionProperty">
11+
<modifier>public</modifier> <type class="union"><type>ReflectionMethod</type><type>null</type></type><methodname>ReflectionProperty::getHook</methodname>
12+
<methodparam><type>PropertyHookType</type><parameter>type</parameter></methodparam>
13+
</methodsynopsis>
14+
<simpara>
15+
Gets the reflection of the property's hook, if any.
16+
</simpara>
17+
</refsect1>
18+
19+
<refsect1 role="parameters">
20+
&reftitle.parameters;
21+
<variablelist>
22+
<varlistentry>
23+
<term><parameter>PropertyHookType</parameter></term>
24+
<listitem>
25+
<simpara>
26+
The type of hook to request.
27+
</simpara>
28+
</listitem>
29+
</varlistentry>
30+
</variablelist>
31+
</refsect1>
32+
33+
<refsect1 role="returnvalues">
34+
&reftitle.returnvalues;
35+
<simpara>
36+
If the requested hook is defined, a <classname>ReflectionMethod</classname> instance will be returned.
37+
If not, the method will return &null;
38+
</simpara>
39+
</refsect1>
40+
41+
<refsect1 role="examples">
42+
&reftitle.examples;
43+
<example xml:id="reflectionproperty.gethook.example.basic">
44+
<title><methodname>ReflectionProperty::getHook</methodname> example</title>
45+
<programlisting role="php">
46+
<![CDATA[
47+
<?php
48+
class Example
49+
{
50+
public string $name { get => "Name here"; }
51+
}
52+
53+
$rClass = new \ReflectionClass(Example::class);
54+
$rProp = $rClass->getProperty('name');
55+
var_dump($rProp->getHook(PropertyHookType::Get));
56+
var_dump($rProp->getHook(PropertyHookType::Set));
57+
?>
58+
]]>
59+
</programlisting>
60+
</example>
61+
</refsect1>
62+
63+
<refsect1 role="seealso">
64+
&reftitle.seealso;
65+
<simplelist>
66+
<member><classname>ReflectionMethod</classname></member>
67+
<member><classname>PropertyHookType</classname></member>
68+
</simplelist>
69+
</refsect1>
70+
71+
</refentry>
72+
<!-- Keep this comment at the end of the file
73+
Local variables:
74+
mode: sgml
75+
sgml-omittag:t
76+
sgml-shorttag:t
77+
sgml-minimize-attributes:nil
78+
sgml-always-quote-attributes:t
79+
sgml-indent-step:1
80+
sgml-indent-data:t
81+
indent-tabs-mode:nil
82+
sgml-parent-document:nil
83+
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
84+
sgml-exposed-tags:nil
85+
sgml-local-catalogs:nil
86+
sgml-local-ecat-files:nil
87+
End:
88+
vim600: syn=xml fen fdm=syntax fdl=2 si
89+
vim: et tw=78 syn=sgml
90+
vi: ts=1 sw=1
91+
-->
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<refentry xml:id="reflectionproperty.gethooks" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
3+
<refnamediv>
4+
<refname>ReflectionProperty::getHooks</refname>
5+
<refpurpose>Returns an array of all hooks on this property</refpurpose>
6+
</refnamediv>
7+
8+
<refsect1 role="description">
9+
&reftitle.description;
10+
<methodsynopsis role="ReflectionProperty">
11+
<modifier>public</modifier> <type>array</type><methodname>ReflectionProperty::getHooks</methodname>
12+
<void/>
13+
</methodsynopsis>
14+
<simpara>
15+
Returns a list of all hooks on this property.
16+
</simpara>
17+
</refsect1>
18+
19+
<refsect1 role="parameters">
20+
&reftitle.parameters;
21+
&no.function.parameters;
22+
</refsect1>
23+
24+
<refsect1 role="returnvalues">
25+
&reftitle.returnvalues;
26+
<simpara>
27+
An array of <classname>ReflectionMethod</classname> objects keyed by the hook they are for.
28+
For example, a property with both <literal>get</literal> and <literal>set</literal> hooks will return
29+
a 2 element array with string keys <literal>get</literal> and <literal>set</literal>,
30+
each of which are a <classname>ReflectionMethod</classname> object.
31+
The order in which they are returned is explicitly undefined.
32+
If no hooks are defined, an empty array is returned.
33+
</simpara>
34+
</refsect1>
35+
36+
<refsect1 role="examples">
37+
&reftitle.examples;
38+
<example xml:id="reflectionproperty.gethooks.example.basic">
39+
<title><methodname>ReflectionProperty::getHooks</methodname> example</title>
40+
<programlisting role="php">
41+
<![CDATA[
42+
<?php
43+
class Example
44+
{
45+
public string $name { get => "Name here"; }
46+
47+
public int $count;
48+
}
49+
50+
$rClass = new \ReflectionClass(Example::class);
51+
52+
$rProp = $rClass->getProperty('name');
53+
var_dump($rProp->getHooks());
54+
55+
$rProp = $rClass->getProperty('count');
56+
var_dump($rProp->getHooks());
57+
?>
58+
]]>
59+
</programlisting>
60+
</example>
61+
</refsect1>
62+
63+
<refsect1 role="seealso">
64+
&reftitle.seealso;
65+
<simplelist>
66+
<member><classname>ReflectionMethod</classname></member>
67+
<member><methodname>ReflectionProperty::hasHooks</methodname></member>
68+
</simplelist>
69+
</refsect1>
70+
71+
</refentry>
72+
<!-- Keep this comment at the end of the file
73+
Local variables:
74+
mode: sgml
75+
sgml-omittag:t
76+
sgml-shorttag:t
77+
sgml-minimize-attributes:nil
78+
sgml-always-quote-attributes:t
79+
sgml-indent-step:1
80+
sgml-indent-data:t
81+
indent-tabs-mode:nil
82+
sgml-parent-document:nil
83+
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
84+
sgml-exposed-tags:nil
85+
sgml-local-catalogs:nil
86+
sgml-local-ecat-files:nil
87+
End:
88+
vim600: syn=xml fen fdm=syntax fdl=2 si
89+
vim: et tw=78 syn=sgml
90+
vi: ts=1 sw=1
91+
-->
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<refentry xml:id="reflectionproperty.getrawvalue" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
3+
<refnamediv>
4+
<refname>ReflectionProperty::getRawValue</refname>
5+
<refpurpose>Returns the value of a property, bypassing a get hook if defined</refpurpose>
6+
</refnamediv>
7+
8+
<refsect1 role="description">
9+
&reftitle.description;
10+
<methodsynopsis role="ReflectionProperty">
11+
<modifier>public</modifier> <type>mixed</type><methodname>ReflectionProperty::getRawValue</methodname>
12+
<methodparam><type>object</type><parameter>object</parameter></methodparam>
13+
</methodsynopsis>
14+
&warn.undocumented.func;
15+
<simpara>
16+
Returns the value of a property, bypassing a <literal>get</literal> hook if defined.
17+
</simpara>
18+
</refsect1>
19+
20+
<refsect1 role="parameters">
21+
&reftitle.parameters;
22+
<variablelist>
23+
<varlistentry>
24+
<term><parameter>object</parameter></term>
25+
<listitem>
26+
<simpara>
27+
The object from which to retrieve a value.
28+
</simpara>
29+
</listitem>
30+
</varlistentry>
31+
</variablelist>
32+
</refsect1>
33+
34+
<refsect1 role="returnvalues">
35+
&reftitle.returnvalues;
36+
<simpara>
37+
The stored value of the property, bypassing a <literal>get</literal> hook if defined.
38+
</simpara>
39+
</refsect1>
40+
41+
<refsect1 role="errors">
42+
&reftitle.errors;
43+
<simpara>
44+
If the property is virtual, an <classname>Error</classname> will be thrown,
45+
as there is no raw value to retrieve.
46+
</simpara>
47+
</refsect1>
48+
49+
<refsect1 role="examples">
50+
&reftitle.examples;
51+
<example xml:id="reflectionproperty.getrawvalue.example.basic">
52+
<title><methodname>ReflectionProperty::getRawValue</methodname> example</title>
53+
<programlisting role="php">
54+
<![CDATA[
55+
<?php
56+
class Example
57+
{
58+
public string $tag {
59+
get => strtolower($this->tag);
60+
}
61+
}
62+
63+
$example = new Example();
64+
$example->tag = 'PHP';
65+
66+
$rClass = new \ReflectionClass(Example::class);
67+
$rProp = $rClass->getProperty('tag');
68+
69+
// These would go through the get hook, so would produce "php".
70+
print $example->tag;
71+
print $rProp->getValue($example);
72+
73+
// But this would bypass the hook and produce "PHP".
74+
print $rProp->setRawValue($example);
75+
?>
76+
]]>
77+
</programlisting>
78+
</example>
79+
</refsect1>
80+
81+
<refsect1 role="seealso">
82+
&reftitle.seealso;
83+
<simplelist>
84+
<member><link linkend="language.oop5.visibility-members-aviz">Asymmetric property visibility</link></member>
85+
</simplelist>
86+
</refsect1>
87+
88+
</refentry>
89+
<!-- Keep this comment at the end of the file
90+
Local variables:
91+
mode: sgml
92+
sgml-omittag:t
93+
sgml-shorttag:t
94+
sgml-minimize-attributes:nil
95+
sgml-always-quote-attributes:t
96+
sgml-indent-step:1
97+
sgml-indent-data:t
98+
indent-tabs-mode:nil
99+
sgml-parent-document:nil
100+
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
101+
sgml-exposed-tags:nil
102+
sgml-local-catalogs:nil
103+
sgml-local-ecat-files:nil
104+
End:
105+
vim600: syn=xml fen fdm=syntax fdl=2 si
106+
vim: et tw=78 syn=sgml
107+
vi: ts=1 sw=1
108+
-->

0 commit comments

Comments
 (0)