<?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>ebene7 &#187; Magic Methods</title>
	<atom:link href="http://blog.ebene7.com/schlagwort/magic-methods/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Enums in PHP (sicher ist sicher)</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/</link>
		<comments>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 05:00:52 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[CustomLibrary]]></category>
		<category><![CDATA[Enum]]></category>
		<category><![CDATA[Magic Methods]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586</guid>
		<description><![CDATA[Wer hin und wieder auch mal in anderen Sprachen wie z.B. Java programmiert, dem werden Enums sicher nicht fremd sein. Wäre es nicht schön, ähnliches auch unter PHP zur Verfügung zu haben, um nicht jeden Status als String oder Int &#8230; <a href="https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wer hin und wieder auch mal in anderen Sprachen wie z.B. Java programmiert, dem werden Enums sicher nicht fremd sein. Wäre es nicht schön, ähnliches auch unter PHP zur Verfügung zu haben, um nicht jeden Status als String oder Int zu übergeben? Tja, das Leben ist aber kein Ponyhof und wenn PHP das nicht anbietet, dann schaffen wir uns eben eine eigene Lösung um besser und (typ-)sicherer zu programmieren.<span id="more-1586"></span></p>
<p>Wir kennen es sicher alle: Wir haben irgendein Objekt und wollen dessen Status oder einen bestimmten Wert setzen oder abfragen. Was passiert sicher in 95% aller Fälle? Es wird ein String- oder Integer-Wert gesetzt oder verglichen. Aus meiner Sicht nicht besonders elegant und erst recht nicht sicher, da der Wert unnötig oft überprüft werden muss.</p>
<p>Mit Enums haben wir den Vorteil, dass wir bestimmte Werte vorgeben können und auch nur diese zu Verfügung stehen. Da wir unter PHP nur &#8220;normale&#8221; Klassen verwenden können, haben wir dadurch immer automatisch einen bestimmten Typen.</p>
<p>Wir wollen nun den Status eines Benutzers in unserem System definieren und legen uns dazu folgende Klasse mit den erforderlichen Werten an.</p>
<pre>&lt;?php
class UserStatus extends Custom_Enum
{
  const ACTIVE    = 1;
  const NOTACTIVE = 2;
  const DELETED   = 3;
}</pre>
<p>Damit können wir unseren Benutzern einen eindeutigen Status setzen.</p>
<pre>&lt;?php
class User
{
  public function setStatus(UserStatus $status)
  {
    // ..
  }
}

$user = new User();

$status = new UserStatus();
$user-&gt;setStatus($status-&gt;active());</pre>
<p>Durch das Type-Hinting können wir schon bei der Parameterübergabe den richtigen Objekttypen sicherstellen und müssen darauf später nicht mehr extra prüfen.</p>
<p>Die Klasse Custom_Enum funktioniert mit Reflektion und etwas PHP-Magie und ist bislang erst nur ein grober Entwurf. Ein paar Überprüfungen und eine bessere Fehlerbehandlung wären dann noch notwendige Maßnahmen.</p>
<pre>&lt;?php
abstract class Custom_Enum
{
  private $_constants;  // array
  private $_index;  // string

  public function  __construct()
  {
    $rc = new ReflectionClass($this);
    $this-&gt;_constants = $rc-&gt;getConstants();
  }

  public function __call($method, $args)
  {
    if (preg_match('/^is([a-zA-Z]*?)$/', $method, $matches)) {
      return $this-&gt;is($matches[1]);
    }
    $this-&gt;set($method);
    return $this;
  }

  public function __toString()
  {
    return (string)$this-&gt;getValue();
  }

  public function set($index)
  {
    $this-&gt;_index = strtoupper($index);
    return $this;
  }

  public function is($index)
  {
    return strtoupper($index) == $this-&gt;_index;
  }

  public function getValue()
  {
    return $this-&gt;_constants[$this-&gt;_index];
  }
}</pre>
<p>Ich finde das schon wesentlich besser als lose String- oder Integerwerte auszutauschen, aber vielleicht geht es ja noch besser und sicherer? Eure Ideen, Kritik, Fragen oder was auch immer sind dann in den Kommentaren gut aufgehoben. Also keine Scheu und diskutiert mit! <img src='https://blog.ebene7.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Methoden-Templates mit __call() erstellen</title>
		<link>https://blog.ebene7.com/2010/09/27/methoden-templates-mit-call-erstellen/</link>
		<comments>https://blog.ebene7.com/2010/09/27/methoden-templates-mit-call-erstellen/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 05:00:32 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Custom_Model]]></category>
		<category><![CDATA[Magic Methods]]></category>
		<category><![CDATA[Model]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1468</guid>
		<description><![CDATA[Die magischen Funktionen bei PHP sind wie sicher vieles in der Programmierung eine Geschmacks- oder sogar fast schon eine Glaubensfrage. Die einen lieben sie, die anderen hassen sie. Je nach Verwendung können sie schonmal einen Entwickler in den Wahnsinn treiben, &#8230; <a href="https://blog.ebene7.com/2010/09/27/methoden-templates-mit-call-erstellen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die magischen Funktionen bei PHP sind wie sicher vieles in der Programmierung eine Geschmacks- oder sogar fast schon eine Glaubensfrage. Die einen lieben sie, die anderen hassen sie. Je nach Verwendung können sie schonmal einen Entwickler in den Wahnsinn treiben, wenn irgendwelche Werte, irgendwie aus dem Nichts kommen und auch wieder dahin verschwinden.</p>
<p>Es gibt aber auch Fälle, in denen die magische Methode __call() den Code lesbarer machen kann und gleichzeitig eine Menge Schreibarbeit einspart.</p>
<p><span id="more-1468"></span>Stellen wir uns einfach mal vor, wir hätten ein Model mit 20 Werten und wollen es anhand eines bestimmten Feldes laden.</p>
<pre>&lt;?php
$model-&gt;load($id);  // lädt das Model mit Defaultkey = $id, oder

$model-&gt;load('Daniel', 'name');  // Feld 'name' = 'Daniel'</pre>
<p>Letzteres ist durchaus gut zu lesen und lädt bestenfalls auch die richtigen Daten. Mit __call() lässt sich das ganze ohne viel Aufwand noch etwas dekorieren, so dass wir das Model dann so laden können:</p>
<pre>&lt;?php
$model-&gt;loadByName('Daniel');</pre>
<p>Nun könnte man entweder für alle 20 Felder die jeweiligen Methoden schreiben, oder eine Art Template mit __call() und eines RegEx erstellen und den Aufruf einfach deligieren.</p>
<pre>&lt;?php
class Custom_Model
{
  public function __call($method, $args)
  {
    if (preg_match('/^loadBy([a-zA-Z]*?)$/', $method, $matches))
      return $this-&gt;load($args[0], $matches[1]);
    }
    // ...
  }
}</pre>
<p>Der Vorteil ist ganz klar die eingesparte Tipparbeit und eine übersichtlichere Klasse, da wir alleine für diese Funktionalität 20 Methoden weniger im Code haben. Jedoch ist auch der Nachteil nicht außer Acht zu lassen. Weil die Methoden nur virtuell existieren, sind sie z.B. für die IDE unsichtbar und sind daher auch für neue Entwickler nicht sofort erkennbar.</p>
<p>Es bleibt also wieder dem eigenen Geschmack überlassen, für welchen Weg man sich entscheidet.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/09/27/methoden-templates-mit-call-erstellen/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Implementieren einer einfachen Plugin-Schnittstelle</title>
		<link>https://blog.ebene7.com/2010/05/12/implementieren-einer-einfachen-plugin-schnittstelle/</link>
		<comments>https://blog.ebene7.com/2010/05/12/implementieren-einer-einfachen-plugin-schnittstelle/#comments</comments>
		<pubDate>Wed, 12 May 2010 05:00:26 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Custom_Model]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[Magic Methods]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[SPL]]></category>
		<category><![CDATA[Strategy Pattern]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=766</guid>
		<description><![CDATA[Heute geht es darum, wie wir uns eine einfache Plugin-Schnittstelle für unsere Objekte bauen können. Als Beispiel, wie sollte es auch anders sein, eignet sich unsere Custom_Model-Klasse aus meinen vergangenen Artikeln. Und schon wieder die Frage, was kann unsere Klasse &#8230; <a href="https://blog.ebene7.com/2010/05/12/implementieren-einer-einfachen-plugin-schnittstelle/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute geht es darum, wie wir uns eine einfache Plugin-Schnittstelle für unsere Objekte bauen können. Als Beispiel, wie sollte es auch anders sein, eignet sich unsere Custom_Model-Klasse aus meinen <a href="http://blog.ebene7.com/2010/04/29/es-ist-ein-model-und-es-sieht-gut-aus/" target="_self">vergangenen Artikeln</a>.</p>
<p><span id="more-766"></span>Und schon wieder die Frage, was kann unsere Klasse dann mehr? Oder warum machen wir das?</p>
<p>Oftmals haben wir Objekte, die eine gewisse Menge identischer Methoden benötigen, jedoch nicht aus einer Vererbungslinie stammen.</p>
<p>Durch die Plugins können wir dann quasi Funktionen an unsere Objekte dran kleben und nutzen. Diesen Code müssen wir nur einmal schreiben, haben auch nur eine Stelle im Code zu pflegen und können dadurch sicherstellen, dass alles gleich funktioniert.</p>
<p>So erweitern wir nun also zuerst wie gewohnt unser <code>Custom_Model</code> um ein paar neue Methoden und Eigenschaften.</p>
<pre>&lt;?php
class Custom_Model implements Custom_Model_Interface
{
  // ...
  protected $_plugins;

  public function registerPlugin() {}
  public function unregisterPlugin() {}
  // ...
}</pre>
<p>Und das Interface für die Plugins.</p>
<pre>&lt;?php
interface Custom_Model_Plugin_Interface {}</pre>
<p>Beim Speichern der Plugins kommt wieder die Klasse <a href="http://de3.php.net/manual/de/class.splobjectstorage.php" target="_blank">SplObjectStorage</a> zum Einsatz, welche wir ja schon bei der <a href="http://blog.ebene7.com/2010/05/07/es-ist-ein-model-und-es-sieht-gut-aus-der-observer/" target="_self">Implementierung des Obeservers</a> verwendet haben. Demnach ist es auch nicht überraschend, dass die Registrierung an die Abmeldung der Plugins sehr einfach wird.</p>
<pre>public function registerPlugin(Custom_Model_Plugin_Interface $plugin)
{
  $this-&gt;_plugins-&gt;attach($plugin);
  return $this;
}

public function unregisterPlugin(Custom_Model_Plugin_Interface $plugin)
{
  $this-&gt;_plugins-&gt;detach($plugin);
  return $this;
}</pre>
<p>Die Models müssen das Interface <code>Custom_Model_Plugin_Interface</code> implementieren. Dieses Interface ist lediglich ein Flag- oder Marker-Interface, d.h. es schreibt keine Methoden vor.</p>
<p>Jetzt noch eine kleine Änderung an der Methode <code>__call()</code> und wir können schon mit dem Beispiel experimentieren.</p>
<pre>public function __call($method, $args)
{
  // Magie für die Getter &amp; Setter

  foreach($this-&gt;_plugins as $plugin) {
    if(method_exists($plugin, $method)) {
      array_unshift($args, $this);
      return call_user_func_array(array($plugin, $method), $args);
    }
  }

  // Fehlerbehandlung
}</pre>
<p>Durch <code>__call()</code> können wir unsere Plugin-Methoden so nutzen, als gehörten sie direkt zum Objekt. Die Art wie die Plugins verwendet werden  hat Vor-, aber auch Nachteile.</p>
<p>Die Liste der Plugins wird der Reihe nach durchlaufen und die erstbeste passende Methode wird aufgerufen. Auch die Getter oder Setter könnten wir nicht mehr überschreiben. Wenn das alles jedoch gewollt ist, dann lässt sich das aber auch mit wenigen Handgriffen erweitern.</p>
<p>Nun aber mal was praktisches zum Anschauen: Angenommen wir haben eine Model-Klasse mit Abhängigkeit zu anderen Objekten.</p>
<pre>&lt;?php
class Book extends Custom_Model
{
  protected $_id;
  protected $_title;
  protected $_ownerId;
}</pre>
<p>Nun wollen wir nicht nur die ID des Besitzers erfahren, sondern auch das Objekt das bekommen können. Dafür spendieren wir ein Plugin.</p>
<pre>&lt;?php
class GetOwnerPlugin implements Custom_Model_Plugin_Interface
{
  public function getOwner($sender)
  {
    $id = $sender-&gt;getOwnerId();

    // lade User-Objekt $owner anhand der $id

    return $owner;
  }
}</pre>
<p>Auf die Fehlerbehandlung habe ich an der Stelle mal verzichtet, sollte jedoch unbedingt stattfinden.</p>
<pre>&lt;?php
$book = new Book();
$book-&gt;registerPlugin(new GetOwnerPlugin());
$book-&gt;setOwnerId(42);
$owner = $book-&gt;getOwner();</pre>
<p>Spätestens hier fällt sicher nicht nur mir auf, dass das Konzept noch Lücken hat. Theoretisch kann es sein, dass zu verschiedenen IDs ein User-Objekt nachgeladen werden soll (<code>getAuthor()</code>, <code>getModifier()</code>, <code>getLastVisitor()</code>&#8230;) und dann bräuchten wir sämtliche Methoden in unserem Plugin oder verschiedene Plugins.</p>
<p>Dann hätten wir aber auch wieder mehrfachen Code und nichts gewonnen. Daher werde ich die Pluginschnittstelle noch etwas aufbohren und das Ergebnis dann in einem meiner nächsten Artikel vorstellen.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/05/12/implementieren-einer-einfachen-plugin-schnittstelle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Was tun gegen magische Zugriffsmethoden?</title>
		<link>https://blog.ebene7.com/2010/04/09/was-tun-gegen-magische-zugriffsmethode/</link>
		<comments>https://blog.ebene7.com/2010/04/09/was-tun-gegen-magische-zugriffsmethode/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 20:30:22 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Magic Methods]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Shop]]></category>
		<category><![CDATA[Zugriffsmethode]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=561</guid>
		<description><![CDATA[Im Moment bin ich mit voller Begeisterung dabei, mich in die Magento Shopsoftware einzuarbeiten. Dass die Entwickler jedoch nicht nur die Software, sondern auch den Programmcode sehr flexibel gestaltet haben, macht die Sache leider nicht einfacher. Viele Methoden sind mit &#8230; <a href="https://blog.ebene7.com/2010/04/09/was-tun-gegen-magische-zugriffsmethode/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Im Moment bin ich mit voller Begeisterung dabei, mich in die Magento Shopsoftware einzuarbeiten. Dass die Entwickler jedoch nicht nur die Software, sondern auch den Programmcode sehr flexibel gestaltet haben, macht die Sache leider nicht einfacher.</p>
<p>Viele Methoden sind mit <a href="http://de2.php.net/manual/de/language.oop5.overloading.php#language.oop5.overloading.methods" target="_blank"><code>__call()</code></a> implementiert und das hat die Nachteile, dass z.B. die <a href="http://de.wikipedia.org/wiki/Autovervollst%C3%A4ndigen" target="_blank">Codecompletion</a>, <a href="http://de.wikipedia.org/wiki/Reflection_%28Programmierung%29" target="_blank">Reflection</a>, automatische Dokumentation oder die Navigation in der IDE ausgehebelt werden.</p>
<p>Zum Glück können wir das ja zum Teil in vererbten Klassen wieder abfangen, ohne die ursprünglichen Klassen umschreiben zu müssen, z.B. weil wir die fremden Libraries zwecks späterer Updates nicht verändern wollen.</p>
<pre>&lt;?php

class A
{
  public function __call($method, $args)
  {
    echo __METHOD__ . ' ' . $method;
  }
}

class B extends A
{
  public function machWas()
  {
    parent::machWas();
  }
}

$b = new B();
$b-&gt;machWas();</pre>
<p>Die Methode <code>B::machWas()</code> delegiert den Aufruf an die magische Methode, wobei sich das Verhalten nach außen nicht verändert, jedoch alles andere wieder funktionieren wird.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/04/09/was-tun-gegen-magische-zugriffsmethode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was ist schlecht an public Properties?</title>
		<link>https://blog.ebene7.com/2010/01/05/was-ist-schlecht-an-public-properties/</link>
		<comments>https://blog.ebene7.com/2010/01/05/was-ist-schlecht-an-public-properties/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 18:00:15 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[Interceptor]]></category>
		<category><![CDATA[Magic Methods]]></category>
		<category><![CDATA[Observer]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=163</guid>
		<description><![CDATA[Immer wieder kommt während der Entwicklung die Diskussion auf, ob die Sichtbarkeit der Objekteigenschaften public, protected oder private sein sollten. Aber welche Vor- und Nachteile haben denn nun die einzelnen Einstellungen? <a href="https://blog.ebene7.com/2010/01/05/was-ist-schlecht-an-public-properties/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Immer wieder kommt während der Entwicklung die Diskussion auf, ob die Sichtbarkeit der Objekteigenschaften public, protected oder private sein sollte.</p>
<p>Aber welche Vor- und Nachteile haben denn nun die einzelnen Einstellungen?</p>
<p><span id="more-163"></span><br />
&#8220;Lass es uns doch einfach halten&#8221;, &#8220;Das macht doch viel mehr Arbeit&#8221; oder &#8220;Mehr soll dieses Objekt nie können&#8221; und &#8220;Unsere Designer kennen das doch nur so&#8221; sind oft die Argumente warum die Eigenschaften public sein sollten.</p>
<p>Persönlich bin ich immer für eine saubere <a href="http://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)" target="_blank">Datenkapselung</a> und Verwendung von <a href="http://de.wikipedia.org/wiki/Zugriffsfunktion" target="_blank">Zugriffsmethoden</a>.</p>
<p>Zunächst ist es richtig, dass die Programmierung der Zugriffsmethoden mehr Arbeit macht, als einfach eine öffentliche Variable zu verwenden. Viele <a href="http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung" target="_blank">IDEs</a>, z.B. <a href="http://de.wikipedia.org/wiki/Eclipse_(IDE)" target="_blank">Eclipse</a> können diese Methoden aber auch automatisch generieren, so dass wirklich nur noch wenige Mausklicks nötig sind.</p>
<p>Viele andere Sprachen bieten die Typisierung von Variablen standardmäßig an, so dass man sich dort schon weitestgehend darauf verlassen kann welcher Typ vorliegt. PHP zum Beispiel bietet das (bislang) nicht und wir müssen uns selber darum kümmern.</p>
<p>Das schützt uns aber auch noch nicht davor, dass statt dem geforderten Objekttyp ein NULL-Wert gesetzt ist und wir mit einem Methodenaufruf einen Laufzeitfehler auslösen. Solche Anforderungen können wir dann in unseren Zugriffsmethoden umsetzen.</p>
<p>Wird einer Set-Methode ein NULL-Wert übergeben, so können wir entsprechend darauf reagieren und eine <a href="http://de.wikipedia.org/wiki/Exception" target="_blank">Exception</a> werfen.</p>
<p>Ebenso können wir auch der Get-Methode eine nützliche Logik implementieren. Ist die Eigenschaft beim Methodenaufruf noch nicht gesetzt, können wir an dieser Stelle z.B. ein (<a href="http://de.wikipedia.org/wiki/Nullobjekt_(Entwurfsmuster)" target="_blank">Null</a>-)Objekt erzeugen, einen bestimmten Wert aus der Datenbank laden oder einfach einen Standardwert zurückgeben.</p>
<p>Oftmals ergibt sich auch die Anforderung, auf Veränderungen an einem Objekt reagieren zu müssen. Dafür bietet sich das <a href="http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)" target="_blank">Observer/Beobachter-Entwurfsmuster</a> an.</p>
<p>Die Beobachter müssen über eine Veränderung benachrichtigt werden und auch das funktioniert über die Zugriffsmethoden. Würden wir zu einem späteren Zeitpunkt feststellen, dass wir das Objekt beobachten müssen und dafür eine nachträgliche Veränderung der Schnittstelle erforderlich ist, bringt das meist sehr viel Arbeit und potentielle Fehlerquellen mit sich, da alle Stellen im Programm überarbeitet werden müssen, an denen das Objekt verwendet wird.</p>
<p>Es gibt natürlich auch immer wieder Situationen, die öffentliche Eigenschaften verlangen oder in denen die Handhabung einfacher wird, z.B. weil schon 150 Templates damit arbeiten und nicht extra angepasst werden sollen.</p>
<p>Verschiedene Sprachen bieten dafür Möglichkeiten an, um direkte Zugriffe auf Objekteigenschaften an Zugriffsmethoden zu delegieren.</p>
<p>Bei PHP ab Version 5 sind das die sogenannten <a href="http://de2.php.net/manual/de/language.oop5.magic.php" target="_blank">Magischen Methoden</a> oder Interceptor-Methoden <a href="http://de2.php.net/manual/de/language.oop5.overloading.php#language.oop5.overloading.members" target="_blank">__get() und __set()</a>.</p>
<p>Alles in allem haben wir bei der Programmierung unserer Klassen etwas mehr Aufwand, aber dafür weniger Stress, wenn sich unsere Anwendung in eine Richtung weiterentwickelt, die wir heute noch nicht vorhersehen können.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/01/05/was-ist-schlecht-an-public-properties/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
