Как получить общедоступные свойства класса?


Я не могу использовать просто get_class_vars(), потому что мне нужно, чтобы он работал с версией PHP более ранней, чем 5.0.3 (см. http://pl.php.net/get_class_vars Список изменений)

Альтернативный вариант: Как я могу проверить, является ли свойство общедоступным?

Author: MrWhite, 2010-01-07

3 answers

Это возможно с помощью отражения.

<?php

class Foo {
  public $alpha = 1;
  protected $beta = 2;
  private $gamma = 3;
}

$ref = new ReflectionClass('Foo');
print_r($ref->getProperties(ReflectionProperty::IS_PUBLIC));

Результат таков:

Array
(
    [0] => ReflectionProperty Object
        (
            [name] => alpha
            [class] => Foo
        )

)
 7
Author: Kamil Szot, 2010-01-07 15:47:13

Или вы можете сделать это:

$getPublicProperties = create_function('$object', 'return get_object_vars($object);');
var_dump($getPublicProperties($this));
 3
Author: ultra, 2014-11-27 21:59:11

Вы можете заставить свой класс реализовать интерфейс IteratorAggregate

class Test implements IteratorAggregate
{
    public    PublicVar01 = "Value01";
    public    PublicVar02 = "Value02";
    protected ProtectedVar;
    private   PrivateVar;

    public function getIterator()
    {
        return new ArrayIterator($this);
    }
}


$t = new Test()
foreach ($t as $key => $value)
{
    echo $key." = ".$value."<br>";
}

Это выведет:

PublicVar01 = Value01
PublicVar02 = Value02    
 1
Author: XLars, 2013-11-17 09:46:17