2009-08-14 19 views
6

Mi chiedo se i metodi php siano mai definiti al di fuori del corpo della classe poiché vengono spesso eseguiti in C++. Mi rendo conto che questa domanda è la stessa di Defining class methods in PHP. Ma credo che la sua domanda iniziale fosse "dichiarare" invece di "definire", quindi tutte le risposte sembrano un po 'inadeguate.Metodi definiti al di fuori della classe?

Aggiornamento:

Probabilmente la mia idea di definire e dichiarare erano difettose. Ma per definire al di fuori del corpo della classe, volevo dire qualcosa di equivalente al C++

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
}; 

void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

Tutti gli esempi di codice PHP, hanno il codice all'interno del corpo della classe come una funzione inline C++. Anche se non ci sarebbe alcuna differenza funzionale tra i due in PHP, è solo una questione di stile.

+0

che è praticamente la stessa domanda –

+0

Si prega di definire la differenza tra "dichiarare" e "definire";) – matpie

+0

Non so la risposta a questa domanda, ma sono d'accordo che l'uso scorretto di * dichiarare * nell'altra domanda mi rende difficile sapere come interpretare le risposte. Le risposte qui finora non lo chiariscono. – Darryl

risposta

4

Avere la dichiarazione dei metodi nei file di intestazione separata dalla loro implementazione è, a mia conoscenza, piuttosto unico per C/C++. Tutte le altre lingue che conosco non ne hanno affatto, o solo in forma limitata (come le interfacce in Java e C#)

0

No. È possibile considerare 'dichiarare' e 'definire' come intercambiabili in quella domanda.

1

È possibile, ma molto, molto hacky e non consigliato. Neanche un motivo per farlo.

1

Prima di tutto, in PHP, tutti i metodi di classe devono essere definiti e implementati all'interno della struttura class (class x { }). Non è in alcun modo come il C++ in cui le implementazioni (*.cpp) sono separate dalle definizioni (*.h).

6

Ecco un terribile, brutto, hack che non dovrebbe mai essere usato. Ma l'hai chiesto!

class Bar { 
    function __call($name, $args) { 
     call_user_func_array(sprintf('%s_%s', get_class($this), $name), array_merge(array($this), $args)); 
    } 
} 

function Bar_foo($this) { 
    echo sprintf("Simulating %s::foo\n", get_class($this)); 
} 

$bar = new Bar(); 
$bar->foo(); 

Cosa ho fatto? Ad ogni modo, per aggiungere nuovi metodi, basta prefissarli con il nome della classe e un trattino basso. Il primo argomento della funzione è un riferimento a $this.

2

Mi sono imbattuto in questa domanda mentre cercavo un modo per separare la dichiarazione e l'implementazione dei metodi di classe. Perché? Per motivi di leggibilità del codice. Quando le dichiarazioni sono in un file separato o nella parte superiore del file di classe, qualcuno che cerca di utilizzare la classe non deve attraversare l'intera implementazione per scoprire quali metodi sono offerti.

Ho trovato qualcosa di utile: classi di interfaccia PHP. Non penso che siano progettati per questo, ma servono allo scopo: una classe di interfaccia definisce tutti i metodi, e quindi la classe "reale" li implementa. Ecco un articolo su di esso:

http://www.davegardner.me.uk/blog/2010/11/21/why-you-should-always-use-php-interfaces/

1

nativamente PHP non supporta le funzionalità di questo tipo, ma dal momento che si può PHP5.4 aggiungere dinamicamente i metodi di opporsi. A titolo di esempio, si può guardare a questo: https://github.com/ptrofimov/jslikeobject

Problemi correlati