php5とjavaの参照渡しについて

January 15, 2009,
tags: java php 参照渡し


このエントリーをはてなブックマークに追加

授業でJavaの参照渡しとかその辺をやったので、PHPで実験をしてみました。
とりあえずサンプルコード

<?php

class Human{

    var $name;
    var $age;

    function showInfo(){
        print "name : ". $this->name . "<br>";
        print "age  : ". $this->age . "<br>";
    }
}

    print "まずは普通に<br>";
    $h1 = new Human();
    $h1->name = "John Frusciante";
    $h1->age = 39;

    $h2 =  $h1;

    $h1->showInfo();
    $h2->showInfo();

    print "<br>値をかきかえてみる<br>";
    $h1->name = "Flea";
    $h1->age = 48;

    $h1->showInfo();
    $h2->showInfo();

?>

実行結果

まずは普通に
name : John Frusciante
age : 39
name : John Frusciante
age : 39

値をかきかえてみる
name : Flea
age : 48
name : Flea
age : 48```

こんな感じです。  
Personってくらすを$h1にインスタンスして、それを$h2に入れるって感じです。  
その後、Personクラスのメンバ変数nameの値を書き換えて、name,ageの値を出力するって感じです。

PHPも5からはJava同様オブジェクトに関してデフォルトで参照渡しになったようなので、上記のようなプログラムで参照渡しでいけます。

ただ、これがPHP4だった場合(もうPHP4って使わないかw)

$h2 = & $h1;```

$p1から$p2に値を渡すときに&をつけないと、参照渡しにならないのです。
結構これってめんどくさいwwやっぱPHP5のほうが使いやすいですねw

ただ、こんな感じにやると参照渡しされなかったです。

<?php
class Human{

    var $name;
    var $age;

    function showInfo(){
        print "name : ". $this->name . "<br>";
        print "age  : ". $this->age . "<br>";
    }
}
    print "まずは普通に<br>";
    $h1 =  new Human();
    $h1->name = "John Frusciante";
    $h1->age = 39;

    $h2 =  $h1;

    $h1->showInfo();
    $h2->showInfo();

    print "<br>値をかきかえてみる<br>";
    $h1->name = "Flea";
    $h1->age = 48;

    $h1->showInfo();
    $h2->showInfo();

    print "<br>h2にnewしちゃった<br>";
    $h2 = new Human();
    $h1->showInfo();
    $h2->showInfo();
?>

実行結果

まずは普通に
name : John Frusciante
age : 39
name : John Frusciante
age : 39

値をかきかえてみる
name : Flea
age : 48
name : Flea
age : 48

h2にnewしちゃった
name : Flea
age : 48
name :
age :```

どうやら、$h2に参照渡ししたあと$h2にたしてもう一度Humanオブジェクトをインスタンスしてあげる。  
そうすると$h2だけが空になってしまいました。  
参照渡しなら、$h1も値が空になるとおもったのだけど、違いました。

ただ、これも$h1から$h2に参照渡しするところに

$h1 = & $h2```

って入れてあげれば実行結果がかわりました。
実行結果

name : John Frusciante
age : 39
name : John Frusciante
age : 39

name : Flea
age : 48
name : Flea
age : 48

name :
age :
name :
age :```

なんかこっちのほうがちゃんとした参照渡しっぽいwww  
意外とはまりそうなのでメモしておきます。

ちなみにJavaだとどうなんだろうってことで、Javaでもやってみますた。

class Test01{ public static void main(String[] args){ Human h1 = new Human(); Human h2;

    h1.name = "John Frusciante";
    h1.age = 39;

    h2 = h1;

    System.out.println("\nまずは普通に");
    h1.showInfo();
    h2.showInfo();

    h1.name = "Flea";

    System.out.println("\n値をかきかえてみる");
    h1.showInfo();
    h2.showInfo();

    System.out.println("\nh2にnewしちゃn");

    h2 = new Human();
    h1.showInfo();
    h2.showInfo();

}

}

class Human { String name; int age;

void showInfo(){
    System.out.println("name : " + name);
    System.out.println("age : " + age);
}

}


実行結果

name : John Frusciante age : 39 name : John Frusciante age : 39

値をかきかえてみる name : Flea age : 39 name : Flea age : 39

h2にnewしちゃn name : Flea age : 39 name : null age : 0 ```

やっぱJavaもh2だけ書き換わっちゃった。参照が解除されたっていうべきなのか・・・なんと表現していのかわからんけど、まあやっぱPHP5で&を抜きにしたときと同じ状況ですね。
PHPみたく&つけたらコンパイルエラーになるし・・・どうしたらいいんだろう。
どうにもならない予感がします・・・。

comments powered by Disqus