In particolare, vorrei creare una classe Array e vorrei sovraccaricare l'operatore [].È possibile sovraccaricare gli operatori in PHP?
risposta
Se si utilizza PHP5 (e si dovrebbe essere), dare un'occhiata alle classi SPL ArrayObject. La documentazione non è troppo buona, ma penso che se estendessi ArrayObject, avresti la tua matrice "finta".
EDIT: Ecco il mio rapido esempio; Tuttavia, temo di non avere un valido caso d'uso:
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo 'appending ' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;
Il concetto di PHP di sovraccarico e operatori (vedere Overloading e Array Operators) non è come il concetto di C++. Non credo sia possibile sovraccaricare operatori come +, -, [], ecc
Possibili soluzioni
- Implementare SPL ArrayObject (come detto da cbeer).
- Implementare Iterator (se
ArrayObject
è troppo lento per voi). - Utilizzare l'estensione PECL operator (come indicato da Benson).
Meglio l'Iterator è lo SPL ArrayObject, che ho collegato al di sotto. Fornisce l'intera gamma di funzionalità di array. – cbeer
In parole semplici, no; e suggerirei che se pensate di aver bisogno di un sovraccarico in stile C++, potrebbe essere necessario ripensare la soluzione al vostro problema. O forse considera di non usare PHP.
Per parafrasare Jamie Zawinski, "Hai un problema e pensa, 'Lo so! Userò l'overloading dell'operatore!' Ora hai due problemi. "
-1 la risposta è semplicemente errata, poiché è possibile sovraccaricare l'operatore []. Inoltre, è probabile che @Chad non stia cercando di risolvere un problema con l'overloading dell'operatore, ma mantenendo il suo codice pulito e conciso. – Josiah
Ecco perché ho detto "Metti semplicemente, no" piuttosto che "No". Non volevo spiegare che lo fai estendendo alcune classi in modi strani, perché 1) l'overloading dell'operatore è un'idea abbastanza cattiva anche quando la sintassi per farlo è pulita, e 2) la sintassi per farlo in PHP non è non pulito – dirtside
Hai bisogno di ripensare il mio design? Quindi, se voglio fare aritmetica complessa o aritmetica data estesa, devo usare le chiamate di funzione anziché gli operatori? Che schifo. –
In realtà, la soluzione ottimale è quella di implementare i quattro metodi dell'interfaccia ArrayAccess: http://php.net/manual/en/class.arrayaccess.php
Se volete anche di utilizzare l'oggetto nel contesto di 'foreach', che avrebbe dovuto attuare la interfaccia 'Iterator': http://www.php.net/manual/en/class.iterator.php
+1. Per implementare l'interfaccia ArrayAccess è l'UNICA risposta valida al problema dell'OP. Tutti gli altri sono non ottimali. – hijarian
per una soluzione semplice e pulita in PHP 5.0 +, è necessario implementa il ArrayAccess
interface e sovrascrivere le funzioni offsetGet, offsetSet, offsetExists e offsetUnset. Ora puoi usare l'oggetto come un array.
Esempio:
<?php
class A implements ArrayAccess {
private $data = array();
public function offsetGet($offset) {
return isset($this->data[$offset]) ? $this->data[$offset] : null;
}
public function offsetSet($offset, $value) {
if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->data[$offset]);
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
}
}
$obj = new A;
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
Questa è la migliore (la più accurata) risposta in merito alla domanda OP. Se vuoi semplicemente usare l'operatore '[]' sul tuo oggetto, l'implementazione dell'interfaccia 'ArrayAccess' è la strada da percorrere. –
- 1. È possibile sovraccaricare gli operatori in C?
- 2. Come sovraccaricare gli operatori Inc (Dec) in Delphi?
- 3. È ragionevole sovraccaricare gli operatori in base al qualificatore di riferimento per impedire i provvisori?
- 4. È possibile sovraccaricare/importare in Python?
- 5. Qual è il modo corretto per sovraccaricare gli operatori in classi base astratte?
- 6. Java - compareTo e gli operatori
- 7. è possibile sovraccaricare un metodo finale
- 8. Posso usare gli operatori come callback delle funzioni in PHP?
- 9. Possiamo sovraccaricare gli operatori per i tipi built-in come int o float?
- 10. sovraccarico + =, +, == e = gli operatori
- 11. E 'possibile sovraccaricare i mixin in sass?
- 12. sovraccaricare gli operatori quando si utilizza setOldClass non funziona come voluto rispetto a una classe S4
- 13. È possibile eseguire l'override degli operatori in Java?
- 14. È possibile sovraccaricare i multi-metodi Clojure su arity?
- 15. È possibile sovraccaricare legalmente una stringa letterale e const char *?
- 16. Qual è il modo giusto per sovraccaricare gli operatori di streaming << >> per la mia classe?
- 17. È possibile sovraccaricare il comportamento dell'oggetto di classe
- 18. Durante la formattazione di istruzioni multilinea in IntelliJ IDEA, è possibile allineare gli operatori?
- 19. Pig condizionali Gli operatori
- 20. possibile sovraccaricare la funzione nella classe MATLAB?
- 21. Perché è necessario utilizzare gli operatori di spostamento in java?
- 22. Sovraccarico dell'operatore di confronto in php
- 23. È disponibile una buona libreria PHP per analizzare gli operatori di ricerca booleana agli operatori fulltext MySQL?
- 24. Simula + = in Lua, è possibile?
- 25. Come funzionano gli operatori boost?
- 26. Gli operatori in linea sono buoni?
- 27. Gli operatori impliciti gestiscono null?
- 28. Cosa sono gli operatori sollevati?
- 29. più operatori tra gli operandi
- 30. XOR utilizzando gli operatori matematici
Non solo una risposta utile, ma la risposta giusta. Io uso sempre gli ArrayObjects, ed è un modo elegante non solo sostituire gli array, ma estendere l'intero modello-oggetto e far scattare a PHP un calcio serio. – AlexanderJohannesen
Non è una risposta utile o la risposta giusta. La domanda riguarda l'overloading dell'operatore, non se esiste o meno una libreria con un oggetto chiamato ArrayObject. – fijiaaron
-1 Utilizzare l'interfaccia ArrayAccess. Non estendere ArrayObject.Tu stai ereditando molte logiche di cui probabilmente non hai bisogno e inoltre l'estensione di ArrayObject è imprevedibile in molti aspetti, perché c'è così tanta magia coinvolta. – NikiC