ブログ   うい・らぶ・だいびんぐ   Cube 別館   flag_uk 英語サイト   ポータル
twitter Twitter でログイン
ホーム   最新ニュース   フォーラム   ダウンロード   写真集   リンク集   お問い合わせ RSS

SmartSection > Tools > PHP > Notice [PHP]: Only variables should be assigned by reference

Notice [PHP]: Only variables should be assigned by reference

投稿者: Ken 掲載日: 2008-1-10 (18015 回閲覧)
Notice [PHP]: Only variables should be assigned by reference

PHP のアプリケーションでよく見かけるメッセージですが。
この意味を正しく理解している人は少ないようです。

○ メッセージ種別

PHPのメッセージは数種類あります。
代表的なものは。

Fatal Error : 重大な実行時エラー
これは、メモリ確保に関する問題のように復帰で きないエラーを示します。
スクリプトの実行は中断されます。

Warinig : 実行時の警告
致命的なエラーではない。
スクリプトの実行は中断さ れません。

Notice : 実行時の注意勧告
エラーを発しうる状況に遭遇したことを示す。
ただし通常のスクリプト実行の場合にもこの警告を発することがありうる。

このうち、Fatal Error と Warinig はプログラムのバグが原因です。

Notice はプログラムの記述方法にあいまいな点があることが原因です。
多くの場合は、PHP 処理系が適切な判断をして、よきに計らってくれます。


○ 参照返し

「参照 (reference) 返し」について説明しておきます。

関数からの戻り値を引用する場合は、下記のように記述します。

func_hege() を実行して、その戻り値を 変数 $var に代入する

$var = func_hoge();

function func_hoge() { ... }


配列のように大きなメモリに格納されている値は、代入(メモリ・コピー)では実行効率が悪くなります。
そこで、「参照返し」という手法が使われます。
参照とは、値そのものではなく、値の格納されているメモリ位置の情報です。
C言語などでは、ポインタと呼ばれるものです。

func_hege() を実行して、その戻り値の参照を 変数 $var に代入する。
「参照返し」をする場合、その旨を明示する & をつけます。


$var =& func_hoge();

function &func_hoge() { ... }



なお、「参照返し」は
PHP 4 ではよく使われていましたが、
PHP 5 では推奨されていません。


また、「参照渡し」という手法もあります。
詳しくは PHP マニュアルをご覧ください。


○ メッセージの意味

「Only variables should be assigned by reference」の逐語訳は
「変数だけが参照に割り当てられるべきである」です。

プログラムを下記のように記述した場合に、出力されます。

func_hege() は 参照を返すように定義されているが、"123" はメモリに格納されていない。

function &func_hoge()
{
	return 123;
}


この場合は、面倒でも、下記のように記述する必要があります。

"123" を変数 $ret に代入し(メモリに格納し)、変数 $ret の参照(値の格納されているメモリ位置) を返す。

function &hoge()
{
	$ret = 123;
	return $ret;
}


このメッセージが出たような場合でも、PHP 処理系は、
自動的に最適化して、代入もしくは 「参照返し」として処理するようです。
プログラム論理としては、正しく実行されます。


○ 最近 なんでよく見かけるの

PHP 4.3 まで古いバージョンでは、このメーセージは出力されませんでした。
PHP 4.4 以降のバージョンで、出力されるようになりました。
PHP 4 で開発されたプログラムを PHP 5 で実行すると、頻繁に出力されるようです。

また、PHP 5 でも環境設定によって、出力されない場合があります。
そのため、「参照返し」を理解している開発者でも、メッセージは出ることに、気が付かないケースもあります。


参考
PHP マニュアル : エラー処理およびログ記録関数
http://www.php.net/manual/ja/ref.errorfunc.php

PHP マニュアル : リファレンスを返す
http://www.php.net/manual/ja/language.references.return.php
パフォーマンスを向上させるためだけの目的で この機能を用いることはやめてください。
そのようなことをしなくても、PHP エンジンが自動的に最適化を行います。

ページ移動
良く読まれた記事 php memory allocation test PHP captcha クラス 次の記事
投票者の合計: 0
平均: 0
投稿された内容の著作権はコメントの投稿者に帰属します。
スポンサー

寄付
配布しているソフトが気に入ったら、寄付をお願いします。
寄付

PageRank のページ毎の表示
http://linux.ohwada.jp/ modules/smartsection/item.php?
PageRank 0 PageRank

メインメニュー

マニュアル

ログイン