Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过编程从类的内部查找类的公共属性';s方法_Php_Oop_Reflection - Fatal编程技术网

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);