<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LocalDev &#187; Klasse</title>
	<atom:link href="http://localdev.de/tags/klasse/feed/" rel="self" type="application/rss+xml" />
	<link>http://localdev.de</link>
	<description>Web, Desktop &#38; Mobile Development</description>
	<lastBuildDate>Thu, 01 Dec 2011 18:54:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>PHP: Welche Interfaces implementiert eine Klasse</title>
		<link>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/</link>
		<comments>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 21:22:31 +0000</pubDate>
		<dc:creator>Fabian Martin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[Klasse]]></category>
		<category><![CDATA[Objekt]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://localdev.de/?p=681</guid>
		<description><![CDATA[Auf Phpmonkeys ist letzte Woche ein Artikel über Marker Interfaces erschienen, der einem kurz die Idee dahinter erläutert und wie man sie am Beispiel eines Caches nutzen kann. Ich selber nutze Marker Interfaces in verschiedenen Projekten um darüber zu bestimmen, ob ein bestimmtes Feature für ein Objekt zur Verfügung steht. Ich vereinfache damit u.a. die [...]]]></description>
			<content:encoded><![CDATA[<p>Auf <a href="http://www.phpmonkeys.de/">Phpmonkeys</a> ist letzte Woche ein Artikel über <a href="http://www.phpmonkeys.de/2010/04/06/marker-interfaces-ein-beispiel/">Marker Interfaces</a> erschienen, der einem kurz die Idee dahinter erläutert und wie man sie am Beispiel eines Caches nutzen kann. </p>
<p>Ich selber nutze Marker Interfaces in verschiedenen Projekten um darüber zu bestimmen, ob ein bestimmtes Feature für ein Objekt zur Verfügung steht. Ich vereinfache damit u.a. die Generierung des Administrations Oberfläche. Aber wie bekommt man heraus, welche Interfaces eine Klasse implementiert?</p>
<p>Wir haben die Möglichkeit über <em>instanceof</em> und <em>is_a</em> zu prüfen ob eine bestimmtes Interface implementiert wird, oder wir lassen uns von den Reflection Klassen, die seit PHP 5.0 zur Verfügung stehen, alle implementierten Interfaces zurückgeben.</p>
<p><strong>Unsere Testobjekte</strong></p>
<pre class="brush: php; title: ; notranslate">
interface AdminFeature
{

}

class Admin implements AdminFeature
{

}

$objAdmin = new Admin();
</pre>
<p><strong>Instanz der Reflection Klasse erzeugen</strong></p>
<pre class="brush: php; title: ; notranslate">
$objReflection = new ReflectionClass('Admin');

// Oder direkt vom Objekt
// $objReflection = new ReflectionClass($objAdmin);
</pre>
<p>Die Reflection Klasse enthält die Methoden <em>getInterfaceNames</em> und <em>getInterfaces</em>, die uns alle genutzten Interfaces zurückgeben. Möchten wir auf ein bestimmtes Interface prüfen, stehen uns die Methode <em>implementsInterface</em> bzw. die Prüfung mittels <em>instanceof</em> und <em>is_a</em> zur Verfügung.</p>
<p><strong>getInterfaceNames</strong><br />
getInterfaceNames gibt uns ein Array mit den Namen der Interfaces zurück.</p>
<pre class="brush: php; title: ; notranslate">
$arrResult = $objReflection-&gt;getInterfaceNames();

/*
array(1) {
  [0]=&gt;
  string(12) &quot;AdminFeature&quot;
}
*/
</pre>
<p><strong>getInterfaces</strong><br />
getInterfaces gibt uns ein Array mit allen Interfaces zurück. Die Elemente des Arrays enthalten für jedes Interface ein Objekt der Relection Klasse.</p>
<pre class="brush: php; title: ; notranslate">
$arrResult = $objReflection-&gt;getInterfaces();

/*
array(1) {
  [&quot;AdminFeature&quot;]=&gt;
  &amp;object(ReflectionClass)#3 (1) {
    [&quot;name&quot;]=&gt;
    string(12) &quot;AdminFeature&quot;
  }
}
*/
</pre>
<p><strong>implementsInterface, instanceof und is_a</strong><br />
Haben wir ein Objekt der Klasse erzeugt, können wir instanceof und is_a nutzen um herauszufinden, ob die gewünschte Klasse implementiert wird. Der Weg über die Reflection Klasse ist hier nicht nötig.</p>
<p>Möchten wir vor der Erzeugung des Objekts herausfinden, ob ein Interface implementiert wird, können wir die Methode implementsInterface unseres Reflection Objekts nutzen.</p>
<pre class="brush: php; title: ; notranslate">
$boolReturn = $objReflection-&gt;implementsInterface('AdminFeature');
// bool(true)
$boolReturn = $objAdmin instanceof AdminInterface;
// bool(true)
$boolReturn = is_a($objAdmin, 'AdminInterface');
// bool(true)
</pre>
<p>is_a ist seit PHP 5.3 übrigens nicht mehr als deprecated markiert.</p>
<p>Über Reflection kann man aber mehr als nur die Interfaces ermitteln. Wer möchte kann sich z.B. die Kommentare zurückgeben lassen und über diese z.B <a href="http://de.wikipedia.org/wiki/Annotation_(Programmierung)">Annotations</a> implementieren. Ein Blick ins <a href="http://de2.php.net/manual/de/book.reflection.php">PHP Handbuch</a> lohnt sich. </p>
]]></content:encoded>
			<wfw:commentRss>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

