PHP:get_class_vars()与get_object_vars()

时间:2011-04-13 15:34:18

标签: php

关于PHP,有什么区别:

  1. get_class_vars()
  2. get_object_vars()

6 个答案:

答案 0 :(得分:19)

get_class_vars()获取class_name get_object_vars()采用$ object变量

它们的功能相似:

get_class_vars()将公开默认的公共变量(如果在类中调用,则为private / protected) get_object_vars()将公开当前的公共变量(如果在类对象中调用,则为private / protected)

两者都不会公开方法。

答案 1 :(得分:15)

正如您从get_class_varsget_object_vars手册页中看到的那样,get_class_vars获取了类属性的默认值,{{1}获取对象属性的当前值。

此外,get_object_vars采用字符串(即类的名称),而get_class_vars采用对象。

get_object_vars

答案 2 :(得分:4)

还有一件事:

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

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

答案 3 :(得分: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不会   修改。

答案 4 :(得分:0)

get_class_vars()为您提供甚至非静态变量,但它们的值是在创建对象时获取的,例如。初始值。

答案 5 :(得分:0)

我进行了这个非常的不科学(可能很容易出错)性能测试:

我上过这个课:

class foo {
    public $bar;
    public $baz = "abcd";
    public $qux = 123;
    public $quux;
    public $quuz = "abcd";
    public $corge = 1234;
}

并测试了1(get_object_vars):

$start = microtime(true);
for($i = 1; $i >= 100000; $i++)  {
    $foo = new foo;
    $gov = get_object_vars($foo);
}
$end = microtime(ture);

echo $end - $start;

然后测试2(get_class_vars-替换for循环的内部):

$gcv = get_class_vars("foo");

然后测试3(get_class_vars,并假设仍然需要实例化该对象-再次替换for循环):

$foo = new foo();
$gcv = get_class_vars("foo");

我每次跑5次,这些是我得到的结果:

测试1:
0.00014019012451172
0.00014519691467285
0.00014495849609375
0.00012087821960449
0.00012421607971191
平均值:0.0001350879669

测试2:
0.00013995170593262
0.00012898445129395
0.00010204315185547
0.00013494491577148
0.00061392784118652
平均值:0.0002239704132
(如果我们除去异常值):0.0001264810562

测试3:
0.00014710426330566
0.00012397766113281
0.00012612342834473
0.00011992454528809
0.00014090538024902
平均值:0.0001316070557

在测试二中,第5轮出现了一个怪异的异常值...不确定为什么...在我的服务器上打h。如果我们删除该异常值,则无论您是否需要实例化该类,get_class_vars()的性能似乎都会更高。

此测试未考虑可能正在进行的任何变量缓存或php内存优化。当然,在现实世界的应用程序中,您几乎不可能一次迭代10k次函数。因此,这些函数的单次执行和首次执行性能确实更有趣,但要进行测试(准确)要困难得多。