只通过现有的对象属性进行迭代,而不是从父类进行迭代?

时间:2010-04-12 06:36:33

标签: php oop

我有一个扩展另一个的课程。

当我迭代当前对象时,我获得所有属性,甚至是来自超类的属性。

我只想迭代当前对象。我怎么能这样做?

foreach($this as $key => $value) {
    echo $key . ': ' . $value;
}

3 个答案:

答案 0 :(得分:1)

非常有趣的问题。

我强烈建议你阅读这里的例子 - http://dsl093-056-122.blt1.dsl.speakeasy.net/edu/oreilly/Oreilly_Web_Programming_bookshelf/webprog/php/ch06_05.htm他们会让你更深入地了解内省。有关这些方法的参考资料是http://www.php.net/manual/en/ref.classobj.php


这是带有测试用例的函数。它只能在PHP 5+中使用,因为它使用之前不可用的Reflection。您可以在此处阅读有关反思的更多信息 - http://www.php.net/manual/en/class.reflectionclass.php

<?php

echo '<pre>';

class A {
    public $pub_a = 'public a';
    private $priv_a = 'private a';
}

class B extends A {
    public $pub_b = 'public b';
    private $priv_b = 'private b';
}

$b = new B();

print_r(getChildrenProperties($b));

function getChildrenProperties($object) {
    $reflection = new ReflectionClass(get_class($object));
    $properties = array();

    foreach ($reflection->getProperties() as $k=>$v) {
        if ($v->class == get_class($object)) {
            $properties[] = $v;
        }
    }

    return $properties;
}

答案 1 :(得分:1)

您也可以尝试使用PHP Reflection http://php.net/manual/en/book.reflection.php

我猜你可以用@Ivo Sabev回答:

 $properties = get_class_vars(ChildClass);
 $bproperties = get_class_vars(ParentClass);

现在遍历$ bproperties中没有出现的所有$属性。

答案 2 :(得分:0)

get_class_vars手册页包含在用户评论部分(最上面)中执行此操作的示例。

http://us.php.net/manual/en/function.get-class-vars.php