2009-07-19 12 views
29

Prima di PHP 5.3 che ho usato per interfacce nome/classi astratte come questo:di denominazione di interfacce/classi astratte in PHP 5.3 (utilizzando namespace)

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

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

Ora con PHP 5.3 e l'utilizzo di spazi dei nomi non posso usare la mia convenzione più, perché interface e abstract sono parole chiave riservate.

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

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

Quindi, come dovrei denominare le mie classi/interfacce?

+0

Non sono state cercate le parole chiave riservate per astrazione/interfaccia da PHP5? – Imran

+0

sì, lo sono; ma, usando nomi come Framework_Package_Subpackage_Abstract per le classi, si è risolto il problema di avere queste parole da sole come nomi di classe. –

+0

ma non è stato un problema finora, perché il nome dell'interfaccia include l'intero percorso del pacchetto per scopi di caricamento automatico. –

risposta

18

Una corrente guida di codifica "PSR-2", suggerisce fondamentalmente si rilascia il interfaccia verso il basso una directory e combina il nome.

esempio:

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

e l'ad esempio l'uso stament:

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

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

+1

Quindi corrisponde alla risposta accettata, giusto? –

+1

Sì, ma aggiunge ulteriori dettagli, come la provenienza dello standard e il metodo per generare i nomi dei file. –

+2

Questo è davvero molto meglio della risposta accettata. Una buona risposta dovrebbe sempre fornire una spiegazione. – fuxia

8

SubpackageAbstract, SubpackageInterface

+0

Thx, è piaciuto di più. –

9

A proposito di questa domanda (Abstract e Interface), si potrebbe avere uno sguardo al post "Migrating OOP Libraries and Frameworks to PHP 5.3" sul blog di Matthew Weier O'Phinney - si tratta di Zend Framework, e come potrebbero risolvi quel problema in 2.0.

Una delle cose che nota è:

In altri linguaggi OOP, come ad esempio Python, C#, interfacce sono indicato con anteponendo l'interfaccia con un capitale 'I'; nell'esempio sopra, avremmo quindi avere Zend :: View :: IView.

Quindi, nel tuo esempio, si dovrebbe avere qualcosa di simile, immagino:

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

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

Cosa pensi a riguardo? (non ho ancora testato in questo modo, ma non sembra una cattiva idea?)

+0

Questa è stata anche la mia prima idea. I per interfaccia e A per astratto. Come codice dalle linee guida per la codifica ZF e uso molto ZF, ti ringrazio per questo link interessante! –

+0

nessun problema, siete i benvenuti :-) –

7

io personalmente consiglierei di evitare qualsiasi utilizzo di notazione ungherese, e prendere in considerazione secondo lo standard Java per i nomi di interfaccia; cioè, si chiamano in modo descrittivo proprio come qualsiasi altra classe. Vedi this SO question per una discussione sui dettagli della notazione ungherese.

Un buon esempio di utilizzo di nomi descrittivi generici indicativi di funzionalità o comportamento può essere trovato nel proprio SPL di PHP, come: "Countable", "Iterator", "ArrayObject".

+1

Questo è il migliore imho. Dovrebbe essere chiaro dal nome che si tratta di un concetto generico astratto invece di un'implementazione specifica. Per quanto riguarda gli abstracts, mi piace comunque prefisso con 'Abstract'. – shokora

1

Onestamente, credo che la notazione ungherese sia stata introdotta con C#, perché non esiste una parola chiave "extends" e "implements" come in Java. Quindi, per differenziare la convenzione è diventato chiamarlo IView. In Java, l'interfaccia si chiamerebbe View only e le implementazioni si chiamerebbero DefaultViewImpl, SmartyViewImpl o qualcosa del genere. Poiché PHP ha estendere e implementare le parole chiave, ha senso utilizzare la convenzione Java. Ho sentito l'argomento secondo cui la notazione ungherese si presta a rendere identificabili gli elementi API solo guardando i nomi delle classi. In tal caso, chiamerei IView o AbstractView.

+0

Ehm, ma come hai detto tu, a causa di 'implementa' e' interfaccia', il tuo ultimo punto è irrilevante. Se vedo 'classe Foo implements Fooer' non mi chiedo se' Fooer' sia un'interfaccia o meno. Lo so_. Inoltre, non è possibile utilizzare un'interfaccia in altro modo ... Solo le interfacce possono estendere altre interfacce, non è possibile istanziarle e non è possibile utilizzarle in modo statico. – jason

+0

L'ultimo punto avrebbe senso per qualcuno che sta navigando in una documentazione API, ma non sta guardando il codice. – blockhead

+0

La notazione ungherese è stata introdotta molto prima del C#. Il suo primo utilizzo principale è stato con il linguaggio BCPL negli anni '70. C# è nato a sua volta nel 2000. Ricordo che lo usavamo con Delphi e C++ negli anni '90. –

-2

A mio parere, il modo migliore per risolvere questo problema è semplicemente aggiungere Class ai propri nomi di classe.

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

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

notare che questo non è ancora perfetto (tuttavia, funziona perfettamente), ma ho mantiene il codice simile all'idea originale;)

+2

Le interfacce non sono classi. Allora, perché "InterfaceClass"? –

+2

Un anno e mezzo dopo capisco cosa stava facendo @alexanderpas ... Sostituisci "Class" con il nome di classe sottostante a cui stai pensando come "Class" == "Customer" => AbstractCustomer.php, InterfaceCustomer.php. .. Ancora non ideale IMO, ma non male come sembrava ... –

2

Si potrebbe anche fare qualcosa di simile:

src/Scacchi/pezzo .php

<?php 

namespace \Chess; 

abstract class Piece implements \Chess\PieceInterface {} 

src/Scacchi/PieceInterface.php:

<?php 

namespace \Chess; 

interface PieceInterface {} 

src/Scacchi/parte/Pawn.php:

<?php 

namespace \Chess\Piece; 

class Pawn extends \Chess\Piece {} 

Ecco come lo farei configurazione caricamento a composer.json

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