揮発性のメモ2

知識をメモ書きしておく

PHPでキャストをする

よく似てるけど違うクラスに無理やりキャストする関数
Redirecting...

<?
/**
 * 無理やりキャストする
 * @param  string  $class   キャスト先のクラス名
 * @param  object  $object  キャスト元のオブジェクト
 * @return object  キャスト先のオブジェクト
 */
function cast($class,$object) {
    return unserialize(
        preg_replace(
            '/^O:\d+:"[^"]++"/', 
            'O:'.strlen($class).':"'.$class.'"',
            serialize($object)
        )
    );
}

/********************************************/
class A {
    public $a;
    public $b;
    function show(){ print("i am A\n"); }
}

class B {
    public $a;
    public $c;
    function show(){ print("i am B\n"); }
}

$A = new A;
$A->a = "Hello";
$A->b = "world";

$B = cast("B",$A);
print( "$B->a, $B->b, $B->c \n");
$B->show();
Hello, world, 
i am B

コピー元の変数は全部コピーされる。 コピー先にしか無い変数はしょうがない。
こういう適当さがあとでバグを産むのはわかってるが・・・