2009-07-19 12 views
29

Vor PHP 5.3 verwendet ich Namen Schnittstellen/abstrakte Klassen wie folgt aus:Naming von Schnittstellen/abstrakte Klassen in PHP 5.3 (unter Verwendung von Namespaces)

abstract class Framework_Package_Subpackage_Abstract {} 
Framework/Package/Subpackage/Abstract.php 

interface Framework_Package_Subpackage_Interface {} 
Framework/Package/Subpackage/Interface.php 

Jetzt mit PHP 5.3 und Namespaces verwendet, kann ich nicht verwenden meine Konvention mehr, weil interface und abstract reservierte Schlüsselwörter sind.

namespace Framework\Package\Subpackage; 
abstract class Abstract {} 
Framework/Package/Subpackage/Abstract.php 

namespace Framework\Package\Subpackage; 
interface Interface {} 
Framework/Package/Subpackage/Interface.php 

Also, wie soll ich meine Klassen/Interfaces benennen?

+0

Hat nicht abstrakte/Schnittstelle Schlüsselwörter seit PHP5 reserviert? – Imran

+0

yep, sie sind; Die Verwendung von Namen wie Framework_Package_Subpackage_Abstract für Klassen löste jedoch das Problem, dass diese Wörter nur als Klassennamen verwendet werden. –

+0

aber das war bisher kein Problem, weil der Name der Schnittstelle den gesamten Paketpfad für Autoload-Zwecke enthält. –

Antwort

18

Eine aktuelle Codierung guide „PSR-2“ im Grunde schlägt Ihnen die Drop schnittstelle ein Verzeichnis herunter und kombiniere den Namen.

zB:

File \Vendor\Foo\Interface.php ===> \Vendor\FooInterface.php. 

und die Nutzung abgetan zB:

use \Vendor\Foo\Interface; ===> use\Vendor\FooInterface; 

siehe: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

+1

Also es entspricht der akzeptierten Antwort, oder? –

+1

Ja, aber es fügt mehr Details hinzu, wie zum Beispiel wo der Standard herkommt und die Methode zum Erzeugen der Dateinamen. –

+2

Das ist in der Tat viel besser als die angenommene Antwort. Eine gute Antwort sollte immer eine Erklärung liefern. – fuxia

8

SubpackageAbstract, SubpackageInterface

+0

Thx, mochte das am meisten. –

9

Über diese Frage (Abstract und Interface), Sie einen Blick auf die Post haben könnte "Migrating OOP Libraries and Frameworks to PHP 5.3" auf Matthew Weier O'Phinney Blog - es geht um Zend Framework und wie sie konnten, löse dieses Problem in 2.0.

Eines der Dinge, die sie beachten ist:

In anderen OOP-Sprachen, wie Python, C#, Schnittstellen bezeichnet werden durch mit einem Kapital der Schnittstelle prefixing 'I'; Im obigen Beispiel hätten wir dann Zend :: View :: IView.

Also, in Ihrem Beispiel, würden Sie etwas davon haben, ich denke:

namespace Framework\Package\Subpackage; 
abstract class ASubpackage {} 
Framework/Package/Subpackage/ASubpackage.php 

namespace Framework\Package\Subpackage; 
interface ISubpackage {} 
Framework/Package/Subpackage/ISubpackage.php 

Was denken Sie darüber? (Ich habe diese Art und Weise nicht getestet, aber es wie eine schlechte Idee sieht nicht?)

+0

Das war meine erste Idee. Ich für die Schnittstelle und A für die Zusammenfassung. Da ich nach den ZF-Codierungsrichtlinien code und ZF sehr nutze, danke ich Ihnen für diesen interessanten Link! –

+0

kein Problem, Sie sind herzlich willkommen :-) –

7

Ich persönlich würde empfehlen, jede Nutzung der ungarischen Notation zu vermeiden und prüfe für Schnittstellennamen nach dem Java-Standard; Das heißt, sie werden wie jede andere Klasse deskriptiv benannt. Eine Diskussion der ungarischen Notation finden Sie unter this SO question.

Ein gutes Beispiel für die Verwendung von generischen, beschreibenden Namen, die auf Funktionalität oder Verhalten hinweisen, finden Sie in PHPs eigenem SPL, wie: "Countable", "Iterator", "ArrayObject".

+1

Dies ist die beste Imho. Aus dem Namen sollte klar hervorgehen, dass es sich um ein abstraktes generisches Konzept anstelle einer spezifischen Implementierung handelt. Wenn es um Abstracts geht, möchte ich allerdings "Abstract" voranstellen. – shokora

1

Ehrlich gesagt, glaube ich, dass die ungarische Notation mit C# eingeführt wurde, weil es kein "extends" und "implements" Schlüsselwort wie in Java gibt. Um die Konvention zu unterscheiden, wurde es IView genannt. In Java würde die Schnittstelle View alone heißen, und Implementierungen würden DefaultViewImpl, SmartyViewImpl oder so ähnlich heißen. Da PHP Schlüsselwörter erweitert und implementiert, ist es sinnvoll, die Java-Konvention zu verwenden. Ich habe das Argument gehört, dass die ungarische Notation sich dazu eignet, die API-Elemente durch das Betrachten der Klassennamen identifizierbar zu machen. In diesem Fall würde ich es entweder IView oder AbstractView nennen.

+0

Ähm, aber wie du schon sagtest, wegen "implementiert" und "Schnittstelle" ist dein letzter Punkt irrelevant. Wenn ich sehe, dass Klasse Foo Fooer implementiert, frage ich mich nicht, ob Fooer eine Schnittstelle ist oder nicht. Ich kenne_. Außerdem können Sie keine Schnittstelle auf andere Weise verwenden ... Nur Schnittstellen können andere Schnittstellen erweitern, Sie können sie nicht instanziieren, und Sie können sie nicht statisch verwenden. – jason

+0

Der letzte Punkt würde für jemanden sinnvoll sein, der eine API-Dokumentation durchsucht, aber den Code nicht betrachtet. – blockhead

+0

Ungarische Notation wurde viel vor C# eingeführt. Es war der erste große Gebrauch mit der BCPL-Sprache in den 70er Jahren. C# wiederum wurde im Jahr 2000 geboren. Ich erinnere mich, dass wir es in den 90ern mit Delphi und C++ benutzten. –

-2

Meiner Meinung nach ist der beste Weg, dies zu lösen, indem Sie einfach Class an Ihre Klassennamen anhängen.

namespace Framework\Package\Subpackage; 
abstract class AbstractClass {} 
Framework/Package/Subpackage/AbstractClass.php 

namespace Framework\Package\Subpackage; 
interface InterfaceClass {} 
Framework/Package/Subpackage/InterfaceClass.php

beachten Sie, dass dies immer noch nicht perfekt ist (aber funktioniert perfekt), aber ich hält den Code ähnlich der ursprünglichen Idee;)

+2

Schnittstellen sind keine Klassen. Warum also "InterfaceClass"? –

+2

Eineinhalb Jahre später verstehe ich, was @alexanderpas wollte ... Ersetzen Sie "Class" mit dem zugrunde liegenden Klassennamen wie "Class" == "Customer" => AbstractCustomer.php, InterfaceCustomer.php. .. Immer noch nicht ideal IMO, aber nicht annähernd so schlimm wie es schien ... –

2

Man könnte auch so etwas tun:

src/Schach/Stück .php

<?php 

namespace \Chess; 

abstract class Piece implements \Chess\PieceInterface {} 

src/Schach/PieceInterface.php:

<?php 

namespace \Chess; 

interface PieceInterface {} 

src/Schach/Stück/Pawn.php:

<?php 

namespace \Chess\Piece; 

class Pawn extends \Chess\Piece {} 

wie hier würde ich ein Setup automatische Laden in composer.json

{ 
    "autoload": { 
     "psr-0": { 
      "": "src/" 
     } 
    } 
}