我有一类Foo
与公共和保护性能。 Foo
都需要有一个非静态方法, getPublicVars()
返回的所有公共属性的列表Foo
(这只是一个例子,我从外面知道Foo
对象调用get_object_vars()
将做到这一点,并没有必要我getPublicVars()
方法)。
注意:这也必须返回在运行时分配给未在类的定义中定义的类的实例(对象)动态声明的属性。
这里的例子:
class Foo{
private $bar = '123';
protect $boo = '456';
public $beer = 'yum';
//will return an array or comma seperated list
public function getPublicVars(){
// thar' be magic here...
}
}
$foo = new Foo();
$foo->tricky = 'dynamically added var';
$result = $foo->getPublicVars();
var_dump($result); // array or comma list with 'tricky' and 'beer'
什么是最简洁的方式从内部类的自己的方法,其中包括公共和保护的可见得到的唯一对象的公共属性?
我已经看了:
- 什么是看一个PHP类实例(对象)来查看所有可用的公共属性和方法内的最佳方式?
但是,这似乎并没有解决我的问题,因为它指向使用get_object_vars()
从对象之外。
正如你已经意识到,PHP在构建get_object_vars
是范围敏感。 你想只有公共对象属性。
因此,从功能到公共变种不是一个很大的一步:
function get_object_public_vars($object) {
return get_object_vars($object);
}
调用此get_object_public_vars
会给你只有公共属性则因为它是地方出了当前对象的范围。
如果您需要更细粒度的控制,你也可以使用的ReflectionObject
:
(new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC);
其中有,你并不需要在全局命名空间引入的另一功能的好处。
不与PHP版本工作> = 7
因此,我真的不能推荐解决方案的任何更长的时间。
使用反射,而不是
若要从类中获取的公共属性
$publicProperties = call_user_func('get_object_vars', $this);
“特技”是get_object_vars
正在从的范围称为call_user_func
而不是对象的范围
没有必要进行反思,单机功能,关闭等
根据这篇文章 (由万斯卢卡斯写的),你可以创建一个使用“ 匿名 ”功能,您的“富”类定义一个新的呼叫范围,然后你可以调用get_object_vars()
从内部。 这允许您从类中只得到公共属性,即使这些已创建动态后来从外面。
因此,适应你的例子那就是:
<?php
class Foo {
private $bar = '123';
protected $boo = '456';
public $beer = 'yum';
// return an array of public properties
public function getPublicVars(){
$publicVars = create_function('$obj', 'return get_object_vars($obj);');
return $publicVars($this);
}
}
$foo = new Foo();
$foo->tricky = 'dynamically added var';
$result = $foo->getPublicVars();
print_r($result);
和输出将是:
Array
(
[beer] => yum
[tricky] => dynamically added var
)
有上面提到的文章中第二个例子显示了另一种方式利用所谓的“倒闭潮”(从PHP 5.3),但由于某种原因,它不适合我用PHP V5.4工作,所以私人做同样的和保护性保持包括所得到的阵列英寸
文章来源: How to programmatically find public properties of a class from inside one of it's methods