somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】配列とオブジェクトの変換

気になったので試してみた。
<?php
class MyClass {
    public    $pubVar1;
    private   $priVar1;
    protected $proVar1;
    public    $pubObj1;
    private   $priObj1;
    protected $proObj1;

    function __construct($pubVar1, $priVar1, $proVar1, $pubObj1, $priObj1, $proObj1) {
        $this->pubVar1 = $pubVar1;
        $this->priVar1 = $priVar1;
        $this->proVar1 = $proVar1;
        $this->pubObj1 = $pubObj1;
        $this->priObj1 = $priObj1;
        $this->proObj1 = $proObj1;
    }
}

class MyClass2 {
    public    $pubVar1;
    private   $priVar1;
    protected $proVar1;

    function __construct($pubVar1, $priVar1, $proVar1) {
        $this->pubVar1 = $pubVar1;
        $this->priVar1 = $priVar1;
        $this->proVar1 = $proVar1;
    }
}

$pubObj1 = new MyClass2(4, 5, 6);
$priObj1 = new MyClass2(7, 8, 9);
$proObj1 = new MyClass2('a', 'b', 'c');

// MyClassの表示
$myClass = new MyClass(1, 2, 3, $pubObj1, $priObj1, $proObj1);
var_dump($myClass);

// MyClassの配列化
$myArray = (array)$myClass;
var_dump($myArray);

// MyClassの配列化をObject化
$myObject = (object)$myArray;
var_dump($myObject);

// MyClassに対応した連想配列のObject化
$myObject = (object)array('pubVar1' => 1, 'priVar1' => 2, 'proVar1' => 3);
var_dump($myObject);

// MyClassに対応していない配列のObject化
$myObject = (object)array(1, 2, 3);
var_dump($myObject);

// MyClassをget_object_varsで表示
$myClassVar = get_object_vars($myClass);
var_dump($myClassVar);

/* // キャストできない
$myClass2 = (MyClass)$myArray;
var_dump($myClass2);
echo '
'; */
object(MyClass)[4]
  public 'pubVar1' => int 1
  private 'priVar1' => int 2

  protected 'proVar1' => int 3
  public 'pubObj1' => 
    object(MyClass2)[1]
      public 'pubVar1' => int 4

      private 'priVar1' => int 5
      protected 'proVar1' => int 6

  private 'priObj1' => 
    object(MyClass2)[2]
      public 'pubVar1' => int 7

      private 'priVar1' => int 8
      protected 'proVar1' => int 9

  protected 'proObj1' => 
    object(MyClass2)[3]
      public 'pubVar1' => string 'a' (length=1)

      private 'priVar1' => string 'b' (length=1)
      protected 'proVar1' => string 'c' (length=1)

array
  'pubVar1' => int 1
  '�MyClass�priVar1' => int 2

  '�*�proVar1' => int 3
  'pubObj1' => 
    object(MyClass2)[1]
      public 'pubVar1' => int 4

      private 'priVar1' => int 5
      protected 'proVar1' => int 6

  '�MyClass�priObj1' => 
    object(MyClass2)[2]
      public 'pubVar1' => int 7

      private 'priVar1' => int 8
      protected 'proVar1' => int 9

  '�*�proObj1' => 
    object(MyClass2)[3]
      public 'pubVar1' => string 'a' (length=1)

      private 'priVar1' => string 'b' (length=1)
      protected 'proVar1' => string 'c' (length=1)

object(stdClass)[5]
  public 'pubVar1' => int 1
  private 'priVar1' (MyClass) => int 2

  protected 'proVar1' => int 3
  public 'pubObj1' => 
    object(MyClass2)[1]
      public 'pubVar1' => int 4

      private 'priVar1' => int 5
      protected 'proVar1' => int 6

  private 'priObj1' (MyClass) => 
    object(MyClass2)[2]
      public 'pubVar1' => int 7

      private 'priVar1' => int 8
      protected 'proVar1' => int 9

  protected 'proObj1' => 
    object(MyClass2)[3]
      public 'pubVar1' => string 'a' (length=1)

      private 'priVar1' => string 'b' (length=1)
      protected 'proVar1' => string 'c' (length=1)

object(stdClass)[6]
  public 'pubVar1' => int 1
  public 'priVar1' => int 2

  public 'proVar1' => int 3
object(stdClass)[5]
  int 1

  int 2
  int 3
array
  'pubVar1' => int 1

  'pubObj1' => 
    object(MyClass2)[1]
      public 'pubVar1' => int 4

      private 'priVar1' => int 5
      protected 'proVar1' => int 6


わかったこと
publicな変数はそのまま保持される。
連想配列でないものは、オブジェクト化しないほうがいい。
private、protectedな変数はキーの値が変わってしまう。
ネストしている場合は、一番上の階層のみ変換される。
XDebugで変換される文字によく分からない文字が含まれる・・・