Php 如何通过编程从类的内部查找类的公共属性';s方法
我有一个带有公共和受保护属性的类Php 如何通过编程从类的内部查找类的公共属性';s方法,php,oop,reflection,Php,Oop,Reflection,我有一个带有公共和受保护属性的类FooFoo需要一个非静态方法,getPublicVars(),该方法返回Foo的所有公共属性的列表(这只是一个示例,我从外部知道,Foo对象调用将完成此任务,并且不需要我的getPublicVars()方法) 注意:这还必须返回在运行时分配给类实例(对象)的动态声明属性,这些属性未在类的定义中定义 下面是一个例子: class Foo{ private $bar = '123'; protect $boo = '456'; public
Foo
Foo
需要一个非静态方法,getPublicVars()
,该方法返回Foo
的所有公共属性的列表(这只是一个示例,我从外部知道,Foo
对象调用将完成此任务,并且不需要我的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'
从类自己的方法中获取对象的公共属性(public和protected都可见)最简洁的方法是什么
我看过:
但这似乎没有解决我的问题,因为它指向从对象外部使用
get\u object\u vars()
。正如您已经意识到的,PHP的内置是范围敏感的。您只需要公共对象属性
因此,从该功能到公共变体并不是一个很大的步骤:
function get_object_public_vars($object) {
return get_object_vars($object);
}
调用此get\u object\u public\u vars
将只提供公共属性,因为它位于当前对象的范围之外
如果需要更细粒度的控制,还可以使用:
它的好处是您不需要在全局名称空间中引入另一个函数。根据(Vance Lucas编写),您可以使用“匿名”函数在“Foo”类定义内创建一个新的调用范围,然后可以从内部调用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);
不适用于php版本>=7
因此,我真的不能再推荐解决方案了。
改用反射
从类中获取公共属性的步骤
$publicProperties = call_user_func('get_object_vars', $this);
“技巧”是从call\u user\u func
的范围调用get\u object\u vars
,而不是从对象的范围调用
不需要反射、独立函数、闭包等也应注意,仅当函数是相关对象中的函数时,此功能才有效。。。根据以下主要示例:答案中的函数位于全局命名空间中,自然不属于同一个类,否则这将不起作用。全局函数的示例演示:以及ReflectionObject
:@hakre使用运行时添加的属性,这会起作用吗?请看我编辑的问题。@Ray,是的:&-尽管这真的很微不足道;)你会比编辑问题更快地测试它谢谢你,这是最好的答案,因为get\u object\u vars
将返回受保护的和私有的属性,如果在同一个类中使用,就像这里不适用于php版本>=7看起来这依赖于php 7中修复的错误。虽然在撰写本文时这是一个有效的答案,但使用它已不再是一个好主意-改用ReflectionObject
Array
(
[beer] => yum
[tricky] => dynamically added var
)
$publicProperties = call_user_func('get_object_vars', $this);