Wie benenne ich Dateien von Klassen mit Namespace?

9

WP Core Handbook> PHP-Codierungsstandards> Namenskonventionen schlägt Folgendes zum Benennen von Dateien mit Klassen vor:

Klassendateinamen sollten auf dem class- vorangestellten Klassennamen basieren und die Unterstriche im Klassennamen werden durch Bindestriche ersetzt. Beispiel WP_Error:

class-wp-error.php

Während der Wortlaut des Abschnitts in erster Linie für den Kerngebrauch bestimmt ist, gilt der Codierungsstil insgesamt häufig (und sollte meiner Meinung nach) für WP-Code von Drittanbietern.

Da der Core jedoch keine Namespaces unterstützt (PHP 5.2, ugh), ist dies nicht der Fall.

Was ist der praktische Weg aus Sicht der Entwicklerfreundlichkeit? Unterstützung von Autoloadern?

Ich konnte mehrere alternative Wege sehen:

  • Namespace insgesamt ignorieren
  • einschließlich Namespace im Dateinamen
  • Verwenden von Namespaces als Ordnerebenen
  • Verwenden eines alternativen Namensschemas wie PSR
Selten
quelle
3
Meine ehrliche Meinung ist, dass Sie, wenn Sie PHP 5.3+ verwenden, bereits gegen die WP-Kernregeln verstoßen. Beachten Sie außerdem, dass WP-Standards Schnittstellen oder Merkmale nicht berücksichtigen. Daher ist es für mich nur sinnvoll, einen für Sie geeigneten Weg zu wählen und einen bereits etablierten Standard wie PSR zu verwenden. In diesem Fall scheint dies die bessere Wahl zu sein.
gmazzap

Antworten:

7

Ignorieren Sie zunächst das class-Präfix. Dies beruht auf dem reinen prozeduralen Code-Ansatz von WordPress. Klassen werden als Container für prozeduralen Code verwendet, nicht für reale Objekte, und die meisten Dateien enthalten überhaupt keine Klassen oder Klassen und anderen Code zusammen. Es macht keinen Sinn, wenn alle Ihre Dateien nur eine Klasse und sonst nichts enthalten.
Wenn Sie diesem Muster folgen würden, müssten Sie interface-foo.phpund verwenden trait-bar.php. Das sieht nicht nur lächerlich aus, es macht das automatische Laden schwieriger als nötig.

Der einfachste Weg, Namespaces und Klassen- / Schnittstellen- / Merkmalsnamen zu trennen, besteht (meiner Erfahrung nach) darin, Verzeichnisnamen Namespaces und Dateinamen Klassennamen zuzuweisen. Dies macht es sehr einfach , die gewünschte Klasse zu einer bestimmten Dateistruktur in den Auto-Loader zur Karte: Just convert \zu /, append .phpund die Datei laden.

Dies macht es auch einfach, die Suchvorgänge zwischenzuspeichern: Für jedes Verzeichnis / Namespace können Sie alle vorhandenen Dateien abrufen, wenn dieses Verzeichnis zum ersten Mal angefordert wird, und für spätere Aufrufe können Sie diese Liste von Dateinamen wiederverwenden, ohne file_exists()jedes Mal danach zu fragen .

Fuxia
quelle
4
Mit anderen Worten: Machen Sie es PSR-kompatibel :)
Kaiser
2

Ich habe eine Klasse für diese Anforderung erstellt, die mit PSR-4 kompatibel ist und den Wordpress-Codierungsstandards entspricht.

Sie erreichen es hier: https://github.com/pablo-pacheco/wp-namespace-autoloader

Die Erklärung ist alles da, aber im Grunde ist es eine Komponistenabhängigkeit. Sie müssen es nur in Ihrem Projekt benötigen:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

Und dann ruf die Klasse an

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
Pablo SG Pacheco
quelle
1

Ich gehe im Allgemeinen mit der zweiten Hälfte Ihrer Optionen:

  • Verwenden von Namespaces als Ordnerebenen
  • Verwenden eines alternativen Namensschemas wie PSR

Wenn Sie einen PSR-4-Autoloader mit Composer registrieren, können Sie sich an die WP-Namenskonventionen halten. Namespaces, die Ordnern zugeordnet sind, die Unterstriche enthalten können, mit Dateien, die wie die Klasse benannt sind und auch Unterstriche enthalten können. Mögen:

<Namespace_Dir>/Class_Name.php

Wenn WP zu PHP 5.3+ übergeht (es muss irgendwann passieren, oder?!), Müssen die Richtlinien aktualisiert werden. Da PSR-0 bereits veraltet ist, sollte PSR-4 zumindest empfohlen werden, wenn dies nicht erforderlich ist.

cfoellmann
quelle
0

Die Lösung von pablo-sg-pacheco hat bei mir funktioniert. Das automatische Laden basiert auf einem Komponisten, der jedoch mit den WordPress-Codierungsstandards kompatibel ist. Die URL für das Github-Repo lautet jedoch:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

und der Paketname lautet:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Schließlich müssen Sie Ihrer composer.json auch Folgendes hinzufügen, da das Paket auf packagist nicht verfügbar ist:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
guillaume.molter
quelle