基本上我使用Code Igniter,Code Igniter基类很大,当我print_r我的一些对象时,他们有嵌入其中的基类。这使得获取我真正想要的信息(其余属性)变得很痛苦。
所以,我想知道是否有一种方法可以隐藏,或者删除基类对象?
我试过了
clone $object;
unset($object->ci);
print_r($object);
但当然ci属性是私有的。
我用于转储的实际功能是:
/**
* Outputs the given variables with formatting and location. Huge props
* out to Phil Sturgeon for this one (http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications).
* To use, pass in any number of variables as arguments.
* Optional pass in "true" as final argument to kill script after dump
*
* @return void
*/
function dump() {
list($callee) = debug_backtrace();
$arguments = func_get_args();
$total_arguments = count($arguments);
if (end($arguments) === true)
$total_arguments--;
echo '<fieldset style="background: #fefefe !important; border:2px red solid; padding:5px">';
echo '<legend style="background:lightgrey; padding:5px;">' . $callee['file'] . ' @ line: ' . $callee['line'] . '</legend><pre>';
$i = 0;
foreach ($arguments as $argument) {
//if the last argument is true we don't want to display it.
if ($i == ($total_arguments) && $argument === true)
break;
echo '<br/><strong>Debug #' . (++$i) . ' of ' . $total_arguments . '</strong>: ';
if ((is_array($argument) || is_object($argument)) && count($argument)) {
print_r($argument);
} else {
var_dump($argument);
}
}
echo '</pre>' . PHP_EOL;
echo '</fieldset>' . PHP_EOL;
//if the very last argument is "true" then die
if (end($arguments) === true)
die('Killing Script');
}
答案 0 :(得分:3)
这应该仅用于返回未知类的公共变量:
// Get the class of the object
$class_of_object= get_class($object);
// Get only public attributes (Note: if called from within class will return also private and protected)
$clone = get_class_vars($class_of_object);
// Try it
dump($clone);
这是非常hacky,但有效 - 从对象中删除私有属性(这不会保留对象名称),当然另一个缺点是你需要硬编码属性名称:
// First cast clone to array
$b = (array) clone($a);
// Then unset value (There will be null bytes around A and to use them you need to run it in double quotes
// Replace A for * to remove protected properties
unset($b["\0A\0_ci"]);
// Finally back to object
$b = (object) $b;
// Test it
dump($b);
答案 1 :(得分:1)
您可以使用PHP Reflextion API轻松完成
$myClassName = 'myChildClass';
$reflection = new ReflectionClass($myClassName);
// get properties, only public in this case
$properties = $reflection->getProperties(ReflectionMethod::IS_PUBLIC);
//Print all properties (including parent class)
print_r($properties);
//Print properties of desired class only
foreach ($properties as $property) {
if ($property->class == $myClassName) {
print_r($property);
}
}
方法也一样。
如果您真的需要它 - 您可以创建特殊功能来为您完成这项工作,并在需要此类分析时调用它。但我认为在大多数情况下,好的IDE,比如我最喜欢的PHPStorm,可能会为你做这个工作,当你调用类实例时 - 只显示建议列表中的公共方法。
答案 2 :(得分:0)
我有一个对我来说很好的简单方法:
<?php print_r(json_decode(json_encode($object))); ?>