2010-08-13 27 views
10

Sto interrogando l'ID di un campo accedendo a una funzione di classe che qualcuno ha già messo in atto. Il risultato è un oggetto restituito con variabili membro protette. Sto facendo fatica a vedere come posso accedere ai valori delle variabili membro al di fuori della classe.Accesso a una variabile membro protetta all'esterno di una classe

+0

Che lingua stai usando ?? –

+0

Sto usando php .... –

risposta

11

Basta aggiungere un metodo "get" alla classe.

class Foo 
{ 
    protected $bar = 'Hello World!'; 

    public function getBar() 
    { 
     return $this->bar; 
    } 
} 

$baz = new Foo(); 

echo $baz->getBar(); 
+0

Apparentemente ne avevamo già uno sul posto che mi permetteva di usare semplicemente -> getId() e recuperare dalle varie classi. –

3

Non riesco a vedere come posso accedere ai valori delle variabili membro all'esterno della classe.

Non è possibile: è l'intero punto di protected.

Si dovrebbe extend la classe con un metodo che recupera le variabili per te.

Non è possibile eseguire questa operazione su un oggetto istanziato, tuttavia, è necessario influenzare la definizione della classe o modificare la classe dell'oggetto nel punto in cui è stata creata.

0

Se si ha realmente bisogno di tale valore:

  • modificare la classe e aggiungere un metodo pubblico che restituisce il valore che si desidera.
  • Se non è possibile modificarlo, prendere in considerazione l'estensione e l'esposizione del valore lì (sarà accessibile, poiché è protetto). Preferisci la prima opzione, questo è più di un hack.

Chiaramente, il progettista della classe non pensava che avresti avuto bisogno del valore che stai cercando di accedere, altrimenti avrebbe aggiunto un metodo per recuperarlo da solo. Pertanto, riconsidera cosa stai facendo.

-2

DISCLAIMER: Non ricordo come codificare. È passato un po 'di tempo". Questo potrebbe essere completamente spento.

Bene, prima di tutto, se i membri sono protetti, il progettista originale non ha intenzione di accedervi direttamente. Hai controllato i metodi di accesso?

Se non ce ne sono, e si è convinti di aver davvero bisogno di questi membri protetti, è possibile estendere il tipo con gli accessor, eseguire il cast e ottenerli in questo modo. Mi piace (in C++ - codice simile)

class MyClass : public OldClass 
{ 
public: 
int getSomeValue() { return protectedValue; } 
void setSomeValue(int value) { protectedValue=value; } 
char* getOtherValue() { return otherProtectedValue; } 
} 

e poi usarlo

MyClass* blah = (MyClass*)TheirFactory->GiveMeAClass(); 
int yay=blah->getSomeValue(); 

si ottiene la deriva. Spero che questo funzioni per te, Internet Explorer è un compilatore scadente, quindi non sono stato in grado di testarlo. }

+1

Questo è molto bello, ma l'OP ha bisogno di una soluzione PHP :) –

+1

Beh, supporrò che PHP supporti l'ereditarietà e il casting, e spero che sarà in grado di capire il Codice C++ sufficiente per implementarlo in PHP :) – Tobias

15

L'accesso a variabili private o protette dal pubblico non è corretto (questo è il motivo per cui sono protette o private). Quindi è meglio estendere la classe e accedere alla proprietà richiesta o creare un metodo getter per renderlo pubblicamente disponibile. Ma se vuoi ancora ottenere proprietà senza estensione e se stai usando PHP 5, puoi accedere alle classi . In realtà prova la classe ReflectionProperty.

class Foo { protected $bar; } 
$foo = new Foo(); 

$rp = new ReflectionProperty('Foo', 'bar'); 
$rp->setAccessible(true); 
echo $rp->getValue($foo); 
+1

+1 'ReflectionProperty' ha funzionato per me. Ma non dimenticare di chiamare 'ReflectionProperty :: setAccessible (true)'. – Asaph

+0

Questa è la risposta corretta. Si noti che il primo parametro di ReflectionProperty deve essere una classe con nomi completi. –

2

è possibile accedere al membro protetto della classe fuori dal lato della classe, anche senza estendere classe membro protetto, anche senza l'utilizzo di alcuna funzione di classe membro protetto. Usa la funzione qui sotto per accedervi.

function getProtectedMember($class_object,$protected_member) { 
    $array = (array)$class_object;  //Object typecast into (associative) array 
    $prefix = chr(0).’*’.chr(0);   //Prefix which is prefixed to protected member 
    return $array[$prefix.$protected_member]; 
} 

Si prega di visitare il Link per controllare maggiori dettagli su di esso.

6

Ecco la risposta corretta:

Possiamo usare bind() o metodi bindTo di classe chiusura di accedere ai dati privati ​​/ protetti di una classe, per esempio:

class MyClass { 
      protected $variable = 'I am protected variable!'; 
} 

$closure = function() { 
      return $this->variable; 
}; 

$result = Closure::bind($closure, new MyClass(), 'MyClass'); 
echo $result(); // I am protected variable! 
+2

Wow! Questo è bello. Perché questo non ha più voti ?? – CenterOrbit

Problemi correlati