È un argomento interessante. Ti darò una risposta orientata al design.
A mio parere, non si dovrebbe mai utilizzare una classe/funzione statica in una buona architettura OOP.
Quando si utilizza statico, si tratta di chiamare una funzione senza un'istanza della classe. La ragione principale è spesso quella di rappresentare una classe di servizio che non dovrebbe essere istanziata molte volte.
vi darò 3 soluzioni (dal worste al meglio) per raggiungere tale:
Statico
una classe statica (con funzioni solo statiche) impedisce di utilizzare molte caratteristiche OOP come eredità, implementazione dell'interfaccia. Se pensi veramente a cosa sia una funzione statica, è una funzione nominata dal nome della sua classe. Hai già spazi dei nomi in PHP, quindi perché aggiungere un altro livello?
Un altro grande svantaggio è che non è possibile definire dipendenze chiare con la classe statica e le classi che la utilizzano, il che è un aspetto negativo per la manutenibilità e la scalabilità dell'applicazione.
Singleton
Un Singleton è un modo per forzare una classe di avere una sola istanza:
<?php
class Singleton {
// Unique instance.
private static $instance = null;
// Private constructor prevent you from instancing the class with "new".
private function __construct() {
}
// Method to get the unique instance.
public static function getInstance() {
// Create the instance if it does not exist.
if (!isset(self::$instance)) {
self::$instance = new Singleton();
}
// Return the unique instance.
return self::$instance;
}
}
Si tratta di un modo migliore, perché è possibile utilizzare l'ereditarietà, le interfacce e il metodo sarà chiamato su un oggetto istanziato. Ciò significa che è possibile definire contratti e utilizzare low coupling con le classi che lo utilizzano. Tuttavia alcune persone considerano lo singleton as an anti pattern soprattutto perché se si desidera avere 3 istanze della classe con proprietà di input diverse non è possibile.
Servizio
Un servizio è un'istanza di una classe standard. È un modo per razionalizzare il tuo codice. Questo tipo di architettura è chiamato SOA (architettura orientata ai servizi). Vi faccio un esempio:
Se si desidera aggiungere un metodo per vendere un prodotto in un negozio a un consumatore e si hanno classi Product
, Store
e Consumer
. Dove dovresti istanziare questo metodo? Posso garantire che se pensi che sia più logico in una di queste tre classi oggi potrebbe essere qualsiasi altra cosa domani. Questo porta a molte duplicazioni e una difficoltà a trovare dov'è il codice che stai cercando. Invece, puoi usare una classe di servizio come ad esempio SaleHandler
che saprà come manipolare le tue classi di dati.
È consigliabile utilizzare un framework che aiuti a iniettarli gli uni negli altri (dependency injection) al fine di utilizzarli al massimo delle loro potenzialità. Nella comunità PHP, ad esempio, si ha un buon esempio di implementazione di questo in Symfony2.
Per riassumere:
Se non si dispone di un quadro, single sono certamente una buona opzione.
Se si dispone di un framework, utilizzare la sua funzione di iniezione delle dipendenze per eseguire questo tipo di operazioni.
Non utilizzare il metodo statico. Se hai bisogno di un metodo statico in una classe, questo significa che puoi creare un nuovo singleton/servizio contenente questo metodo e iniettarlo nell'istanza delle classi che ne hanno bisogno.
Quindi, invece di utilizzare una funzione che è nativa e semplice da usare, dovremmo usare singleton che è più complesso, prolisso e soggetto a errori ?. Non sono d'accordo. – magallanes