2010-08-13 11 views
10

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

+0

Qué idioma ¿Está utilizando ?? –

+0

Estoy usando php .... –

Respuesta

11

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(); 
+0

Aparentemente ya teníamos uno en su lugar que me permitía usarlo fácilmente -> getId() y recuperar de las diversas clases. –

3

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ó.

0

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.

-2

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. }

+1

Esto es muy bueno, pero el OP necesita una solución de PHP :) –

+1

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

15

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

+1 'ReflectionProperty' funcionó para mí. Pero no olvides llamar 'ReflectionProperty :: setAccessible (true)'. – Asaph

+0

Esta es la respuesta correcta. Tenga en cuenta que el primer parámetro para ReflectionProperty debe ser una clase con espacio de nombres completo. –

2

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.

6

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! 
+2

¡Guau! Eso es hermoso. ¿Por qué esto no tiene más votos? – CenterOrbit

Cuestiones relacionadas