2011-04-13 42 views

回答

18

get_class_vars()采取CLASS_NAME get_object_vars()需要一个$对象变量

它们的作用都类似:

get_class_vars()会暴露默认的公共变量(或私人/保护,如果调用的类内) get_object_vars()将暴露当前的公共变量(或私有/受保护,如果在类对象内调用)

都不会公开方法。

+2

所以一个是用于定义(类),另一个用于实例(对象)? – 2011-04-14 02:35:34

+2

完全正确 – ohmusama 2011-04-14 06:29:33

15

你可以从get_class_vars见和get_object_vars手册页,get_class_vars得到默认一个类的属性值,并且get_object_vars得到当前对象的属性值。

此外,get_class_vars需要一个字符串(即一个类的名称),而get_object_vars需要一个对象。

class Example 
{ 
    public $var = 123; 
} 

$e = new Example(); 
$e->var = 456; 

var_dump(get_class_vars("Example")); 
/* 
array(1) { 
    ["var"]=> 
    int(123) 
} 
*/ 

var_dump(get_object_vars($e)); 
/* 
array(1) { 
    ["var"]=> 
    int(456) 
} 
*/ 
3

即使世界一两件事:

get_object_vars()不看静态变量,但他认为在运行时创建瓦尔!
get_class_vars()看到静态的,但没有看到在运行时创建的新变量,例如。在构造函数中:

public function __construct() {$this->newval = "newval";} 
0

get_class_vars()给你甚至非静态变量,但它们的值在创建对象,如时间服用。初始值。

1

作为PHP 5.5.9的

我已经注意到,实际上有get_class_varsget_object_vars之间略有差别。

关于PHP Bug Report,我也自己测试过。

这两种方法都返回相同的结果。 但是,您可以通过使用get_object_vars而不是get_class_vars来操作对象属性。

考虑下面的示例,

class Foo 
{ 
    public $bar = null; 
    public function __construct() { 
    $this->bar = new DateTime(); // Now 
    $this->far = &$this->bar; 
    } 
} 
$foo = new Foo(); 
var_dump($foo); 
$vars = get_object_vars($foo); 
$vars['bar'] = new DateTime('2014-03-25'); 
var_dump($foo); 

在上面的示例中,您会发现,第二var_dump将 已经$foo->bar修改。

注:如果您尝试从get_object_vars方法更改为 get_class_vars,你还会发现,$foo->bar不会 修改。