2012-08-30 9 views
10

可能性の重複として連想配列:
Convert Array to Object PHPPHP - オブジェクト

私は、単純な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 

クラス定義なしでこれを行うには良い方法がありますか?

基本的に、私は文字通り$class = new stdClass;を作り、反復処理し、再割り当てPHP :)

+4

万一少なくとも最近sha1を使用してください。 – wesside

+2

+ wesside 2016更新:SHA512でpassword_hashまたはPBKDF2経由でBCryptします。 – mjsa

+0

@mjsa見る方法! – wesside

答えて

4

でJavaScriptのスタイルオブジェクトを持っていると思います。タイプキャスティングのように、これは深いレベルに過ぎません。すべてを得るためには、反復的なイテレータを作成する必要があります。私が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

これは、シーケンシャル(非結合)配列もオブジェクトに変換することに注意してください。この回答と組み合わせたいと思うかもしれません:http://stackoverflow.com/a/4254008/1074400 –

27

はちょうどそれをキャスト:もちろん

$user = (object)$user; 

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

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

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

$ userが 'null'の場合、'(オブジェクト) 'にキャストするとnullではないことに注意してください。空のオブジェクトである)。これを避けるには、次のようにします: '$ user = $ user? (オブジェクト)$ user:null' –