<?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());
?>