我有一个像
这样的示例类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会被证明是困难/冗长的。
答案 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()
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_vars
或get_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);