Skip to content

Instantly share code, notes, and snippets.

@okonomi
Created October 10, 2011 13:30
Show Gist options
  • Save okonomi/1275331 to your computer and use it in GitHub Desktop.
Save okonomi/1275331 to your computer and use it in GitHub Desktop.
<?php
class MyObject
{
public $_aaa = 'aaa';
protected $_bbb = 'bbb';
private $_ccc = 'ccc';
}
$obj = new MyObject();
echo 'protected: ', getNonpublicProperty($obj, '_bbb'), PHP_EOL;
echo 'private: ', getNonpublicProperty($obj, '_ccc'), PHP_EOL;
function getNonpublicProperty($obj, $property_name)
{
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
$ref = new ReflectionProperty(get_class($obj), $property_name);
$ref->setAccessible(true);
return $ref->getValue($obj);
} else {
$class = get_class($obj);
$temp_child_class = "temp" . str_replace("_", "", "$class");
if (!class_exists($temp_child_class)) {
$ref = new ReflectionClass($class);
$constructor = $ref->getConstructor();
$abstract_methods = "";
foreach($ref->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
$mname = $method->name;
$abstract_methods .= "public function $mname(){return false;}";
}
$class_def = "
class $temp_child_class extends $class{
$constructor
public function get_property(\$property_name)
{
return \$this->\$property_name;
}
$abstract_methods
}
";
eval($class_def);
}
$tcobj = new $temp_child_class;
return $tcobj->get_property($property_name);
}
}
<?php
class MyObject
{
public $_aaa = 'aaa';
protected $_bbb = 'bbb';
private $_ccc = 'ccc';
}
$obj = new MyObject();
echo 'protected: ', getNonpublicProperty($obj, '_bbb'), PHP_EOL;
echo 'private: ', getNonpublicProperty($obj, '_ccc'), PHP_EOL;
function getNonpublicProperty($obj, $property_name)
{
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
$ref = new ReflectionProperty(get_class($obj), $property_name);
$ref->setAccessible(true);
return $ref->getValue($obj);
} else {
$arr = (array)$obj;
$key = $property_name;
$ref = new ReflectionProperty(get_class($obj), $property_name);
if ($ref->isProtected()) {
$key = "\0*\0".$key;
} elseif ($ref->isPrivate()) {
$key = "\0".get_class($obj)."\0".$key;
}
return $arr[$key];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment