スレッド表示 | フラット表示〕 全トピック 920 件中 597 番目 次≫ ≪前

変数をglobal宣言した時のメモリ的な挙動

created: 2004-06-08 16:08 | modified: 2004-06-09 11:43 | reply: 3

[1638] 変数をglobal宣言した時のメモリ的な挙動

user: すみません | created: 2004-06-08 16:08
サーバ負担を軽減するため、function関数に変数を渡す場合どの方法が一番メモリ節約できるのか考えております。

参照渡しで渡せばメモリ領域を新たにつくらなくて済むので効率がいいのはわかったのですが、
globalで渡した場合のメモリ的な挙動がマニュアルとかにも載っていなくてわかりません。
globalで変数を渡せばfunction関数内での変数値変更が関数外に出ても反映されていることから想像すると、参照渡しと同じようにメモリ領域が増えることは無いのでしょうか?

参照渡しとglobalどっちがメモリにやさしいのでしょうか?
reply: 1642 返信 編集 削除

[1642] リファレンスのようです。

user: ゆうじ | created: 2004-06-08 19:19
こんにちは。発見しました。

変数のスコープhttp://www.php.net/manual/ja/language.variables.scope.php

引用
---
PHP4を駆動するZend Engine 1では、 リファレンス変数の修正子 static および global を実装しています。 例えば、関数スコープ内にglobal 命令により実際にインポートされた真のグローバル変数は、 実際にグローバル変数へのリファレンスを作成します。
---

参照渡しと考えて良いようです。


> 参照渡しで渡せばメモリ領域を新たにつくらなくて済むので効率がいいのはわかったのですが、

メモリー領域を新に確保するのは、
値のコピー(代入)が行われた時なので、
関数に値を渡す手段としてはその挙動に変わりありません。

渡された値を関数内で変更したい時に限って
リファレンス渡しを使うほうが、
混乱がなくって良いと思います。
Parent: 1638  reply: 1651 返信 編集 削除

[1651] レスありがとうございます

user: すみません | created: 2004-06-09 03:44
>グローバル変数は、実際にグローバル変数へのリファレンスを作成します。

マニュアルに書いてあったんですね。
ということでマニュアルを読み返していたら私も発見しました。

リファレンスの適用範囲http://php.oregonstate.edu/manual/ja/language.references.spot.php

まとめると下の3つは全部同じ挙動ということでいいのかな

function foo(&$var){
}

function foo(){
global $var;
}

function foo(){
$var =& $GLOBALS["var"];
}
Parent: 1642  reply: 1652 返信 編集 削除

[1652] そのようですね。

user: ゆうじ | created: 2004-06-09 11:43
そのようですね。

実際に一緒なのかはPHPのソースコードを
確かめなければわかりませんが、
マニュアルにそうありますし、
実体験からもその解釈で良いと思います。
Parent: 1651  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 597 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑