競馬鹿ねっと
 
since
2000.1.1〜
ヤエノムテキ
http://www.keibaka.net
メールはこちら メールはアイコンをクリック!

競馬
 ┣ トップページ
 ┣ 開発日誌とか♪
 ┗ 熱い競馬漫画
  SouKaSILa
  NKV

 
Developer
 ◆ 過去の遺物
 ◆ KBN_IPAT5
 ◆ KBN_IPAT4 08/06/01
 ◆ PHP5
 ┣ PHPの優位性
 ┣ ガベージコレクタ
 ┣ 値渡しと参照渡し
 ┃┣ Cサンプル
 ┃┗ PHPサンプル
 ◆ オープンソース
 ┣ KBN_AIBO
 ┃┗ document
 ┗ IIS_AUTH_ADO
 ◆ 無償サポート
 
その他
 ◆ 映画とか 06/05/10
 ◆ 北斗の拳 06/04/04
 
PC
 ◆ SOTEC WL7160A
 
ウォッチリンク
 ◆ スラッシュドット
 ◆ ボトムズ
 
利用させて頂いた順に並んでいます。
XREA
競馬鹿ねっとはXREAを利用して運営されています。
Yuko's Gallery
Yuko's Gallery様のフリー画像を利用させて頂いてます。
Aomusi'sWorld
Aomusi'sWorld様のフリー画像を利用させて頂いてます。
 
参照動作確認用PHPソース 最終更新日:2005.12.10



  PHP5ではオブジェクトは全て参照渡しである事が確認できました。
内部メンバをコピーor参照の区別がコーディングできない為、
参照用の変数はオブジェクトを使用しています。
参照として動作している事が確認できます。

test.php
<?php
    class valueClass
    {
        public $_value;
        function __construct($name) { $this->_value = $name; }
        function __destruct()
        {
            printf("destruct: valueClass[%s]\n", $this->_value);
            unset($this->_value);
        }
    }
    class testClass
    {
        private $_name;
        private $_obj;
        private $_value;

        function __construct($name)
        {
            $this->_name = $name;
            $this->_obj = new valueClass($name);
            $this->_value = $name;
            printf("construct: %s\n", $this->_name);
        }
        function __destruct()
        {
            printf("destruct: %s[%s]\n", $this->_name, $this->_obj->_value);
            unset($this->_name);
            unset($this->_obj);
            unset($this->value);
        }
        public function get_value()
        {
            return $this->_value.':'.$this->_obj->_value;
        }
        public function set_value($value)
        {
            printf("set before =====> %s <= %s\n", $this->_obj->_value, $value); 
            $this->_obj->_value = $value;
            $this->_value = $value;
            printf("set after =====> %s <= %s\n", $this->_obj->_value, $value); 
        }
    }
    //■ コピー用関数
    function cp_func($obj, $value, $isClone = FALSE)
    {
        //参照渡しで入ってくるので明示的にコピー
        if ($isClone)
        {
            $clone = clone $obj;
            $clone->set_value($value);
        }
        else
        {
            $obj->set_value($value);
        }
    }

    //■ 参照用関数
    function pt_func(&$obj, $value)
    {
        $obj->set_value($value);
    }

    //コピー元オブジェクトを準備
    $cpBase = new testClass('cpBase');
    $ptBase = new testClass('ptBase');
    $cpBase2 = new testClass('cpBase2');
    echo "\n";

    //コピー
    print("値渡し(実は参照) start\n");
    print("----------------------------------------\n");
    printf("cpBase->_value =>%s\n", $cpBase->get_value());
    cp_func($cpBase, 'cpBase_hoge');
    printf("cpBase->_value =>%s\n\n", $cpBase->get_value());

    //コピー
    print("値渡し(クローン) start\n");
    print("----------------------------------------\n");
    printf("cpBase2->_value =>%s\n", $cpBase2->get_value());
    cp_func($cpBase2, 'cpBase2_hoge', TRUE);
    printf("cpBase2->_value =>%s\n\n", $cpBase2->get_value());

    //参照
    print("参照は参照 start\n");
    print("----------------------------------------\n");
    printf("ptBase->_value =>%s\n", $ptBase->get_value());
    pt_func($ptBase, 'ptBase_hoge');
    printf("ptBase->_value =>%s\n\n", $ptBase->get_value());
?>

実行結果と説明
↓コピー参照元となるオブジェクトを3つ準備している
construct: cpBase
construct: ptBase
construct: cpBase2

値渡し(実は参照) start
----------------------------------------
cpBase->_value =>cpBase:cpBase
set before =====> cpBase <= cpBase_hoge ←cpBaseからcpBase_hogeに更新
set after =====> cpBase_hoge <= cpBase_hoge ←値渡し形式でも実は参照なのでデストラクタなし!
cpBase->_value =>cpBase_hoge:cpBase_hoge ←値が書き換わっている

値渡し(クローン) start
----------------------------------------
cpBase2->_value =>cpBase2:cpBase2
set before =====> cpBase2 <= cpBase2_hoge
set after =====> cpBase2_hoge <= cpBase2_hoge
destruct: cpBase2[cpBase2_hoge] ←コピーされた物なのでデストラクタ発生!
cpBase2->_value =>cpBase2:cpBase2_hoge ←左のcpBase2に注目
オブジェクト$_objは同一アドレスを参照しておりデストラクタも発生しない
文字列変数$_valueは違うアドレスでコピーされている事が確認できる


参照は参照 start
----------------------------------------
ptBase->_value =>ptBase:ptBase
set before =====> ptBase <= ptBase_hoge
set after =====> ptBase_hoge <= ptBase_hoge
ptBase->_value =>ptBase_hoge:ptBase_hoge

destruct: cpBase[cpBase_hoge] ←cpBaseのデストラクタ発生
destruct: valueClass[cpBase_hoge] ←cpBase内の$_objデストラクタ発生
destruct: ptBase[ptBase_hoge]
destruct: valueClass[ptBase_hoge]
destruct: cpBase2[cpBase2_hoge]
destruct: valueClass[cpBase2_hoge]



Copyright 競馬鹿ねっと