戻り値が配列の関数でNoticeを回避するには?

PHP

08:48:06, by admin Email , 159 words, 6782 views   Japanese (JP) del.icio.us

みんなどうしてるんだろう。

(ノ・・)ン。。。。。。(((●コロコロッ

PHPの関数で戻り値が配列のものというのは結構たくさんあるのだが、
それらの戻り値に困った事ってないだろうか?
私は良くある。
それは

Notice


Noticeとは、
error_reportingをE_ALLにしておくと表示される警告メッセージ。
php.iniコンパイル時にphp.iniをコピーするのだが、
利用元をphp.ini-distにするとデフォルトではNoticeが表示されない。
php.ini-recommendを使うとNoticeが表示される。

PHPの配列で存在しないインデックスを参照しようとすると、
Noticeが表示される。
例えば、
$array = array(
'a'=>'a',
'b'=>'b',
'c'=>'c',
);

echo $array['d'];

した場合、
Notice: Undefined index: d in ~~

dっていうインデックスはないっすよーって感じで。


さて、
ここまでなら回避は簡単だろう。
ではこれはどうかな?
$input = 'http://hain.jp/index.php/tech-j/';
$parts = parse_url( $input );

$url = $parts['scheme'].'://'.$parts['user'].':'.$parts['pass'].'@'.$parts['host']
.$parts['path'].$parts['query'].'#'.$parts['fragment'];
echo $url;


結果は
Notice: Undefined index: user
Notice: Undefined index: pass
Notice: Undefined index: query
Notice: Undefined index: fragment


$input、もっと言うならURIは状況によって変化する。
クエリストリングが付いていたり、
フラッグメント(アンカー)が付いていたり、
ユーザー名、パスワードが付いていたり。
では、その状況によってNotice回避策を講じるのかというと結構大変では無かろうか?
値が無いのならば放っておいてもいいところを、
インデックスがないというのが何ともやりづらい。
結果として三項演算子+issetのオンパレードで、
見づらさ3倍って感じ。


私の対応策は

[More:]


以下のようなもの。
$arraybase = array(
"scheme" => "",
"host" => "",
"port" => "",
"user" => "",
"pass" => "",
"path" => "",
"query" => "",
"fragment" => "",
);
$input = 'http://hain.jp/index.php/tech-j/';
$parts = parse_url( $input );
$parts = array_merge( $arraybase, $parts );

$url = $parts['scheme'].'://'
.$parts['user'].':'.$parts['pass'].'@'
.$parts['host'].$parts['path']
.$parts['query'].'#'.$parts['fragment'];
echo $url;


一言で言うなら「予め定義しておく」。
戻り値はマニュアルに載っているので、
その配列を予め用意しておき、
取得した配列で上書きしてから利用する。
添え字が数字でない限り問題なく動作する。
数字の時はforを使う。
初期値はその後の利用方法によって型を変える。
0とnullとfalseと""が同じ扱いされると困るので、
型一致で条件分岐させる。

といった具合か。



この方法が最適だとは思っていないが。


Trackback address for this post:

http://hain.jp/htsrv/trackback.php/174

Comments, Trackbacks:

Comment from: e [Visitor]
174
PermalinkPermalink 2007/10/30 @ 08:46

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites
PR

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!