2010-02-12 7 views
5

Sto lavorando su una vecchia app in cui vi è molta incoerenza nelle convenzioni di denominazione utilizzate.PHP: accede alle proprietà dell'oggetto senza distinzione tra maiuscole e minuscole?

Esiste un modo per accedere alle proprietà dell'oggetto che ignora la distinzione tra maiuscole e minuscole?

Ad esempio, ho un oggetto chiamato currentuser con l'attributo Nome.

C'è un modo per recuperare tale valore come questo?

$currentuser->name 

Qualsiasi consiglio apprezzato.

Grazie.

+1

* Vecchio * significa PHP4? – Gordon

+0

In parte. C'è anche molta inconsistenza nei nomi dei campi del database, che complica ulteriormente le cose. – Dan

risposta

3

Bene, è possibile scrivere una funzione __get per ciascuna delle classi che gestirà tale conversione, ma è abbastanza hacky. Qualcosa di simile potrebbe funzionare:

class HasInconsistentNaming { 

    var $fooBar = 1; 
    var $Somethingelse = 2; 

    function __get($var) { 
     $vars = get_class_vars(get_class($this)); 
     foreach($vars as $key => $value) { 
      if(strtolower($var) == strtolower($key)) { 
       return $this->$key; 
       break; 
      } 
     } 
     return null; 
    } 
} 

Ora, si può fare questo:

$newclass = new HasInconsistentNaming(); 

echo $newclass->foobar; // outputs 1 

Se si vuole semplificare il vostro compito un po 'si possono avere i vostri classi di base che ereditano da una classe che fornisce questa funzionalità . In questo modo non c'è bisogno di scrivere la funzione a ciascuno dei vostri classi:

class CaseInsensitiveGetter { 
    function __get($var) { 
     $vars = get_class_vars(get_class($this)); 
     foreach($vars as $key => $value) { 
      if(strtolower($var) == strtolower($key)) { 
       return $this->$key; 
       break; 
      } 
     } 
     return null; 
    } 
} 

class HasInconsistentNaming extends CaseInsensitiveGetter { 
    var $fooBar = 1; 
    var $Somethingelse = 2; 
} 

Ma vorrei caldamente di scoraggiare da questo approccio. A lungo termine, sarebbe molto più intelligente convertire semplicemente tutte le variabili in uno schema di denominazione coerente.

+0

+1 come volevo suggerire lo stesso. Mi hai battuto sul tempo. Avrei dovuto lanciare un'eccezione anche se la proprietà non è stata trovata affatto. – Gordon

+0

Grazie, preferirei non doverlo fare, ma non ho molta scelta a breve termine almeno. – Dan

3

Se non si ha il controllo sull'oggetto (potrebbe trattarsi di una riga da un database esterno), è consigliabile trovare i nomi corretti prima di accedere alle righe. La funzione seguente non è un'operazione a buon mercato, ma fatta solo la prima volta, può rendere la tua applicazione più stabile.

function findPropertyNameCaseInsensitive($obj, $name) 
{ 
    $propertyNames = array_keys(get_object_vars($obj)); 
    foreach($propertyNames as $propertyName) 
    { 
    if (strcasecmp($name, $propertyName) == 0) 
     return $propertyName; 
    } 
    return NULL; 
} 
0

So che questo è un vecchio post, ma ho pensato di buttare un'altra soluzione là fuori. Inizialmente ho provato l'approccio get_class_vars, ma ho deciso di trasmettere su un e quindi utilizzare array_change_key_case per convertire le chiavi in ​​minuscolo. A questo punto potresti lavorare con l'array o riconvertire in un oggetto. Non ho fatto alcun punto di riferimento, ma mi occupo di piccoli oggetti.

function convertPropNamesLower($obj) { 
    return (object)array_change_key_case((array)$obj, CASE_LOWER); 
} 

//usage 
$myObj = convertPropNamesLower($myObj); 
echo $myobj -> myprop; 
Problemi correlati