valor obtener objetos objeto new metodos manejo example crear clases array php object protected php-5.2

objetos - Cómo obtener la propiedad protegida de un objeto en PHP



obtener valor de un objeto php (6)

Aquí está el ejemplo realmente simple (sin comprobación de errores) de cómo usar ReflectionClass :

function accessProtected($obj, $prop) { $reflection = new ReflectionClass($obj); $property = $reflection->getProperty($prop); $property->setAccessible(true); return $property->getValue($obj); }

Sé que dijiste que estabas limitado a 5.2, pero eso fue hace 2 años, 5.5 es la versión más antigua compatible y espero ayudar a las personas con versiones modernas.

Tengo un objeto que tiene una propiedad protegida que quiero obtener y configurar. El objeto se ve como

Fields_Form_Element_Location Object ( [helper] => formText [_allowEmpty:protected] => 1 [_autoInsertNotEmptyValidator:protected] => 1 [_belongsTo:protected] => [_description:protected] => [_disableLoadDefaultDecorators:protected] => [_errorMessages:protected] => Array ( ) [_errors:protected] => Array ( ) [_isErrorForced:protected] => [_label:protected] => Current City [_value:protected] => 93399 [class] => field_container field_19 option_1 parent_1 )

Quiero obtener propiedad de value del objeto. Cuando intento $obj->_value o $obj->value genera un error. Busqué y encontré la solución para usar PHP Reflection Class . Funcionó en mi servidor local, pero en el servidor la versión PHP es 5.2.17 Así que no puedo usar esta función allí. Entonces, ¿alguna solución para obtener esa propiedad?


El objeto puede escribirse en una matriz (asociativa) y los miembros protegidos tienen claves con el prefijo chr(0).''*''.chr(0) (ver el comentario de @ fardelian here ). Usando esta característica no documentada puede escribir un "exposer":

function getProtectedValue($obj,$name) { $array = (array)$obj; $prefix = chr(0).''*''.chr(0); return $array[$prefix.$name]; }

Alternativamente, puede analizar el valor de la cadena serialized , donde (al parecer) los miembros protegidos tienen el mismo prefijo (espero que php 5.2 no lo haya modificado).


Para eso está "protegido", como explica el capítulo de Visibility :

Se puede acceder a los miembros declarados protegidos solo dentro de la clase en sí y por las clases heredadas y principales.

Si necesita acceder a la propiedad desde afuera, elija una:

  • No declararlo como protegido, hacerlo público
  • Escribe un par de funciones para obtener y establecer el valor (getters y setters)

Si no desea modificar la clase original (porque es una biblioteca de terceros a la que no desea entrometerse), cree una clase personalizada que amplíe la original:

class MyFields_Form_Element_Location extends Fields_Form_Element_Location{ }

... y agrega tu getter / setter allí.


Si no puede modificar la clase original y ampliarla tampoco es una opción, puede usar la interfaz ReflectionProperty.

La biblioteca phptoolcase tiene un método útil para esto:

$value = PtcHandyMan::getProperty( $your_object , ‘propertyName’);

Propiedad estática de una clase singleton:

$value = PtcHandyMan::getProperty( ‘myCLassName’ , ‘propertyName’);

Puede encontrar la herramienta aquí: http://phptoolcase.com/guides/ptc-hm-guide.html


Si quieres jugar con una clase sin agregar getters y setters ...

PHP 7 agrega un método de llamada ($ obj) (más rápido que el antiguo bindTo) en los cierres, lo que le permite llamar a una función para que la variable $this actúe igual que dentro de una clase, con todos los permisos.

//test class with restricted properties class test{ protected $bar="protected bar"; private $foo="private foo"; public function printProperties(){ echo $this->bar."::".$this->foo; } } $testInstance=new test(); //we can change or read the restricted properties by doing this... $change=function(){ $this->bar="I changed bar"; $this->foo="I changed foo"; }; $change->call($testInstance); $testInstance->printProperties(); //outputs I changed bar::I changed foo in php 7.0


$propGetter = Closure::bind( function($prop){return $this->$prop;}, $element[''field_text''][''#object''], $element[''field_text''][''#object''] ); drupal_set_message(''count=''.count($propGetter(''hostEntity'')->field_captioned_carousel[''und'']));