3

クラス内またはクラス外から、クラスのすべてのフィールドに対して foreach を実行するにはどうすればよいでしょうか。たとえば、次のクラスがあるとします。

class Foo
{
    public $a;
    public $b;
    private $c;
    private $d;

    public function __construct($params)
    {
        foreach($params as $k=>$v){
            $this->$k = $v;
        }
    }

    public function showAll()
    {
        $output = array();
        foreach (this as $k=>$v) {    // How to refer to all the class properties?
            $output[$k] = $v;
        }
        return $output;
    }

}

foreach()メソッド内の は、 、、、およびプロパティをどのようにshowAll()参照しますか?$a$b$c$d

さらに言えば、クラスの外部からすべてのパブリック プロパティを取得できますか?

$params = array();
$foo = new Foo($params);

foreach ($foo->allProperties as $f=>$v) {    // how to do this?
    echo "{$f}: {$v}\n";
}
4

6 に答える 6

5

PHP4 ではget_object_vars、オブジェクトのパブリック プロパティを反復処理するために使用できます。

foreach (get_object_vars($foo) as $f => $v) {
    echo "{$f}: {$v}\n";
}

PHP5 以降では、オブジェクトを直接反復処理できます。

foreach ($foo as $f => $v) {
    echo "{$f}: {$v}\n";
}
于 2013-03-29T09:14:19.363 に答える
4

Reflection クラスを使用する: Class Reflectionclass マニュアル( PHP 5 )

<?php
class Foo {
   public    $foo  = 1;
   protected $bar  = 2;
   private   $baz  = 3;
}

$foo = new Foo();

$reflect = new ReflectionClass($foo);
$props   = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);

foreach ($props as $prop) {
   print $prop->getName() . "\n";
}

var_dump($props);

?>
于 2013-03-29T09:16:35.353 に答える
2

すべてのプロパティとその値 (プライベートなものを含む) をオブジェクトの外部から取得する唯一の方法は、文書化されていない動作や実装の詳細に依存することなく、Reflectionです。

$ref=new ReflectionObject($object);
foreach ($ref->getProperties() as $prop)
{
    $prop->setAccessible(true);
    $name=$prop->getName();
    $value=$prop->getValue($object);
}
于 2013-03-29T09:50:15.780 に答える
2

おそらくget_object_vars()を探しているでしょう

$params = array();
$foo = new Foo($params);

foreach (get_object_vars($foo) as $f=>$v) {    // how to do this?
echo "{$f}: {$v}\n";
}

php5 以降、単純なオブジェクトを繰り返しに使用することもできます。また、すべてのパブリック プロパティを反復処理します。

$foo = new Foo($params);

foreach($class as $key => $value) {
print "$key => $value\n";
}

http://php.net/manual/en/language.oop5.iterations.phpを参照してください。

于 2013-03-29T09:15:48.570 に答える
1

get_class_varsを使用できます— クラスのデフォルト プロパティを取得します。以下のように実行できます。

<?php
class myclass {
    var $var1; // this has no default value...
    var $var2 = "xyz";
    var $var3 = 100;
    private $var4; // PHP 5    
    // constructor
    function myclass() {
        // change some properties
        $this->var1 = "foo";
        $this->var2 = "bar";
        return true;
    }
}
$my_class = new myclass();
$class_vars = get_class_vars(get_class($my_class));
foreach ($class_vars as $name => $value) {
    echo "$name : $value\n";
}
?>

詳細については、PHPを確認してください

于 2013-03-29T09:12:20.617 に答える
1

get_object_varsを使用してパブリック オブジェクト属性を反復処理することはできますが、これを行わなければならないことは、設計が不適切であり、実装を再考する理由になる可能性があります。オブジェクトの属性でやりたいことは、おそらくプログラムでクラス/オブジェクト自体に属します。

于 2013-03-29T09:22:20.650 に答える