競馬鹿ねっと
since 2000.1.1〜
http://www.keibaka.net
メールはアイコンをクリック!
競馬
┣
┣
┗
★
★
Developer
◆
◆
◆ 08/06/01
◆
┣
┣
┣
┃┣
┃┗
◆ オープンソース
┣
┃┗
┗
◆
その他
◆ 06/05/10
◆ 06/04/04
PC
◆
ウォッチリンク
◆
◆
利用させて頂いた順に並んでいます。
競馬鹿ねっとはXREAを利用して運営されています。
Yuko's Gallery様のフリー画像を利用させて頂いてます。
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]