2010-06-14 18 views
34

ok, ich bin zu PHP-Programmierung relativ neu und haben zusammen gar nicht bewusst trotten, dass es möglich ist, tatsächlich Namespaces in PHP zu verwenden, wie kann ich in C# usw.Um PHP Namespace oder nicht zu PHP Namespace

Es ist wirklich hässlich, obwohl sie sich entschieden haben Backslashes zu benutzen - warum?

Wie auch immer, ich bin interessiert an anderen PHP-Programmierer Ansichten darüber, ob sich Namespaces in PHP durchsetzen und ob ich anfangen sollte, sie jetzt zu verwenden?

+4

* (Referenz) * [Anfrage für Kommentare: Namespace Separators] (http://wiki.php.net/rfc/namespaceseparator) – Gordon

+6

@Gordon, Sie ernsthaft betrachtet ein Smilie? Ich wusste, dass die PHP-Entwickler verrückt waren, aber wirklich? –

+0

@Aaron mit Ausnahme des Backslash, alle von ihnen sehen aus wie Gesichter für mich: D – Gordon

Antwort

3

Sie werden wahrscheinlich nicht auffangen, bis der Kern sie zu verwenden beginnt (in PHP 7 vielleicht vielleicht ...), aber die Verwendung von Python für ein paar Monate wird Ihnen zeigen, dass Namespaces AWESOME sind.

+5

Ich glaube nicht, dass es so lange dauern wird. Die wichtigsten Frameworks wechseln bereits in Namespaces. Ich würde sagen, das Hauptargument gegen Namespaces im Moment (neben dem Backslash, der dreckig hässlich ist) ist die mangelnde Verfügbarkeit von PHP 5.3 auf freigegebenen Hosts. – Gordon

+1

@Gordon Ich stimme der Verfügbarkeit von 5.3 auf gemeinsamen Hosts - es ist ziemlich damm ärgerlich und ja der Backslash ist wirklich hässlich aus irgendeinem Grund. Ich habe versucht zu denken, warum es so hässlich ist, aber ich kann nicht genau denken, warum - es ist wirklich schlecht aus irgendeinem Grund. – David

+0

@David: Es wird bereits in Strings verwendet, um bestimmten Zeichen eine besondere Bedeutung zu geben oder um Anführungszeichen zu umgehen. Wir mussten sie so lange verdoppeln, dass ein einziger Backslash unser Empfinden verletzt. –

3

Wenn nicht Ihr gesamter Code auf Ihren eigenen Servern läuft, ist es zu früh, sie zu verwenden, da 5.3 relativ neu ist.

Ansonsten bin ich mir nicht sicher, ob sie sich jemals wirklich durchsetzen werden. Sogar Klassen brauchten viel Zeit, um einen großen Teil der PHP-Programmierpopulation zu erreichen.

+1

Glauben Sie nicht, dass es eine "Best Practice" sein sollte, die aber verwendet werden sollte? – David

+3

Ich bin mir noch nicht sicher. Ich habe nicht genug damit gespielt. In der Theorie würde ich jedoch ja sagen, da PHP verzweifelt Namespaces benötigt, um die Verbreitung von unlesbar langen Funktionsnamen zu stoppen. –

+0

5.3 wurde im Juni 2009 veröffentlicht. Das ist vor einem Jahr jetzt. "Relativ" neu in der Tat. – Charles

1

Ich würde lernen, wie Namespaces so schnell wie möglich zu verwenden. Zend Framework 2.0 wird Namespaces verwenden, was bedeutet, dass jeder, der PHP 5.2 oder niedriger verwendet, kein Glück mehr hat. Ich benutze einen virtuellen dedizierten Server, damit ich meine PHP-Version kontrollieren kann. Wenn Sie cPanel/WHM verwenden, können Sie PHP 5.3 sehr einfach installieren. Wenn Sie Shared Hosting betreiben, kann es ein wenig dauern, bis Sie 5.3 installiert sehen, obwohl es 5.3 Anwender gibt.

5

Seine Verwendung fängt bereits an. Ein paar Projekte verwenden es in ihren kommenden/Beta-Versionen. Die meisten Beispiele, die ich gesehen habe, benutzen es jedoch wie einen Frachtkult. Doctrine2 verwendet zum Beispiel fünf oder mehr verschachtelte Namespaces (code smell), um dem Dateisystem/den Verzeichnissen eine 1: 1-Zuordnung von Namespace/Klasse zu geben. Ich denke, die Neuheit macht PHP-Namespaces anfällig für unbegründete Überbeanspruchung.

Jedenfalls hilft die Syntax nicht so gut mit Lesbarkeit. Und es ist eine große Abkehr für professionelle Programmierer. Wenn es jedoch einen ernsthaften Anwendungsfall in Ihrem Projekt gibt, gehen Sie einfach dafür. (Hypothetische Benennungskonflikte sind nicht der beste Grund.)

6

Hier sind einige Lösungsversuche für diejenigen, die sich über Namensraumfunktionen wundern, ohne PHP 5.3.

Zuerst muss ich sagen, nur Prefixing funktionierte für mich, die anderen Lösungen unten sind eine Art von Notizen nicht so zu gehen.

Namespace-Funktionalität kann benötigt werden, wenn Sie zum Beispiel Wordpress-Plugins erstellen, in denen Sie Ihre wertvolle Funktionsbibliothek verwenden. Normalerweise können Sie nicht mehrere Plugins mit Funktionsdeklarationen derselben Funktionen haben, dies würde fatale Fehler verursachen.

LÖSUNG 1: Präfix alle Bibliotheksfunktionen mit plugin_name_ oder namespace_

function str_len_utf8($str) 

wird

function photoplugin_str_len_utf8($str) 

Ist nur eine Frage der findungs ​​ersetzen.Einfach, wenn die Funktionen sind bereits voran eindeutig:

john_str_len_utf8() => photoplugin_john_str_len_utf8() 

Gut für die Seele und unterstützt das Ego, ‚johns String-Bibliothek‘: D

Wenn Sie kurz und schön Präfixe mit etwas gesunden Menschenverstand wählen, es funktioniert wie ein Zauber, wie sie sagen.

LÖSUNG 2: schließen Sie alle Ihre Bibliothek/Reeuse-Funktionen in einer Klasse ein.

Alle Funktionsaufrufe in der Klasse für die Klasse haben das Präfix $ this->. Sobald diese Klasse vorbereitet ist, kann man sie wiederholt ohne search-replace verwenden, das Ändern des Klassennamens ist genug. Verbrauch:

$photopluginlib=new photopluginlibrary(); 
$b=$photopluginlib->str_len_utf8($a); 

LÖSUNG 3: umschließen alle Ihre Bibliothek/reeuse Funktionen in einer Klasse, und verwenden :: operator

class photopluginlib 
    { 
    static function str_len_utf8($a){ $a=self::str_clean_utf8($a); ...} 
    ... 
    } 

Alle Funktionsdeklarationen in der Klasse haben Schlüsselwort statische vor von Funktion.

Alle Funktionsaufrufe innerhalb der Klasse auf die Klasse mit selbst Präfix ::

Sobald dieser Klasse hergestellt wird, man es ohne verwenden können Such ersetzen. Der Klassenname ist der Namespace, eine Art von. Man ändert nur den Klassennamen und verwendet ihn als solchen.

$b=photopluginlib::str_len_utf8($a); 
$c=photopluginlib::database_row(...) 

Keine Instanziierung der Klasse erforderlich.

Sieht schöner als $ photopluginlib-> str_len_utf8(), aber ich ziehe noch photoplugin_john_str_len_utf8()

Hinweise

  • alle Bibliotheken in 1 große Bibliothek Klassendeklaration gehen müssen, Sie Praktisch können Methoden zu Klassen später in PHP nicht hinzufügen.
  • Sie können nicht einfach neue Bibliothek Funktionen hier und da in verschiedenen PHP-Dateien deklarieren.
  • Wenn mehrere Bibliotheken verwendet werden und sie sich gegenseitig verwenden, müssen sie self :: for Funktionsaufrufe verwenden.
  • php5.2.17, gemeinsam 2013 hat call_user_func('photopluginlib::functionname') nicht akzeptieren, müssen call_user_func(Array('photopluginlib','functionname')) oder innerhalb der Klasse verwenden, call_user_func(Array(__CLASS__,'functionname')), die für wp add_action Code Rewrite bedeutet, preg_replace_callback usw.
  • Bedürfnisse PHP> = 5
  • nicht Code mischen und Funktionsdeklarationen, wie in:

class photopluginlib{ add_filter('html','myfilter'); static function myfilter($html){return ''} }

  • Für großen Code, kann es schnell ein großer komplizierter Geist ben werden die.

Ich ziehe es einfach, bis die reale Sache voran verwenden, Namespaces, sind weit verbreitet.

Diese Lösungen bedeuten immer noch, dass alle Funktionsverwendungen vorangestellt werden müssen. Namespace-Funktionalität würde bedeuten, man sie Funktionen ohne prefixing verwenden können, würde das Präfix nur einmal sein, bei der PHP-Datei beginnen:

<?php 
namespace photoplugin; 
... 
$b=str_len_utf8($a); 

By the way, ein Upgrade auf PHP5.3 einen zusätzlichen Vorteil hat, wenn Sie können wähle nicht für php5.2 (immer noch überall, Jahr 2013) Php5.3 vs php 5.2.17 bedeutet sofortige Geschwindigkeitssteigerung. Es sieht aus wie% 30 etc Geschwindigkeit erhöht zur Verfügung stehen, nicht die Datenbank Seite Berücksichtigung

http://onlinephpfunctions.com/benchmarks

hoffe, das hilft einige Lösungen für diejenigen, für die Namensräume zu erreichen inspirieren.

0

Namespace ist nicht für PHP erforderlich.

Zum Beispiel ist es in C# und Java üblich, mehrere Bibliotheken zu verwenden (besonders eine Standardbibliothek) und jede Bibliothek enthält Tausende von Klassen und Definitionen für jede Bibliothek. Die Wahrscheinlichkeit eines Konflikts ist also hoch.

Stattdessen ist in PHP anders, wir müssen nicht mehrere Bibliotheken, höchstens ein Framework und einige separate .php-Dateien laden. Wie PHP arbeitet, entmutigt, die größten Bibliotheken zu laden, aber ein absolutes Minimum zu verwenden. Deshalb ist die Wahrscheinlichkeit eines Namenskonflikts ziemlich gering. Außerdem werden Frameworks mit einem kurzen Präfix versehen, z. B. Wp_User (Wordpress).