<?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>ITWS BLOG &#187; php</title>
	<atom:link href="http://blog.itws.de/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.itws.de</link>
	<description>The cake is a lie!</description>
	<lastBuildDate>Tue, 31 Jan 2012 10:34:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Schei? Encoding &#8230;</title>
		<link>http://blog.itws.de/672/schei-encoding/</link>
		<comments>http://blog.itws.de/672/schei-encoding/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 09:53:03 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[encoding]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=672</guid>
		<description><![CDATA[Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen. Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230; Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen. Danach suche ich den Inhalt [...]]]></description>
			<content:encoded><![CDATA[<p>Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen.</p>
<p>Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230;</p>
<p>Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen.<br />
Danach suche ich den Inhalt der Seite raus, sodass lediglich ein String ohne HTML-Tags und damit reinem Text übrig bleibt.<br />
Gebe ich mir diesen nun einfach auf die Shell aus, stimmt das Encoding manchmal und manchmal nicht. Das sieht man dann immer schön an den kaputten Umlauten.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Also habe ich eine Funktion gebraucht, die das Encoding eines Strings konvertiert &#8230; Tja, wenn es denn so einfach wäre &#8230;<br />
Die letzten Tage habe ich rund 20 Stunden damit verbracht eine Funktion zu schreiben, welche dafür sorgt, dass der String, der am Ende rauskommt, sauber dargestellt wird &#8211; unabhängig davon, was rein kommt. Das Problem hier war in erster Linie, dass selbst Strings, die sich als UTF-8 ausgegeben haben und von denen sogar mb_check_encoding() behauptet hat, es sei alles in bester Ordnung, haben kaputte Umlaute mit sich getragen. Also darauf konnte man sich schonmal gar nicht verlassen.</p>
<p>Ich möchte hier das Ergebnis meiner Arbeit mit euch teilen. Nicht erschrecken, es ist keine saubere Lösung (die sauberen Implementierungen haben allesamt nicht funktioniert). Der Code deckt auch nicht alle denkbaren Fälle ab, aber ich konnte bisher jeden beliebigen kaputten String mit deutschem Text und explodierten Umlauten in einen lesbaren String mit intakten Umlauten konvertieren. Da das mehrere 100 Texte aus verschiedensten Quellen aus dem Netz waren, behaupte ich mal, dass der Code recht brauchbar ist. Im Zweifelsfall dient er als gute Basis für eine umfassendere Implementierung.</p>
<p>Der Methode magicFixStringEncoding() kann man also einen beliebigen  String übergeben unabhängig davon ob er völlig in Ordnung ist oder total verstümmelt. Die Rückgabe der Methode sollte immer einen sauberen String mit funktionierenden Umlauten entsprechen.</p>
<p>Für Verbesserungsvorschläge bin ich jeder Zeit offen. Annsonsten viel Spaß denen, die den Code gebrauchen können <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="php">class ITWS_Tool {
	public static function magicFixStringEncoding($strInput) {
		if (preg_match('/[üäöÄÖÜß]/i', $strInput) === 1) {
			$strInput = self::convertEncoding($strInput, 'UTF-8');

			if (strlen(utf8_decode($strInput)) !== strlen(utf8_decode(utf8_decode($strInput)))) {
				$strInput = utf8_decode($strInput);
			}
		} else {
			$strInput = self::convertEncoding($strInput, 'UTF-8', 'ISO-8859-15');
		}

        return $strInput;
    }

    public static function convertEncoding($strInput, $toEncoding, $fromEncoding = '') {
        if ($fromEncoding == '') {
            $fromEncoding = mb_detect_encoding($strInput, array('UTF-8', 'ASCII', 'ISO-8859-1', 'JIS', 'EUC-JP', 'SJIS'), true);
		}

        if ($fromEncoding == $toEncoding) {
            return $strInput;
		}

        return mb_convert_encoding($strInput, $toEncoding, $fromEncoding);
    }
}</pre>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/" title="PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse">PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=672&amp;md5=c43b9f2824a457050498b8fd089b6856" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/672/schei-encoding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</title>
		<link>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/</link>
		<comments>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 20:11:34 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=578</guid>
		<description><![CDATA[Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel. Vererbung: Vertikaler Code Reuse class A { public function foo() { ....} } class B extends A { } Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur [...]]]></description>
			<content:encoded><![CDATA[<p>Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel.</p>
<h2>Vererbung: Vertikaler Code Reuse</h2>
<pre class="php">class A {
	public function foo() { ....}
}

class B extends A { }</pre>
<p>Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur einmal zu implementieren, kann sie aber in vielen verschiedenen Klassen wiederverwenden. Das ist vertikaler Code Reuse. Tolle Sache, kein Thema.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Dennoch gab es ein paar Dinge, die sich mit einfacher Vererbung nicht umsetzen ließen. z.B. eine Basis-Klasse für das Singleton-Pattern. Gerade in PHP ist das Hauptproblem hier, dass keine Mehrfach-Vererbung möglich ist &#8211; also eine Klasse nicht von mehr als einer anderen Klasse abgeleitet werden kann. Das zwingt uns leider oft dazu, dass wir uns der unangehmen Entscheidung stellen müssen, ob wir nun konzeptionell sauberen Code oder aber möglichst gute Wiederverwendung von Code haben wollen. Um dennoch irgenwie horizontalen Code Reuse zu realisieren mussten Methoden kopiert werden (also praktisch kein Reuse) oder Methoden bis in die Wurzel der Klassen-Hierarchie geschoben werden, was alles andere als schön ist.</p>
<p><span id="more-578"></span></p>
<h2>Traits: Horizontaler Code Reuse</h2>
<p>Abhilfe schaffen hier in PHP 5.4 die sogenannten Traits, welche bereits in Perl 6 oder Scala zur Verfügung stehen. Sie erlauben es dem Entwickler Behaviors (also Verhalten) in Code zu gießen. Diese Traits funktionieren im Prinzip wie Klassen können jedoch &#8211; ähnlich wie Interfaces und abstrakte Klassen &#8211; nicht instanziiert werden.</p>
<p>Sie sind dazu gedacht, Funktionalitäten zu gruppieren. Einer der Vorteile ist, dass eine Klasse mehrere Traits verwenden kann. Traits beheben somit einige Probleme von <em>single inheritance</em> Sprachen wie PHP oder Java.</p>
<p>Um das eben angesprochene Singleton-Pattern-Problem zu lösen genügt nun ab PHP 5.4 folgene Klassen-Definition:</p>
<p>&nbsp;</p>
<pre class="php">trait Singleton {
    public static function getInstance() { ... }
}

class A {
    use Singleton;
    // ...
}

class B extends ArrayObject {
    use Singleton;
    // ...
}

// Beide Klassen verwenden nun das Singleton Trait und implementieren somit das Singleton-Pattern:
A::getInstance();
B::getInstance();</pre>
<p>&nbsp;</p>
<p>Es wird noch besser: Wie bereits erwähnt, kann eine Klasse kann beliebig viele Traits verwenden. Da stellt sich der aufgeweckte Coder natürlich die Frage:</p>
<p>&nbsp;</p>
<h1>Was passiert bei Konflikten?</h1>
<p>Sprich: Was passiert, wenn zwei Traits verwenden werden, die beide eine Methode mit der selben Signatur definieren?</p>
<pre class="php">trait A {
    public function foo() {
        echo 'a';
    }

    public function bar() {
        echo 'A';
    }
}

trait B {
    public function foo() {
        echo 'b';
    }

    public function bar() {
        echo 'B';
    }
}

class C {
    use A, B;
}</pre>
<p>Dazu ist folgeneds zu sagen: Traits werden bereits in einigen Sprachen verwendet und es hat sich gezeigt, dass Konflikte zwar auftreten aber das eher die Ausnahme darstellt. Dennoch muss es natürlich ein definiertes Verhalten geben, das vorschreibt, was passieren soll, wenn Konflikte auftreten.</p>
<p>Diese Konfliktlösung sieht hier wie folgt aus:</p>
<p>Erstmal wirft PHP eine Warning um dem Entwickler darauf aufmerksam zu machen, dass ein Konflikt aufgetreten ist. Und gibt dazu auch die Info, wo der Konflikt genau auftritt. In dem Fall würde es die beiden Methoden <em><strong>foo()</strong></em> und <em><strong>bar()</strong></em> melden.</p>
<p>Und das ist auch gut so, denn <strong>keine</strong> der beiden Methoden werden in Klasse C zur Verfügung stehen! Richtig, die Konfliktlösung sieht vor, dass alles, was einen Konflikt erzeugt, rausfliegt.</p>
<p>PHP zwingt uns damit, die Traits ordentlich zu verwenden und PHP zu sagen, was wir aus welchem Trait haben wollen:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
    }
}
?&gt;</pre>
<p>Dieser Code bewirkt folgendes Verhalten: Klasse <strong><em>C</em></strong> erhält aus Trait <strong><em>B</em></strong> die Methode <em><strong>foo()</strong></em> und aus Trait <em><strong>A</strong></em> die Methode <em><strong>bar()</strong></em>.<br />
Entsprechend würde ein Aufruf der beiden Methoden auf Klasse <strong><em>C</em></strong> &#8220;<em>b</em>&#8221; und &#8220;<em>A</em>&#8221; ausgeben.</p>
<p>Das ist zwar cool, aber dennoch nicht die sauberste Lösung. Es gibt Alternativen: So kann der Entwickler auch Aliase vergeben:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
        B::bar as bar2;
    }
}</pre>
<p>Ok, ich gebe zu, dass sich die Beispiele jetzt nicht gerade durch Kreativität auszeichen, aber solange man erkennen kann um was es geht, reicht das <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Klasse <em><strong>C</strong></em> würde nach diesem Beispiel nun zusätzlich eine Methode <em><strong>bar2()</strong></em> besitzen, welche der <em><strong>bar()</strong></em>-Methode von Trait <em><strong>B</strong></em> entspricht.</p>
<p>&nbsp;</p>
<h1>Fazit</h1>
<p>Kombiniert man die OOP und ihre Features (Vererbung, Interfaces, Namespaces, Kapselung) nun mit den Traits kann man problemlos PHP-Anwendungen implementieren, die streng dem DRY-Prinzip folgen und gleichzeitg eine konzeptionell saubere Klassen-Hierarchie besitzen.</p>
<p>&nbsp;</p>
<p>Es gibt hierzu noch ein wenig mehr zu sagen, aber das ist erstmal das Wichtigste. Alles Weitere kann ich gerne noch in einen zweiten Artikel erklären <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>over and out</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=578&amp;md5=49586e9b9cebc5bfe7c824ef91112b54" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Den Horizont erweitern: Das Zend Framework</title>
		<link>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/</link>
		<comments>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 08:51:20 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=387</guid>
		<description><![CDATA[Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen. Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen.</p>
<p>Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich der Ansicht war, dass das nur ein Haufen sinnlos zusammengestückelter PHP Files ist und das praktische Arbeiten mit dem ZF nicht besser aussieht.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Aber man muss auch mal über seinen Horizont hinausblicken, weswegen ich mir mal die Dokumentation des Frameworks angesehen habe. Erst auf deutsch. Dann auf englisch, weil die Übersetzung so schlecht ist, dass ich viele Sätze fünfmal lesen musste, bis ich sie verstanden habe <img src='http://blog.itws.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
Den Quickstart Guide fand ich bis zu einem gewissen Punkt sehr gut, dann wurd es aber sehr schwammig und viele wichtige Punkte haben gefehlt, weswegen ich den Guide an dieser Stelle verlassen habe und beschlossen habe die Dokumentation zu lesen. Auf englisch natürlich. Die Doku ist soweit also nicht ideal aber auch nicht ausgesprochen schlecht.</p>
<p>Das Framework an sich ist deutlisch komfortabler als ich dachte, das autoloading erspart viel Arbeit und die saubere objektorientierte Implementierung der Komponenten ist wirklich gut.</p>
<p>Bisher sieht es also ganz danach aus, als würde ich das anstehende Projekt mit dem Zend Framework umsetzen. Das hat verschiedene Konsequenzen. Zu erstmal bin ich froh, diesen Schritt getan zu haben und mich endlich mit dem Framework zu befassen. Zum Anderen wird mir das wohl auch einiges an Stoff liefern, über den ich hier im Blog schreiben kann und zum anderen kann ich endlich mal wieder ein Projekt starten und habe was zum coden. Wurde auch mal wieder Zeit.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=387&amp;md5=05ebcf0b623d50bb2eb6b72c225a1860" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Vor- und Nachteile von PHP</title>
		<link>http://blog.itws.de/331/die-vor-und-nachteile-von-php/</link>
		<comments>http://blog.itws.de/331/die-vor-und-nachteile-von-php/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 12:36:53 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=331</guid>
		<description><![CDATA[Angeregt durch den Artikel Die &#34;Vor- und Nachteile von PHP&#34; auf entwickler.de, m&#246;chte ich eine bestimmte Aussage hier nochmal aufgreifen und am Ende meine leicht provokante Meinung dazu abgeben. Dennis Becker gab folgendes Kommentar zu dem besagten Artikel auf entwickler.de ab: &#160; &#160; &#160; PHP hat einen gro&#223;en Nachteil: der Zwang, abw&#228;rtskompatibel zu bleiben. In Ruby &#38; Python sehen ich gleich gute Alternativen, besser w&#252;rde ich aber nicht sagen. PHPs Problem liegt einfach in der [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.itws.de/wp-content/uploads/2010/11/php.jpg"><img alt="" class="alignnone size-thumbnail wp-image-334" src="http://blog.itws.de/wp-content/uploads/2010/11/php-150x150.jpg" style="float: left; width: 150px; height: 150px; " title="php" /></a>Angeregt durch den Artikel Die &quot;<a href="http://entwickler.de/zonen/portale/psecom,id,99,news,57607.html" target="_blank">Vor- und Nachteile von PHP</a>&quot; auf <a href="http://entwickler.de" target="_blank">entwickler.de</a>, m&ouml;chte ich eine bestimmte Aussage hier nochmal aufgreifen und am Ende meine leicht provokante Meinung dazu abgeben.</p>
<p>Dennis Becker gab folgendes Kommentar zu dem besagten Artikel auf entwickler.de ab:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
	<meta content="text/html; charset=utf-8" http-equiv="content-type" /></p>
<blockquote>
<p>PHP hat einen gro&szlig;en Nachteil: der Zwang, abw&auml;rtskompatibel zu bleiben. In Ruby &amp; Python sehen ich gleich gute Alternativen, besser w&uuml;rde ich aber nicht sagen. PHPs Problem liegt einfach in der Vergangenheit und f&uuml;r die ursp&uuml;rngliche Kernaufgabe, f&uuml;r die es entwickelt wurde: Form Handling und Database Communication. Ruby &amp; Python wurden von Anfang an mit einem viel gr&ouml;&szlig;eren Scope entwickelt!</p>
</blockquote>
<p><span id="more-331"></span></p>
<p>Meiner Meinung nach ist das der springende Punkt: Eine Anforderung an PHP ist die Abw&auml;rtskompatibilit&auml;t und genau das ist auch eine Schw&auml;che, da hier nicht nur Altlasten existieren sondern auch einige Konzepte wie eine etwas st&auml;rkere Typisierung etc. nur schwer umzusetzen sind. Dass Ruby und Python oft als bessere Sprachen angepriesen werden, liegt daran, dass diese mit anderen Anforderungen entwickelt wurden.</p>
<p>Meiner Meinung nach, w&auml;re ein Fork von PHP mal ne wirklich coole Sache. In diesem Fork k&ouml;nnte man st&auml;rkere Typisierung implementieren, die OOP von PHP etwas ausweiten, die ganze Altlast entfernen und in der API durchgehend f&uuml;r Konsistenz sorgen und &#8211; &auml;hnlich wie Ruby und Pyhton &#8211; k&ouml;nnte man auf einem ganz anderern Niveau ansetzen als PHP damals in seiner ersten Version. Das klingt nun etwas Wahnsinnig, aber eine solcher Fork h&auml;tte durchaus das Potential die aktuellen Favoriten in Sachen Scriptsprachen abzul&ouml;sen. Vorausgesetzt man l&auml;sst die Erfahrungen aus Ruby, Python und PHP 5.3 einfliesen und l&auml;sst die historisch-bedingten Aspekte der Sprache entfallen.</p>
<p>Ich w&uuml;rde es ja selbst machen, mir fehlt nur leider die Zeit <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>So, das reicht an verr&uuml;ckten Behauptungen f&uuml;r einen Tag &#8230;</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=331&amp;md5=4b52e82cb3b3032a22ae588bf431fcff" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/331/die-vor-und-nachteile-von-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] Der include path</title>
		<link>http://blog.itws.de/212/php-der-include-path/</link>
		<comments>http://blog.itws.de/212/php-der-include-path/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 06:39:15 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=212</guid>
		<description><![CDATA[Oft liest man, dass man bestimmte Verzeichnisse in den sog. include path aufnehmen soll oder im include path irgendwelche scripts ablegen soll und das meist ohne weitere Erkl&#228;rung. Der Include Path und das Administrieren des Selbigen geh&#246;rt also mehr oder weniger zu den Grundkenntnissen. Dennoch ist es f&#252;r viele ein Mysterium. Da ich gestern ein wenig damit gearbeitet habe, dachte ich, ich blogge mal ein wenig dr&#252;ber. Warum? Weil ichs kann. Und weil ich eine [...]]]></description>
			<content:encoded><![CDATA[<p>Oft liest man, dass man bestimmte Verzeichnisse in den sog. <em><strong>include path</strong></em> aufnehmen soll oder im <em>include path</em> irgendwelche scripts ablegen soll und das meist ohne weitere Erkl&auml;rung. Der <em>Include Path</em> und das Administrieren des Selbigen geh&ouml;rt also mehr oder weniger zu den Grundkenntnissen. Dennoch ist es f&uuml;r viele ein Mysterium.<br />
	Da ich gestern ein wenig damit gearbeitet habe, dachte ich, ich blogge mal ein wenig dr&uuml;ber. Warum? Weil ichs kann. Und weil ich eine kleine Hilfestellung zum Thema <em>path</em> im Allgemeinen und dem <em>PHP include path</em> im Speziellen zur Verf&uuml;gung stellen m&ouml;chte.</p>
<p><span id="more-212"></span></p>
<p>&nbsp;</p>
<h3>Was ist ein (include) path?</h3>
<p>Das Wichtigste vorweg: was ist ein <em>path</em> eigentlich? Der <em>path</em> ist eine Variable, welche einem System eine Sammlung von Verzeichnis-Pfaden angibt. In diesen Verzeichnissen sucht das System Bibilotheken oder ausf&uuml;hrbare Dateien. Linux beispielsweise verwaltet den &nbsp;<em>path</em> in der <strong><em>PATH</em></strong>-Variable welche wie folgt aussieht:</p>
<pre class="php" name="code">[ghost@spacebox ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/1.8/bin</pre>
<p>Die Verzeichnisse werden durch einen Doppelpunkt &quot;:&quot; getrennt.</p>
<p>Gibt man in der BASH nun einen Befehl ein, durchsucht das System die Verzeichnisse, welche im PATH angegeben sind, ob eine ausf&uuml;hrbare Datei existiert, deren Namen dem eingegeben Befehl entspricht und f&uuml;hrt dieses script oder diese binary im Anschluss daran aus.</p>
<p>In PHP&nbsp;gibt es auch einen <em>path</em>: den <strong><em>include path</em></strong>. Diese Variable wird in der <em>php.ini</em> gesetzt und gibt die Verzeichnisse an, in denen include-Dateien zu finden sind.</p>
<p>&nbsp;</p>
<h3>Wie funktioniert der include path?</h3>
<p>Verwendet man in seinem script nun <em>require, require_once, include</em> oder <em>include</em><em>_once</em>, versucht PHP den Dateinamen in den, im <em>include path</em> angegebenen, Verzeichnissen zu finden. Da der erste Eintrag im <em>include path</em> &quot;<em><strong>.</strong></em>&quot; ist, welcher dem aktuellen Arbeitsverzeichnis des scripts entspricht, durchsucht PHP dabei zuerst das Verzeichnis, in dem das Script ausgef&uuml;hrt wird.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Wie trage ich ein Verzeichnis in den include path ein?</h3>
<p>Wir bereits erw&auml;hnt, wird der <em>include path</em> in der <em><strong>php.ini</strong></em> gesetzt. Die entsprechende Variable kann jederzeit um weitere Pfade erwetiert werden.</p>
<p><strong>Beispiel:</strong></p>
<pre class="php" name="code">include_path = &quot;.:/usr/share/php&quot;</pre>
<p>wird zu:</p>
<pre class="php" name="code">include_path = &quot;.:/usr/share/php:/usr/lib/php&quot;</pre>
<p>Des Weiteren gibt es die M&ouml;glichkeit, den <em>include path</em> f&uuml;r das aktuelle Script anzupassen. Dazu stehen die Funktionen <strong><em>set_include_path()</em></strong> und <em><strong>get_include_path()</strong></em> zur Verf&uuml;gung.</p>
<p><strong>Beispiel:</strong></p>
<pre class="php" name="code">&lt;?php
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; set_include_path(get_include_path() . &#39;:/usr/lib/php&#39;);</pre>
<p>Mit der Funktion <strong><em>restore_include_path()</em></strong> kann der originale <em>include path</em> wiederhergestellt werden.</p>
<p>&nbsp;</p>
<h3>Zus&auml;tzliches know how</h3>
<p>Auch die Funktionen <em>fopen, file, file_get_contents</em> und <em>readfile</em> verwenden den <em>include path</em>!</p>
<p>&nbsp;</p>
<p>Ich hoffe, ich konnte euch das Thema <em>path</em> etwas n&auml;her bringen. Fragen d&uuml;rfen nat&uuml;rlich gerne als Kommentar verfasst werden <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/162/linux-apachemysqleclipse-pdt-unter-ubuntu-einrichten/" title="[Linux] Apache/MySQL/Eclipse PDT unter Ubuntu einrichten">[Linux] Apache/MySQL/Eclipse PDT unter Ubuntu einrichten</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li><li><a href="http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/" title="Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort">Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=212&amp;md5=0eac8f9660b29c89bc3e596f70af2e66" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/212/php-der-include-path/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

