<?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; Grundlagen</title>
	<atom:link href="http://blog.ebene7.com/kategorie/entwicklung/grundlagen/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>Fluently self-contained Factory Method</title>
		<link>https://blog.ebene7.com/2010/09/29/fluently-self-contained-factory-method/</link>
		<comments>https://blog.ebene7.com/2010/09/29/fluently-self-contained-factory-method/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 05:00:02 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[Singleton Pattern]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1510</guid>
		<description><![CDATA[Nein, wir spielen nicht Buzzword-Bingo. Heute geht es darum, Objekt-Instanzen durch einfache Factory Methoden zu erzeugen und sie im Weiteren als Fluent Interface direkt zu nutzen, ohne den Stolperstein &#8220;new&#8221; und ob das in der Form überhaupt sinnvoll ist. Der &#8230; <a href="https://blog.ebene7.com/2010/09/29/fluently-self-contained-factory-method/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nein, wir spielen nicht Buzzword-Bingo. Heute geht es darum, Objekt-Instanzen durch einfache Factory Methoden zu erzeugen und sie im Weiteren als Fluent Interface direkt zu nutzen, ohne den Stolperstein &#8220;new&#8221; und ob das in der Form überhaupt sinnvoll ist.</p>
<p><span id="more-1510"></span>Der herkömmliche Weg eine Instanz einer Klasse zu erzeugen ist die Verwendung des new-Operators.</p>
<pre>&lt;?php
$meinObject = new MeineKlasse();
$meineKlasse-&gt;machWas();</pre>
<p>Leider funktioniert Methodenverkettung in PHP nicht wie in Java direkt nach &#8220;new&#8221; und wir müssen uns mit einer statischen Methode behelfen. Das Prinzip ähnelt dem Singleton-Muster, jedoch wollen wir in diesem Fall bei jedem Aufruf eine neue Instanz bekommen. Wer schonmal mit (Borland-)Delphi gearbeitet hat, der kennt das sicher schon.</p>
<pre>&lt;?php
class MeineKlasse
{
  public static function create()
  {
    return new self();
  }
}</pre>
<p>Der Vorteil ist nun ganz klar der, dass sich Instanzen in einer Zeile benutzen lassen.</p>
<pre>&lt;?php
MeineKlasse::create()-&gt;machWas();</pre>
<p>Leider fallen mir aber auch spontan zwei Nachteile ein: Bis PHP 5.3 ist die Methode nicht vererbbar, das bedeutet, dass wir die Methode mit jeder Ableitung erneut überschreiben müssten. Ab Version 5.3 kann statt &#8220;self&#8221; dann &#8220;static&#8221; instanziiert werden. Genaueres findet sich auch in den Links in meinem <a href="http://blog.ebene7.com/2010/08/30/vererbbares-singleton-pattern-dank-late-static-binding-ab-php-5-3/">Singleton-Artikel</a>.</p>
<p>Der zweite Nachteil ist genau der, warum man auch &#8220;new&#8221; nicht verwenden sollte. Beides schafft an vielen Stellen im Code Abhängigkeitet zu einer bestimmten Klasse. Wenn nun irgendwann eine abgeleitete Klasse benötigt wird müssen viele Änderungen gemacht werden.</p>
<p>Im Zweifelsfall sollte auf eine klassische, externe Factory zurückgegriffen werden, um derartigen Problemen im Voraus aus dem Weg zu gehen.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/09/29/fluently-self-contained-factory-method/feed/</wfw:commentRss>
		<slash:comments>3</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>Mittagspausencontest: Aufzählen leicht gemacht</title>
		<link>https://blog.ebene7.com/2010/09/16/mittagspausencontest-aufzaehlen-leicht-gemacht/</link>
		<comments>https://blog.ebene7.com/2010/09/16/mittagspausencontest-aufzaehlen-leicht-gemacht/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 05:00:53 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Contest]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1404</guid>
		<description><![CDATA[Heute habe ich mal wieder gemerkt, wie scheinbar selbstverständliche Aufgaben für Anfänger zu einer Herausforderung werden können. Die Aufgabe lautete, eine beliebige Anzahl von Elementen in einem String aufzuzählen und dabei das letzte statt mit einem Komma durch das Wort &#8230; <a href="https://blog.ebene7.com/2010/09/16/mittagspausencontest-aufzaehlen-leicht-gemacht/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute habe ich mal wieder gemerkt, wie scheinbar selbstverständliche Aufgaben für Anfänger zu einer Herausforderung werden können. Die Aufgabe lautete, eine beliebige Anzahl von Elementen in einem String aufzuzählen und dabei das letzte statt mit einem Komma durch das Wort &#8220;und&#8221; zu verbinden. Die Aufgabe wurde dann natürlich noch gelöst.</p>
<p>Da es ja nicht sonderlich spannend ist, ein Schnipsel Beispielcode zu Bloggen, dachte ich mir daraus einfach einen Mittagspausen-Spaß-Contest daraus zu machen. Schreibt Code, der die Aufgabe löst, die Liste nicht verändert und dabei besonders ist. Also z.B. besonders kurz, besonders verrückt oder besonders &#8220;designverpattert&#8221;. Was auch immer, ob in den Kommentaren oder in eurem Blog.</p>
<p>Zu gewinnen gibt es außer Spaß leider nichts, aber ich hoffe trotzdem auf eine rege Teilnahme.<span id="more-1404"></span></p>
<p>Ein hoffentlich anfängerfreundliches Beispiel könnte also so aussehen:</p>
<pre>&lt;?php
$elements = array('Apfel','Banane','Erdbeere','Birne');

$count = count($elements);

$str = '';
foreach ($elements as $index =&gt; $element) {
  if ($index &gt; 0) {
    if ($index &lt; ($count - 1)) {
      $str .= ', ';
    } else {
      $str .= ' und ';
    }
  }
  $str .= $element;
}

echo $str;  // Ausgabe: Apfel, Banane, Erdbeere und Birne</pre>
<p>Ein anderer Weg wäre eine Lösung mit den Array-Funktionen, wobei hier aber durch array_pop() das Array verändert würde.</p>
<pre>$lastElement = array_pop($elements);
echo implode(', ', $elements) . ' und ' . $lastElement;</pre>
<p>Nun also ran an die Tasten und abschicken.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/09/16/mittagspausencontest-aufzaehlen-leicht-gemacht/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Kürzer als Kurz: Der Ternär Operator für Geizige</title>
		<link>https://blog.ebene7.com/2010/09/10/kurzer-als-kurz-der-ternaer-operator-fur-geizige/</link>
		<comments>https://blog.ebene7.com/2010/09/10/kurzer-als-kurz-der-ternaer-operator-fur-geizige/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 17:30:39 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[If]]></category>
		<category><![CDATA[Kontrollstruktur]]></category>
		<category><![CDATA[Ternär Operator]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1376</guid>
		<description><![CDATA[Anfang diesen Jahres habe ich ja schonmal einen Artikel über Kontrollstrukturen geschrieben und bin dabei eigentlich nur nebenbei auf die Kurzschreibweise des IF-Konstruktes, den Ternär-Operator, eingegangen. Nun reiche ich einfach noch ein paar Beispiele nach und zeige, dass es noch &#8230; <a href="https://blog.ebene7.com/2010/09/10/kurzer-als-kurz-der-ternaer-operator-fur-geizige/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Anfang diesen Jahres habe ich ja schonmal einen Artikel über <a href="http://blog.ebene7.com/2010/01/25/besserer-code-durch-ordentliche-kontrollstrukturen/" target="_self">Kontrollstrukturen</a> geschrieben und bin dabei eigentlich nur nebenbei auf die Kurzschreibweise des IF-Konstruktes, den Ternär-Operator, eingegangen. Nun reiche ich einfach noch ein paar Beispiele nach und zeige, dass es noch kürzer als kurz geht.<span id="more-1376"></span></p>
<p>Die gewohnte, und sicher aus jedem Informatikuntericht bekannte Form des If/If-Else kann ja bekanntlich beliebig viele Bedingungen abdecken und ist für Kontrollstrukturen auch sehr gut geeignet.</p>
<pre>&lt;?php
if ($bedingung1) {
  // mach was
} else if ($bedingung2) {
  // mach was anderes
} else {
  // mach was ganz anderes
}</pre>
<p>Die geschweiften Klammern sind zwar bei nur einer folgenden Anweisung optional, aber sollten dennoch immer geschrieben werden, denn spätestens mit der nächsten Änderung und einer weiteren Anweisung werden sie gebraucht.</p>
<p>Für einfache Überprüfungen z.B. ob eine Variable gesetzt ist oder nicht, ist dieses Konstrukt dann aber doch etwas unhandlich.</p>
<pre>&lt;?php
if ('ja' == $wert) {
  $variable = 1;
} else {
  $variable = 0;
}</pre>
<p>Nun gut, der Code ist nicht besonders sinnvoll, aber es geht ja auch nur um ein Beipiel. In der Kurzschreibweise sieht die selbe Logik dann so aus:</p>
<pre>&lt;?php
$variable = 'ja' == $wert ? 1 : 0;</pre>
<p>Es müssen aber auch nicht immer Zuweisungen von Variablen sein, auch einfache Verzweigungen sind damit möglich. Ob man das im Code haben mag oder nicht sollte dann jeder für sich entscheiden.</p>
<pre>&lt;php
function peng() { echo __FUNCTION__; }
function puff() { echo __FUNCTION__; }

$flag = true;
$flag ? peng() : puff();

// Ausgabe: peng</pre>
<p>Noch kürzer geht es, wenn wir auf Objektinstanzen prüfen wollen und gegebenenfalls eine Instanz erzeugen müssen.</p>
<pre>&lt;?php
class Obst {
  private $_name;
  public function __construct($name) { $this-&gt;_name = $name; }
  public function __toString() { return $this-&gt;_name; }
}

$test = new Obst('Apfel');

echo $test ?: new Obst('Birne');

// Ausgabe: Apfel</pre>
<p>In diesem Fall wird nur dann eine neu Instanz von Obst erzeugt, wenn $test null ist. Dementsprechend wäre dann die Ausgabe Birne.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/09/10/kurzer-als-kurz-der-ternaer-operator-fur-geizige/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>CSV-Datei sortieren ganz einfach</title>
		<link>https://blog.ebene7.com/2010/07/28/csv-datei-sortieren-ganz-einfach/</link>
		<comments>https://blog.ebene7.com/2010/07/28/csv-datei-sortieren-ganz-einfach/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 18:15:32 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Array]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[Sortierung]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1160</guid>
		<description><![CDATA[Heute hatte ich im Büro ein lustiges Gespräch darüber, wie einfach es ist eine CSV-Datei alphabetisch zu sortieren und dass das passende Script als inline (also alles in einer Zeile) in unter zehn Minuten geschrieben ist. Zeitlich war das wie &#8230; <a href="https://blog.ebene7.com/2010/07/28/csv-datei-sortieren-ganz-einfach/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute hatte ich im Büro ein lustiges Gespräch darüber, wie einfach es ist eine CSV-Datei alphabetisch zu sortieren und dass das passende Script als inline (also alles in einer Zeile) in unter zehn Minuten geschrieben ist.<span id="more-1160"></span></p>
<p>Zeitlich war das wie erwartet locker drin, nur leider klappte das mit dem Inline aufgrund der Funktion sort() nicht, da diese das zu sortierende Array als Referenz verarbeitet.</p>
<p>Kleine Spielerei aber vielleicht braucht ja mal jemand den Schipsel.</p>
<pre><code>&lt;?php
$file = 'pfad/zur/datei.csv';
$lines = file($file);
sort($lines);
file_put_contents($file, implode('', $lines));</code></pre>
<p>Einmal ausgeführt und aus</p>
<pre><code>"test","test"
"bla","blubber"
"apfel","apfel"</code></pre>
<p>wird</p>
<pre><code>"apfel","apfel"
"bla","blubber"
"test","test"</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/07/28/csv-datei-sortieren-ganz-einfach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Response-Objekt vs. echo, die() und exit</title>
		<link>https://blog.ebene7.com/2010/06/17/response-objekt-vs-echo-die-und-exit/</link>
		<comments>https://blog.ebene7.com/2010/06/17/response-objekt-vs-echo-die-und-exit/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 05:00:15 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Response]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=817</guid>
		<description><![CDATA[Eigentlich lohnt es sich ja fast nicht über etwas einfaches wie ein Response-Objekt einen Artikel zu schreiben. Fast, aber auch nur fast, denn die Praxis zeigt, dass es auch damit unerwartete Probleme geben kann. Alle, die bislang nur wenig oder &#8230; <a href="https://blog.ebene7.com/2010/06/17/response-objekt-vs-echo-die-und-exit/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eigentlich lohnt es sich ja fast nicht über etwas einfaches wie ein Response-Objekt einen Artikel zu schreiben. Fast, aber auch nur fast, denn die Praxis zeigt, dass es auch damit unerwartete Probleme geben kann.</p>
<p><span id="more-817"></span>Alle, die bislang nur wenig oder keine Erfahrung mit MVC-Anwendungen gesammelt haben, werden sich vielleicht nun fragen, wofür dieses Objekt gut ist. Das Response-Objekt kontrolliert die komplette Ausgabe der Anwendung an den Client (z.B. einen Browser).</p>
<p>Während der kompletten Laufzeit können mit dem Objekt Ausgaben gesammelt und auch nachträglich verändert werden und auch die Reihenfolge spielt keine Rolle. So kann nun zuerst die Ausgabe gemacht werden und dann die Header gesetzt werden.</p>
<p>So müsste es klassisch mit PHP geschrieben werden:</p>
<pre><code>&lt;?php header('Content-type: text/xml'); echo $xml;</code></pre>
<p>Wenn wir nun die Reihenfolge vertauschen würden, hätte das eine Warning zur Folge.</p>
<pre><code>&lt;?php echo $xml; header('Content-type: text/xml');</code></pre>
<pre>Warning: Cannot modify header information - headers already sent by (output started at ####) in #### on line 3</pre>
<p>Wenn wir uns in einer MVC-Umgebung befinden, stellt diese Reihenfolge kein Problem dar, denn das Objekt verwaltet die Ausgabe und schickt alles zur rechten Zeit raus.</p>
<p>So könnte es dann z.B. in einer Action des Kontrollers aussehen:</p>
<pre><code>&lt;?php public function indexAction() { // ... $this-&gt;getResponse()-&gt;appendBody($xml); $this-&gt;getResponse()-&gt;setHeader('Content-type', 'text/xml'); } </code></pre>
<p>Neben den relativ harmlosen direkten Ausgaben mit echo oder print habe ich in den vergangenen Jahren auch Ausgaben mit die() gefunden. Die offensichtliche Arbeit verrichtet die Anwendung zwar in den Actions der Kontroller, aber es passiert unter Umständen auch vor- und nachher eine Menge. Letzteres würde dann unterbunden werden und evtl. wichtige Aufgaben nicht mehr abgearbeitet werden.</p>
<p>Ein Beispiel sah etwa so aus:</p>
<pre>&lt;?php
public function jsonAction()
{
  // ...
  header('Content-type: text/json');
  die($json);
  // ...
}</pre>
<p>Die Anwendung verliert so die Kontrolle über die Ausgabe und wird an der falschen Stelle beendet. Der richtige Weg führt auch hier zum Response-Objekt.</p>
<pre>&lt;?php
public function jsonAction()
{
  // ...
  $this-&gt;getResponse()-&gt;setHeader('COntent-type', 'text/json');
  $this-&gt;getResponse()-&gt;appendBody($json);
  return;  // &lt;== falls die Bearbeitung hier enden soll
  // ...
}</pre>
<p>So, nun gibt es in Zukunft keine Ausreden mehr, wenn irgendwo ein echo im Kontroller steht. Ich würde mich natürlich wie immer freuen eure Erfahrungen in den Kommentaren zu lesen.</p>
<p>Nebenbei bemerkt ist das mein 50. Artikel, also schon fast ein kleiner Grund zum Feiern. <img src='https://blog.ebene7.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/06/17/response-objekt-vs-echo-die-und-exit/feed/</wfw:commentRss>
		<slash:comments>0</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>
	</channel>
</rss>
