I have a object having some protected property that I want to get and set. The object looks like
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
)
I want to get value
property of the object. When I try $obj->_value
or $obj->value
it generates error. I searched and found the solution to use PHP Reflection Class
. It worked on my local but on server PHP version is 5.2.17
So I cannot use this function there. So any solution how to get such property?
Here's the really simple example (with no error checking) of how to use
ReflectionClass
:I know you said you were limited to 5.2, but that was 2 years ago, 5.5 is the oldest supported version and I'm hoping to help people with modern versions.
Object can be typecasted into (associative) array and the protected members have keys prefixed with
chr(0).'*'.chr(0)
(see @fardelian's comment here). Using this undocummented feature you can write an "exposer":Alternatively, you can parse the value from serialized string, where (it seems) protected members have the same prefix (I hope php 5.2 didn't change it).
That's what "protected" is meant for, as the Visibility chapter explains:
If you need to access the property from outside, pick one:
If you don't want to modify the original class (because it's a third-party library you don't want to mess) create a custom class that extends the original one:
... and add your getter/setter there.
If you cannot modify the original class and extending it is not an option either, you can use the ReflectionProperty interface.
The phptoolcase library has a handy method for this:
Static property from a singleton class:
You can find the tool here: http://phptoolcase.com/guides/ptc-hm-guide.html
If you want to tinker with a class without adding getters and setters....
PHP 7 adds a call($obj) method (faster than old bindTo) on closures allowing you to call a function so the
$this
variable will act just as it would within a class -with full permissions.