<?xml version="1.0" encoding="utf-8"?> <!-- $Revision$ --> <sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook"> <title>Object Interfaces</title> <para> Object interfaces allow you to create code which specifies which methods a class must implement, without having to define how these methods are handled. </para> <para> Interfaces are defined using the <literal>interface</literal> keyword, in the same way as a standard class, but without any of the methods having their contents defined. </para> <para> All methods declared in an interface must be public, this is the nature of an interface. </para> <sect2 xml:id="language.oop5.interfaces.implements"> <title><literal>implements</literal></title> <para> To implement an interface, the <literal>implements</literal> operator is used. All methods in the interface must be implemented within a class; failure to do so will result in a fatal error. Classes may implement more than one interface if desired by separating each interface with a comma. </para> <note> <para> A class cannot implement two interfaces that share function names, since it would cause ambiguity. </para> </note> <note> <para> Interfaces can be extended like classes using the <link linkend="language.oop5.inheritance">extends</link> operator. </para> </note> <note> <para> The class implementing the interface must use the exact same method signatures as are defined in the interface. Not doing so will result in a fatal error. </para> </note> </sect2> <sect2 xml:id="language.oop5.interfaces.constants"> <title><literal>Constants</literal></title> <para> It's possible for interfaces to have constants. Interface constants works exactly like <link linkend="language.oop5.constants">class constants</link> except they cannot be overridden by a class/interface that inherits them. </para> </sect2> <sect2 xml:id="language.oop5.interfaces.examples"> &reftitle.examples; <example xml:id="language.oop5.interfaces.examples.ex1"> <title>Interface example</title> <programlisting role="php"> <![CDATA[ <?php // Declare the interface 'iTemplate' interface iTemplate { public function setVariable($name, $var); public function getHtml($template); } // Implement the interface // This will work class Template implements iTemplate { private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; } public function getHtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template); } return $template; } } // This will not work // Fatal error: Class BadTemplate contains 1 abstract methods // and must therefore be declared abstract (iTemplate::getHtml) class BadTemplate implements iTemplate { private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; } } ?> ]]> </programlisting> </example> <example xml:id="language.oop5.interfaces.examples.ex2"> <title>Extendable Interfaces</title> <programlisting role="php"> <![CDATA[ <?php interface a { public function foo(); } interface b extends a { public function baz(Baz $baz); } // This will work class c implements b { public function foo() { } public function baz(Baz $baz) { } } // This will not work and result in a fatal error class d implements b { public function foo() { } public function baz(Foo $foo) { } } ?> ]]> </programlisting> </example> <example xml:id="language.oop5.interfaces.examples.ex3"> <title>Multiple interface inheritance</title> <programlisting role="php"> <![CDATA[ <?php interface a { public function foo(); } interface b { public function bar(); } interface c extends a, b { public function baz(); } class d implements c { public function foo() { } public function bar() { } public function baz() { } } ?> ]]> </programlisting> </example> <example xml:id="language.oop5.interfaces.examples.ex4"> <title>Interfaces with constants</title> <programlisting role="php"> <![CDATA[ <?php interface a { const b = 'Interface constant'; } // Prints: Interface constant echo a::b; // This will however not work because it's not allowed to // override constants. class b implements a { const b = 'Class constant'; } ?> ]]> </programlisting> </example> <para> An interface, together with type-hinting, provides a good way to make sure that a particular object contains particular methods. See <link linkend="language.operators.type">instanceof</link> operator and <link linkend="language.oop5.typehinting">type hinting</link>. </para> </sect2> </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 -->