PHP - 使用关联数组作为对象

22

可能是重复问题:
将数组转换为对象PHP

我正在创建一个简单的PHP应用程序,希望使用YAML文件作为数据存储。我将获得数据作为关联数组,例如具有以下结构:

$user = array('username' => 'martin', 'md5password' => '5d41402abc4b2a76b9719d911017c592')

不过我想要扩展这个关联数组并使用->操作符,这样我就可以像这样编写代码:

$user->username = 'martin';  // sets $user['username']
$user->setPassword('hello'); // writes md5 of 'hello' to $user['md5password']
$user->save();               // saves the data back to the file

有没有一种不需要类定义的好方法呢?

基本上,我希望在PHP中拥有JavaScript风格的对象 :)


4
现今应至少使用SHA1。 - wesside
2
+wesside 2016更新:使用password_hash或PBKDF2与SHA512进行BCrypt。 - mjsa
@mjsa 注意了! - wesside
2个回答

52

只需要对其进行强制类型转换:

$user = (object)$user;

当然,还有其他更灵活的解决方案,比如创建一个实现ArrayAccess接口的类:

$user = new User(); // implements ArrayAccess

echo $user['name'];
// could be the same as...
echo $user->name;

2
请注意,如果 $usernull,将其转换为 (object) 将使其变为非 null(它将成为空对象)。为避免这种情况,您可以这样做:$user = $user ? (object)$user : null - laurent

9

只需创建一个$class = new stdClass;并迭代和重新分配即可。请注意,这仅限于一层深度,就像类型转换一样。您需要编写递归迭代器来获取全部内容。据我所记,Kohana 2/3有一个 to_object() 函数,您可以尝试使用。

找到了:

class Arr extends Kohana_Arr {

    public static function to_object(array $array, $class = 'stdClass')
    {
            $object = new $class;
            foreach ($array as $key => $value)
            {
                    if (is_array($value))
                    {
                    // Convert the array to an object
                            $value = arr::to_object($value, $class);
                    }
                    // Add the value to the object
                    $object->{$key} = $value;
            }
            return $object;
    }

2
请注意,这也会将顺序(非关联)数组转换为对象。您可能需要与此答案结合使用:https://dev59.com/5HVC5IYBdhLWcg3w1Etq#4254008 - A F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接