7

基本的に私はCodeIgniterを使用していますが、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');
}
4

3 に答える 3

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);

そして、これはかなりハッキーですが、機能します-オブジェクトからプライベートプロパティを削除します(これはオブジェクト名を保持しません)そしてもちろん別の欠点は、プロパティ名をハードコーディングする必要があることです:

// 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);
于 2012-11-21T03:58:42.707 に答える
1

PHPReflextionAPIを使用して簡単に行うことができます

$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);
    }
}

メソッドについても同じです。

本当に必要な場合は、この作業を行うための特別な関数を作成し、そのような分析が必要なときに呼び出すことができます。しかし、ほとんどの場合、私のお気に入りのPHPStormのような優れたIDEがこの仕事をしてくれると思います。クラスインスタンスを呼び出すと、提案リストにパブリックメソッドのみが表示されます。

于 2013-04-10T05:51:15.727 に答える
1

私にはうまくいく簡単な方法があります:

<?php print_r(json_decode(json_encode($object))); ?>
于 2017-11-03T15:20:40.850 に答える