È consigliabile utilizzare l'overloading solo per motivi di denominazione di funzioni carini? :)
No. Voglio dire, dipende. :) Aggiungiamo un po 'di suggestione e di carineria alla nostra vita di programmazione:
$ordinary = new stdClass();
$ordinary->Caption = 'Hello';
class Awesome
{
private $ordinary;
public function __construct($ordinary) {
$this->ordinary = (array) $ordinary;
}
public function __get($name) {
$value = '';
return $this->ordinary[$name];
}
}
class Lovely extends Awesome
{
public function __get($name)
{
return '<3 ' . parent::__get($name) . ' <3';
}
}
devo ammettere, l'esempio potrebbe essere un po' sopra le righe, ma viene mostra qualcosa.
Prima di tutto, l'ipotesi è che l'API sia per una classe. Quindi inizia con un ordinario stdClass
.
Che l'esempio mostra quindi è che quelle funzioni magiche possono essere utilizzate per sovraccarico o decorare qualcosa. Può, ma non deve. Vedere l'API impressionante, è solo impressionante di per sé:
$awesome = new Awesome($ordinary);
echo $awesome->Caption, "\n"; # This caption is just awesome by itself!
# Hello
e poi vedere il più bel esempio API:
$lovely = new Lovely($ordinary);
echo $lovely->Caption, "\n"; # This caption is lovely, hughs and kisses everyone!
# <3 Hello <3
Quindi in questo esempio, è una buona idea per Lovely
ma è inutile per Awesome
, perché Awesome
in realtà è molto più facile da ottenere:
$awesome = $ordinary;
il che mi porta al punto, che il sovraccarico di un'API può onl essere utile fino a un punto specifico Come mostra Lovely
, può essere usato per decorare un altro oggetto (non molto specificato), ma mostra anche che questo è solo una volta: Lovely
ha già bisogno di sapere come chiamare Awesome
per utilizzare la sua funzionalità usando (ora non magia più) __get
metodo:
public function __get($name)
{
return '<3 ' . parent::__get($name) . ' <3';
}
Quando la società considera che Awesome
è la vostra API, si può vedere che esso stesso ha impedito di essere in grado di essere sovraccaricato facilmente dagli altri coderette che vuole fare uso di esso .
Quindi il sovraccarico può andare bene nel codice concreto e l'API non dovrebbe impedirlo. Ma quando l'API è sovraccaricata, le cose possono rivelarsi difficili.
Non solo per la codifica, l'aggiunta di dinamiche/magia rende le cose difficili anche per il debug. Quindi, meglio rimanere chiaro per le API che crei e fornire interfacce più specifiche quindi solo []
o ->
. È possibile dare alle cose nomi concreti e che funziona bene;)
Ed è molto più bella poi:
echo $store->getObject('product')->getPrice($currency);
Il sovraccarico di prestazioni in questo pezzo di codice non sembra che significativo. Ma in genere ho paura di usare molti metodi __call e __get (presumendo che lo userai per il resto del tuo software) – TFennis
Se l'intera API si basa su Metodi Magici l'impatto sulle prestazioni potrebbe essere significativo e c'è un molte persone che non amano il codice magico perché fa cose non ovvie. – Gordon