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

2 に答える 2

50

キャストするだけです:

$user = (object)$user;

もちろん、を実装するクラスを作成するなど、他のより柔軟なソリューションがありますArrayAccess

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

echo $user['name'];
// could be the same as...
echo $user->name;
于 2012-08-30T18:25:26.000 に答える
8

文字通り、 a を作成し$class = new stdClass;て反復し、再割り当てするだけです。型キャストと同様に、これは 1 レベルの深さにすぎないことに注意してください。すべてを取得するには、再帰イテレータを作成する必要があります。私が覚えていることから、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;
    }
于 2012-08-30T18:24:27.020 に答える