关于PHP,有什么区别:
答案 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_vars
和get_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_vars
和get_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次函数。因此,这些函数的单次执行和首次执行性能确实更有趣,但要进行测试(准确)要困难得多。