Hi all,
Etienne was asking about wording of the instanceof docs, and I got
inspired by their, um, greatness to improve them. Attached is a patch
for review. An earlier version I sent to Etienne had a small but
significant typo in the instanceof parentclass example, which is fixed.
Thanks,
Greg
? XML_XUL-0.8.3.tgz
? channel.xml
? instanceof.patch.txt
? phar.patch
? en/functions.xml
? en/reference/monetra/functions.xml
? en/reference/mysqli/mysqli/functions.xml
? en/reference/statistics/functions.xml
Index: en/language/operators.xml
===================================================================
RCS file: /repository/phpdoc/en/language/operators.xml,v
retrieving revision 1.109
diff -u -r1.109 operators.xml
--- en/language/operators.xml 30 Nov 2006 14:54:54 -0000 1.109
+++ en/language/operators.xml 14 Feb 2007 04:52:36 -0000
@@ -1157,41 +1157,157 @@
<sect1 id="language.operators.type">
<title>Type Operators</title>
<para>
- PHP has a single type operator: <literal>instanceof</literal> is used to
- determine whether a given object, his parents or their implemented <link
- linkend="language.oop5.interfaces">interfaces</link> are of a specified
- <link linkend="language.oop5.basic.class">object class</link>.
- </para>
- <simpara>
- The <literal>instanceof</literal> operator was introduced in PHP 5.
- Before this time <function>is_a</function> was used but
- <function>is_a</function> has since been deprecated in favor of
- <literal>instanceof</literal>.
- </simpara>
- <informalexample>
- <programlisting role="php">
+ <literal>instanceof</literal> is used to determine whether a PHP variable
+ is an instantiated object of a certain
+ <link linkend="language.oop5.basic.class">class</link>:
+ <example>
+ <title>Using instanceof with classes</title>
+ <programlisting role="php">
+ <![CDATA[
+<?php
+class MyClass
+{
+}
+class NotMyClass
+{
+}
+$a = new MyClass;
+
+var_dump($a instanceof MyClass);
+var_dump($a instanceof NotMyClass);
+?>
+ ]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
<![CDATA[
+bool(true)
+bool(false)
+]]>
+ </screen>
+ </example>
+ <literal>instanceof</literal> can also be used to determine whether a
variable
+ is an instantiated object of a class that inherits from a parent class:
+ <example>
+ <title>Using instanceof with inherited classes</title>
+ <programlisting role="php">
+ <![CDATA[
<?php
-class A { }
-class B { }
+class ParentClass
+{
+}
+class MyClass extends ParentClass
+{
+}
+$a = new MyClass;
-$thing = new A;
+var_dump($a instanceof MyClass);
+var_dump($a instanceof ParentClass);
+?>
+ ]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+bool(true)
+bool(true)
+]]>
+ </screen>
+ </example>
+ Lastly, <literal>instanceof</literal> can also be used to determine whether
+ a variable is an instantiated object of a class that implements an
+ <link linkend="language.oop5.interfaces">interface</link>:
+ <example>
+ <title>Using instanceof for class</title>
+ <programlisting role="php">
+ <![CDATA[
+<?php
+interface MyInterface
+{
+}
+class MyClass implements MyInterface
+{
+}
+$a = new MyClass;
-if ($thing instanceof A) {
- echo 'A';
+var_dump($a instanceof MyClass);
+var_dump($a instanceof MyInterface);
+?>
+ ]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+bool(true)
+bool(true)
+]]>
+ </screen>
+ </example>
+ </para>
+ <para>
+ Although <literal>instanceof</literal> is usually used with a literal
classname,
+ it can also be used with another object or a string variable:
+ <example>
+ <title>Using instanceof with other variables</title>
+ <programlisting role="php">
+ <![CDATA[
+<?php
+interface MyInterface
+{
}
-if ($thing instanceof B) {
- echo 'B';
+class MyClass implements MyInterface
+{
}
+$a = new MyClass;
+$b = new MyClass;
+$c = 'MyClass';
+$d = 'NotMyClass';
+var_dump($a instanceof $b); // $b is an object of class MyClass
+var_dump($a instanceof $c); // $c is a string 'MyClass'
+var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>
+ ]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+bool(true)
+bool(true)
+bool(false)
]]>
+ </screen>
+ </example>
+ </para>
+ <para>
+ There are a few pitfalls to be aware of. Before PHP version 5.1.0,
+ <literal>instanceof</literal> would call <link
linkend="language.oop5.autoload">__autoload()</link>
+ if the class name did not exist. In addition, if the class was not loaded,
+ a fatal error would occur. This can be worked around by using a
<literal>dynamic
+ class reference</literal>, or a string variable containing the class name:
+ <example>
+ <title>Avoiding classname lookups and fatal errors with instanceof in PHP
5.0</title>
+ <programlisting role="php">
+ <![CDATA[
+<?php
+$d = 'NotMyClass';
+var_dump($a instanceof $d); // no fatal error here
+?>
+ ]]>
</programlisting>
- <simpara>
- As <varname>$thing</varname> is an <type>object</type> of type A, but
- not B, only the block dependent on the A type will be executed:
- </simpara>
- <screen>A</screen>
- </informalexample>
+ &example.outputs;
+ <screen>
+<![CDATA[
+bool(false)
+]]>
+ </screen>
+ </example>
+ </para>
+ <simpara>
+ The <literal>instanceof</literal> operator was introduced in PHP 5.
+ Before this time <function>is_a</function> was used but
+ <function>is_a</function> has since been deprecated in favor of
+ <literal>instanceof</literal>.
+ </simpara>
<para>
See also <function>get_class</function> and
<function>is_a</function>.