3

このスレッドは私を助けませんでした。

使用する場合

$class_vars = get_class_vars(get_class($this));

foreach ($class_vars as $name => $value) {
    echo "$name : $value\n";
}

私は得る

attrib1_name:attrib2_name:attrib3_name

値はありません。また、私が望まないプライベート属性も表示されます。

使用する場合

echo "<pre>";
print_r(get_object_vars($this));
echo "</pre>";

私は得る

配列([atrrib1_name] => attrib1_value [attrib2_name] => attrib2_value)

ここでも、プライベート属性とすべてのサブ属性があります。しかし、今回は価値があります。これを1つのレベルに制限するにはどうすればよいですか?

すべてのパブリック属性をオブジェクトの値とともに表示する可能性はありませんか?

4

5 に答える 5

5

現在のスコープに従ってget_class_vars機能するため、非公開のプロパティが表示されます。コードを使用しているので、クラスにあるため、非公開プロパティには現在のスコープからアクセスできます。同じことが当てはまりますが、ここではおそらくより良い選択です。$thisget_object_vars

いずれにせよ、良い解決策は、プロパティ値を取得するコードをクラスから移動することです。

そのための無料の関数を作成したくない場合(なぜ?真剣に再考してください!)、無名関数を含むトリックを使用できます。

$getter = function($obj) { return get_object_vars($obj); };
$class_vars = $getter($this);

実際の動作をご覧ください

更新: PHP <5.3.0を使用しているため、次の同等のコードを使用できます。

$getter = create_function('$obj', 'return get_object_vars($obj);');
$class_vars = $getter($this);
于 2012-04-04T10:12:37.523 に答える
2

これは、 phpReflectionapiを使用して簡単に行うことができます

于 2012-04-04T10:10:05.863 に答える
0

Mr.Coderの答えを拡張して、オブジェクトのパブリック属性(名前と値)を配列としてフェッチするためのスニペットを次に示します。

public function getPublicProperties()
{
    $results = [];

    $reflectionObject = (new ReflectionObject($this));
    $properties = $reflectionObject->getProperties(ReflectionProperty::IS_PUBLIC);

    foreach ($properties as $property) {
        $results[$property->getName()] = $property->getValue($this);
    }

    return $results;
}
于 2021-04-26T12:57:16.823 に答える
-1

get_object_varsを使用します。参照:http ://dk.php.net/manual/en/function.get-object-vars.php

于 2012-04-04T10:10:50.940 に答える
-1

私はあなたが達成しようとしていることを完全に認識しているので、このような外部の何かを助けてみませんか...(PHPFiddleから貼り付けられました)

<?php

final class utils {
    public static function getProperties(& $what) {
        return get_object_vars($what);
    }
}
class ball {
    var $name;
    private $x, $y;

    function __construct($name,$x,$y) {

    }

    function publicPropsToArray() {
        return utils::getProperties($this);
    }
    function allPropsToArray() {
        return get_object_vars($this);
    }
}

$ball1 = new ball('henry',5,6);
//$ball2 = new ball('henry',3,4);

echo "<pre>";
print_r($ball1->publicPropsToArray());
echo "\r\n\r\n";
print_r($ball1->allPropsToArray());

echo "\r\n\r\n";

?>

このようにして、オブジェクトのすべてのプロパティにアクセスすることも、データベースアクセス層などにアクセスすることも、同様に「安全な」データをビューまたは別の非特権モデルに送信する関数にアクセスすることもできますが、パブリックプロパティのみを送信できます。オブジェクト内で定義された動作。

確かにこれはユーティリティクラスとの結合につながりますが、公平を期すために、すべての結合が悪いわけではありません。最終目標を達成するために必要なものもあります。

于 2013-09-20T15:45:54.333 に答える