Che succede con l'idioma Class :: get (id) in PHP

1

Sono un nuovo sviluppatore PHP (proveniente da .NET). Lo sviluppatore php con cui collaboro ha detto che chiamare un metodo get statico su una classe PHP con un ID come parametro è comune in PHP.

C'è un nome per questo idioma? C'è una ragione per cui gli sviluppatori fanno questo? Qualcuno può indicare un link a un esempio di classe?

Mi piacerebbe capire di più di quello che sta dicendo. Sta parlando di codice come questo, credo, per estrarre la macchina numero 1 dal database:

$car = Car::get(1)
    
posta Bernie2436 15.11.2013 - 14:51
fonte

2 risposte

1

Questo è il schema di facciata e lo scopo è quello di fornire un facile accesso a compiti comuni o comunque complicati. Generalmente fornisce solo zucchero sintetico . Per confrontarlo con il mondo C # pensalo come i metodi di estensione:

Esempio di calcolo tradizionale dell'importo totale della transazione per un utente:
var total = 0f;
foreach(var transaction in User.transactions) {
    total += transaction.Amount;
}
Utilizzando un metodo di estensione:
// Extension Method
public static float AccountBalance(this User user) {
    var total = 0f;
    foreach(var transaction in User.transactions) {
        total += transaction.Amount;
    }
    return total;
}

// Using the extension method
user.AccountBalance();

Allo stesso modo accade lo stesso genere di cose usando il modello di facciata in PHP:

$total = 0;
foreach($user->trasnactions as $transaction) {
    $total += $transaction->amount;
}
Con una facciata
<?php
class User {
    public static function TotalTransactionSum($userid) {
        $user = $userRepository->getById($userid);
        $total = 0;
        foreach($user->transaction as $transaction) {
            $total += $transaction->amount;
        }
        return $total;
    }
}

// Using the facade later
$total = User::TotalTransactionSum(1);
    
risposta data 15.11.2013 - 18:46
fonte
0

Si chiama modello Singleton ed è generalmente una cattiva pratica di progettazione.

Suppongo che quando chiami Car::get(1) sul modello dati per Car , utilizzi un riferimento singleton per l'origine dati, interroga il database e restituisce il record.

Questa è una cattiva progettazione.

Singletons nasconde le dipendenze del modello di dati nel codice sorgente. Il metodo get() è reso statico per evitare di aggirare un riferimento a un oggetto. Ciò crea fratture nella connessione tra business logic e modelli di dati.

È davvero una brutta cosa da fare se è così che stai accedendo ai tuoi dati.

  • viola il principio di responsabilità singola perché i tuoi modelli gestiscono la propria creazione.
  • Crea codice strettamente accoppiato che è difficile da mantenere.
  • Rende molto difficile il test dell'unità
  • Lo stato dei modelli di dati viene modificato da più punti nel codice sorgente al di fuori dell'ambito del chiamante corrente.
  • I modelli di dati portano le modifiche di stato in altre regole aziendali.

Potrei andare avanti e avanti ...

    
risposta data 15.11.2013 - 15:36
fonte

Leggi altre domande sui tag