[PHP-users 10354] CALL 側での 引数参照渡し指定

Naofumi Kondoh php-users@php.gr.jp
Thu, 26 Sep 2002 01:52:13 +0900


ソフト工房の近藤です。大垣さん、こんにちは。

私の早とちりで、間違った SUBJECT を付けてしまい
申し訳ありませんでした。        > ALL

詳しい解説ありがとうございます > 大垣さん

Yasuo Ohgaki wrote:
> 大垣です。
>
> # 収束してすが、コメントだけ
>
> Call time pass by referenceには大きな問題があります。
> モジュール関数の引数を無理矢理Pass by Referenceで渡したり
> できるのですが、これが問題になります。また、call time
> pass by referenceを使ったコードはメンテナンス性が非常に
> 落ちます。

プロトタイプチェックなどがないので、その通りですね。
C に慣れていると、CALL 側で、CALL BY REFERENCE である
事が明示されないと気持ち悪いだけで。
PHP には、PHP のスタイルでやるべきですね。(反省)。

> PHP4はパフォーマンス向上の為にpass by referenceを使う
> 必要はありません。Reference countという機能(pass by
> referenceと関係なし)があるため、pass by valueで渡し
> てもPHPが各変数にもっている内部参照カウンタがインクリメント
> されるだけです。

なるほど。
値渡しの引数を参照(READ ONLY)の場合は、複製せずに元の
変数の実体を使用するということですね。
値渡しの引数に代入した時だけは、新しく変数領域を確保
して複製するという仕組みでしょうか。

# ソースコード読みたい。身体が3つ位欲しいですね。(^_^;;

...略...

---- 追記 ----

allow_call_time_pass_reference = Off  に設定して、
Warning が出るのは、松嶋さんご指摘のとおり、CALL 側で
& を付けて、参照渡しにした場合だけであることを確認しました。
TEST 環境:PHP 4.2.1 Linux

function hoge ( &$foo ) { ++$foo; }

hoge( $foo );        // ○ Warning は出ない。

hoge( &$foo );       // × Warning が出る。この書き方だけが、
           // 将来廃止になる見込み。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 (株)ソフト工房   近藤直文        Email:  nkon@shonan.ne.jp
http://www.SOFTKOUBOU.co.jp/      http://www.shonan.ne.jp/~nkon/
2002-09-26(木)19:00-21:30 第6回 JPUG 業務アプリ分科会 勉強会
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/