2013-03-29 5 views
2

그 클래스 내에서 또는없이 클래스의 모든 필드를 통해 foreach를 수행하는 방법은 무엇입니까?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; 
    } 

} 

가 어떻게 showAll() 방법에 foreach()$a, $b, $c$d 속성을 참조 수 있습니다 예를 들어, 다음과 같은 클래스를 제공?

그 문제 때문에 수업 외부의 모든 공개 속성을 가져올 수 있습니까?

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

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

'ShowAll 관련()'반환 '$ this' (달러 기호가 빠짐)로 오타를 수정하면 모든 속성이 적용됩니다. 질문은 약간 불분명하다. – Jon

+0

클래스에 정적 속성이 없으므로 기술적으로 클래스에는 값이 없습니다. 객체 속성을 의미합니까? 이것은 반사와 함께 작동합니다. –

+0

감사합니다. 볼프강, 객체 속성을 의미했습니다. 정적 멤버가 포함되어야합니다. – dotancohen

답변

1

사용 반사 클래스 : Class Reflectionclass Manual (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); 

?> 
+1

Alireza 고맙습니다. 나는'get_object_vars' 답변 중 하나를 받아 들일 의향이 있었지만, 당신이 정말로 Reflection을 통해 이슈의 핵심을 다뤘다는 것을 알았습니다. – dotancohen

+1

그래서 가장 복잡한 솔루션을 찾고 있었습니까? ;) – migg

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"; 
} 
?> 

더 많은 정보를 위해 당신이 get_object_vars을 사용할 수 있습니다 PHP4 기준으로 단지 PHP

3

을 확인 객체의 공개 속성을 반복합니다. you can으로 반복 직접 객체를 통해 PHP5의로

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

:

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

그리고 [foreach]를 통해 어떻게 다른가? (http://php.net/manual/en/language.oop5.iterations.php)? – Jon

+0

@ 존,'get_object_vars'는 PHP4 와도 호환됩니다. 나는 그것을 포함시켰다. 감사. – Shoe

+0

Ι 어디서나 PHP4에 대한 언급이 보이지 않습니다. 또한 PHP5가 출시 된 이래로 * 9 년 *이 다가오고 있습니다. – Jon

1

아마 당신은 당신이 또한 PHP5의로 반복에 대해 간단한 객체를 사용할 수 있습니다 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"; 
} 

찾고 있습니다. 또한

$foo = new Foo($params); 

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

보는 모든 공용 속성을 반복 할 것입니다 http://php.net/manual/en/language.oop5.iterations.php

+0

'foreach' [직접 객체에]에 문제가 있습니까? (http://php.net/manual/en/language.oop5.iterations.php)? – Jon

+0

@ 존 OOPS .. 단지 몇 초 늦었 어. 나는 같은 대답을 편집했다 ..... – alwaysLearn

1

당신을 가진, get_object_vars를 사용하여 속성 공공 목적을 반복 할 수 있지만 이것이 잘못된 설계 일 수 있으며 구현을 다시 생각할 이유가 될 수 있습니다. 당신이 객체의 속성으로하고 싶은 일은 아마도 프로그래밍 방식으로 클래스/객체 자체에 속할 것입니다.

2

객체 외부에서, 그리고 문서화되지 않은 행동이나 구현 세부 사항에 의존하지 않고, 민간 포함한 모든 속성과 그 값을 얻을 수있는 유일한 방법은, Reflection입니다 :

$ref=new ReflectionObject($object); 
foreach ($ref->getProperties() as $prop) 
{ 
    $prop->setAccessible(true); 
    $name=$prop->getName(); 
    $value=$prop->getValue($object); 
}