PHP的stdClass类
stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。stdClass是PHP的一个基类,所有的类几乎都继承这个 类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,就是没有方法。凡是用new stdClass()的变量,都不可能会出现$a->foo()这种方式的使用。
PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型 的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。
来看看如何使用,先给个简单的示例,
<?php $user = new stdClass(); $user->name = 'roy'; $user->email = 'roy@solarphp.cn'; $user->sex = 'Male'; // 可以使用foreach遍历 foreach ($user as $_u) { echo $_u."\n"; } // 如果要获取当前有多少属性,需要强制转成数组 echo count((array)$user)."\n"; // 当然也可以通过get_object_vars获取对象所有属性 // echo count(get_object_vars($user));
结果如下:
---------- Debug PHP 5.3.1 ---------- roy roy@solarphp.cn Male 3 Output completed (0 sec consumed) - Normal Termination
那么这个stdClass有什么具体应用么?呵呵,讲到正题了,当然有,把数组转为对象就是它的一个典型应用,直接看代码吧:
<?php class Array_Tools { public static function toObject($array) { if(!is_array($array)) { return $array; } $object = new stdClass(); if (is_array($array) && count($array) > 0) { foreach ($array as $_name => $_value) { $name = strtolower(trim($_name)); if (!empty($_name)) { $object->$_name = self::toObject($_value); } } return $object; } else { return FALSE; } } } $arr = array('foo' => array('a' => 'aFoo', 'b' =>'bFoo'), 'bar' => array('a'=> 'aBar', 'b'=>'bBar'), 'solar' => 'php', ); $obj = Array_Tools::toObject($arr); echo $obj->foo->b; echo "\n"; echo $obj->solar;
结果如下:
---------- Debug PHP 5.3.1 ---------- bFoo php Output completed (0 sec consumed) - Normal Termination
toObject方法递归地处理了多维数组,所以可以使用$obj->foo->b这种方式来获取值。
那么如果使用PHP的强制对象转换呢?结果会如何?来看看这个示例:
<?php $arr = array('foo' => array('a' => 'aFoo', 'b' =>'bFoo'), 'bar' => array('a'=> 'aBar', 'b'=>'bBar'), 'solar' => 'php', ); $a = (object) $arr; var_dump($a);
结果是:
---------- Debug PHP 5.3.1 ---------- object(stdClass)#1 (3) { ["foo"]=> array(2) { ["a"]=> string(4) "aFoo" ["b"]=> string(4) "bFoo" } ["bar"]=> array(2) { ["a"]=> string(4) "aBar" ["b"]=> string(4) "bBar" } ["solar"]=> string(3) "php" } Output completed (1 sec consumed) - Normal Termination
呵呵,很可惜,只能处理一维的情况。