检查一堆空房的有效方法

时间:2014-01-10 17:40:37

标签: php oop

我有一个像

这样的示例
class foo{
  private $a = null; 
  private $b = null; 
  private $c = null; 
  private $d = null; 

 function a(){$a = ''; return $this; }
 function b(){$b = '0'; return $this; }
 function c(){$c = 'x';  return $this;  }
 function d(){$d = 'false';  return $this; }

 function z(){
    //I would like to only echo properties that are not null. 
    //and I am looking for better alternative than using if/else approach. 
  }
}

这就是我喜欢调用方法的方法。

$o = new foo(); 
$o->a()
  ->b()
  ->c()
  ->d()
  -z(); 

因此,现在方法z()应该回显非null的属性。由于我有很多属性,使用if / else会被证明是困难/冗长的。

4 个答案:

答案 0 :(得分:0)

在您的课程中,您可以使用get_object_vars()获取当前范围内的可用属性:

function z()
{
  foreach (get_object_vars($this) as $key => $value)
  {
    if (is_null($value))
    {

    }
    else
    {

    }
  }
}

答案 1 :(得分:0)

您可以对$this进行迭代,通过foreach ($this as $key=>$value)为您提供属性名称和值 - 您可以轻松使用empty()

请参阅this working example

public function echoAllProperties() {
    foreach ($this as $key=>$value) {
        if (!empty($value))
            echo $key." => ".$value."\n";
    }
}

答案 2 :(得分:0)

    $o = new foo();

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

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

答案 3 :(得分:0)

编辑:

您似乎正在使用自己对PHP对象属性的定义,所以让我告诉您。

PHP文档对于主题有点模糊,而像get_object_vars这样的函数有点误导,因为它们会获得对象属性而不是变量。

据我所知,它归结为:PHP区分 属性(在编译时已知)和 < em>动态属性(未经声明设置的那些)。

它与设置属性有关(因为它将创建一个动态属性),但重点是要知道属性是否在类定义中声明为这样。

如果您感兴趣的类属性和对象属性确实存在差异,那么您可能会发现使用ReflectionClass API感到高兴,但如果您问我,我会觉得使用它很尴尬。

此API的主要优点是您可以列出当前范围(通常是受保护或私有成员)无法访问的属性。
如果您只是使用get_object_varsget_class_vars函数,除非您在对象内部定义一个方法,否则您将错过所有私有/受保护的属性(继承一个调用get_class_vars的类将允许您获取受保护的属性,但不获取私有属性。)

function list_properties($obj, $filter = null)
{
    if ($filter === null) $filter = ReflectionProperty::IS_STATIC 
                                  | ReflectionProperty::IS_PUBLIC 
                                  | ReflectionProperty::IS_PROTECTED 
                                  | ReflectionProperty::IS_PRIVATE;

    $spy = new ReflectionClass ($obj);
    $class_properties = $spy->getProperties($filter);

    echo "class:<br />";
    foreach ($class_properties as $prop)
    {
        $name = $prop->getName();
        $p = $spy->getProperty ($name);
        $p->setAccessible(true);
        $value = $p->getValue($obj);
        echo "$name ("; var_dump($value); echo ")<br />";
    }
    echo "<br />object:<br />";
    foreach ($obj as $property => $value)
        { echo "$property ("; var_dump($value); echo ")<br />"; }
}

class foo {
    protected $class_protected; 
    private   $class_private; 
    public    $class_public; 
    private static $static_protected = "azerty";
    private static $static_private   = "qsdfgh";
    public  static $static_public    = "wxcvbn";
}


$v = new foo();
$v->dynamic = "xxx";
list_properties($v);

// the ReflectionClass filter flags semantic is broken,
// so filtering becomes soon a cruel pain in the *ss
/*
 * I leave it to the reader as an execrise to coax the bloody thing
 * into giving you only the static public class properties, for instance.
 */
list_properties($v, ReflectionProperty::IS_STATIC|ReflectionProperty::IS_PUBLIC);