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
risposta
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();
Apparentemente ne avevamo già uno sul posto che mi permetteva di usare semplicemente -> getId() e recuperare dalle varie classi. –
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.
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.
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. }
Questo è molto bello, ma l'OP ha bisogno di una soluzione PHP :) –
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
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 'ReflectionProperty' ha funzionato per me. Ma non dimenticare di chiamare 'ReflectionProperty :: setAccessible (true)'. – Asaph
Questa è la risposta corretta. Si noti che il primo parametro di ReflectionProperty deve essere una classe con nomi completi. –
è 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.
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!
Wow! Questo è bello. Perché questo non ha più voti ?? – CenterOrbit
- 1. accesso a una variabile da un'altra classe
- 2. Accesso variabile globale dall'interno di una classe
- 3. Accesso alle variabili membro di una classe in Python?
- 4. Variabile membro membro della classe derivata accesso in funzione virtuale
- 5. classi nidificate: L'accesso a membro protetto della classe che racchiude da una classe protetta annidata
- 6. Restituisce riferimento a una variabile membro vettoriale
- 7. Java: impedisce l'override di una variabile membro
- 8. Accesso variabile ereditata dalla classe genitore template
- 9. Variabile di accesso da un'altra classe da una discussione
- 10. Assegnazione ad una variabile membro std :: shared_ptr
- 11. È possibile avere una variabile membro "auto"?
- 12. std :: bind() - utilizzo di una funzione membro protetto di base dalla funzione membro di una classe derivata
- 13. python: accesso a una variabile di istanza utilizzando un nome contenente una variabile
- 14. Accesso ai membri privati di una superclasse
- 15. Polymorphism: derivante da un membro protetto in una classe base?
- 16. L'inizializzazione della variabile membro C++ è protetta da thread?
- 17. Puntatore a un membro di dati privato di una classe
- 18. Memorizzazione di un metodo come una variabile membro di una classe in C#
- 19. Come si chiama una funzione attraverso una variabile membro?
- 20. Condivisione di una variabile tra una classe e il suo membro
- 21. Utilizzando un puntatore a funzione membro all'interno di una classe
- 22. Come dichiarare una variabile membro costante statica di una classe che comporta alcuni semplici calcoli?
- 23. C# nidificate Classe accesso Parent Membro
- 24. Accesso a una HashMap da una diversa classe
- 25. Devo annullare una variabile membro nel distruttore?
- 26. Accesso a una variabile locale dopo "Elimina questo"
- 27. dattiloscritto accesso membro della classe base
- 28. accesso a una mappa statica da una funzione membro statica - errore di segmentazione - C++
- 29. Aggiungi una variabile membro/metodo a un generatore Python?
- 30. Connessione a una presa Web protetta
Che lingua stai usando ?? –
Sto usando php .... –