Estoy consultando el ID de un campo accediendo a una función de clase que alguien ya ha establecido. El resultado es un objeto devuelto con variables miembro protegidas. Estoy luchando para ver cómo puedo acceder a los valores de las variables miembro fuera de la clase.Acceder a una variable de miembro protegida fuera de una clase
Respuesta
Solo agregue un método "get" a la clase.
class Foo
{
protected $bar = 'Hello World!';
public function getBar()
{
return $this->bar;
}
}
$baz = new Foo();
echo $baz->getBar();
Aparentemente ya teníamos uno en su lugar que me permitía usarlo fácilmente -> getId() y recuperar de las diversas clases. –
Tengo dificultades para ver cómo puedo acceder a los valores de las variables miembro fuera de la clase.
No puede: ese es todo el punto de protected
.
Debería tener extend
la clase con un método que recupera las variables por usted.
No puede hacer esto en un objeto instanciado, sin embargo, tendría que influir en la definición de clase o cambiar la clase del objeto en el punto en que se creó.
Si realmente necesita ese valor:
- modificar la clase y añadir un método público que devuelve el valor que desee.
- Si no puede modificarlo, considere ampliarlo y exponer el valor allí (será accesible, ya que está protegido). Prefiero la primera opción, esto es más de un truco.
Claramente, el diseñador de la clase no pensó que necesitaría el valor que está tratando de acceder, de lo contrario, habría agregado un método para recuperarlo. Por lo tanto, reconsidere lo que está haciendo.
DESCARGO DE RESPONSABILIDAD: No recuerdo cómo codificar. Ha sido un tiempo". Esto puede estar completamente apagado.
Bueno, antes que nada, si los miembros están protegidos, el diseñador original no tenía la intención de que accediera a ellos directamente. ¿Revisaste los métodos de acceso?
Si no hay ninguno, y está convencido de que realmente necesita estos miembros protegidos, puede ampliar el tipo con accesores, yeso y obtenerlos de esa manera. Al igual que (en C++ - código como)
class MyClass : public OldClass
{
public:
int getSomeValue() { return protectedValue; }
void setSomeValue(int value) { protectedValue=value; }
char* getOtherValue() { return otherProtectedValue; }
}
y luego usarlo
MyClass* blah = (MyClass*)TheirFactory->GiveMeAClass();
int yay=blah->getSomeValue();
Usted consigue la deriva. Espero que esto funcione para usted, Internet Explorer es un compilador pésimo, por lo que no he podido probarlo. }
Esto es muy bueno, pero el OP necesita una solución de PHP :) –
Bueno, supongo que PHP admite la herencia y el casting, y espero que sea capaz de entender el Código C++ suficiente para implementarlo en PHP :) – Tobias
El acceso a las variables privadas o protegidas del público es incorrecto (es por eso que están protegidas o son privadas). Así que es mejor extender la clase y acceder a la propiedad requerida o hacer un método getter para obtenerla públicamente. Pero si aún desea obtener propiedades sin extenderse y si está utilizando PHP 5, puede acceder con las clases . En realidad, prueba la clase ReflectionProperty.
class Foo { protected $bar; }
$foo = new Foo();
$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
+1 'ReflectionProperty' funcionó para mí. Pero no olvides llamar 'ReflectionProperty :: setAccessible (true)'. – Asaph
Esta es la respuesta correcta. Tenga en cuenta que el primer parámetro para ReflectionProperty debe ser una clase con espacio de nombres completo. –
Se puede acceder al miembro protegido de la clase fuera del lado de la clase, también sin extender la clase miembro protegido, también sin necesidad de utilizar cualquier función de la clase de miembro protegido. Use la función de abajo para acceder a ella.
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];
}
Por favor, visite el Link para verificar más detalles al respecto.
Aquí está la respuesta correcta:
Podemos usar bind() o los métodos bindto de clase de clausura para acceder a datos privados/protegidas de alguna clase, por ejemplo:
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!
¡Guau! Eso es hermoso. ¿Por qué esto no tiene más votos? – CenterOrbit
- 1. Acceder a una variable fuera de una instrucción 'if'
- 2. clases anidadas: El acceso a miembro protegido de la clase envolvente de una clase anidada protegida
- 3. ¿Hay alguna forma de que pueda acceder a la variable de miembro privado de una clase?
- 4. Encuadernación a una variable miembro
- 5. Acceder a una variable estática global de otra clase
- 6. ¿Debería acceder a una variable dentro de la misma clase a través de una propiedad?
- 7. Compartir una variable entre una clase y su miembro
- 8. ¿Por qué mi subclase no puede acceder a una variable protegida de su superclase, cuando está en un paquete diferente?
- 9. cómo acceder a una variable de clase de la clase externa de clase interna en rubí
- 10. Cómo acceder a una variable desde la clase interna
- 11. tienda una referencia a una variable miembro de objetos con una clase diferente
- 12. ¿Por qué no puedo acceder a un miembro protegido desde una instancia de una clase derivada?
- 13. ¿Cómo obtener anotaciones de una variable miembro?
- 14. accediendo a una variable de otra clase
- 15. ¿Cómo puedo acceder a un miembro estático público de una clase Java de ColdFusion?
- 16. Agregando una variable de instancia a una clase en Ruby
- 17. ¿Puede una clase externa acceder a los miembros de la clase interna?
- 18. Acceder a una variable local después de "eliminar esto"
- 19. POST a una URL protegida con contraseña?
- 20. acceder a un miembro protegido de una clase base en otra subclase
- 21. Accediendo a un miembro/método de una clase derivada virtual
- 22. cómo agregar una variable miembro y métodos a una clase integrada sin crear subclases
- 23. variable estática frente a miembro
- 24. Ruby no puede acceder a la variable fuera del método?
- 25. Llamar a una variable de otra clase
- 26. ¿Qué puedo hacer con una variable estática protegida/privada?
- 27. ¿Acceder a una propiedad estática de una clase genérica?
- 28. Cómo llamar al método __invoke de una variable miembro dentro de una clase
- 29. Cambie el valor de una variable protegida para la clase secundaria
- 30. ¿Agregar una variable/método miembro a un generador de Python?
Qué idioma ¿Está utilizando ?? –
Estoy usando php .... –