PHPで携帯サイトを作成する際の初心者の困りごと

このQ&Aのポイント
  • 現在、超初心者の私がPHPを使用して携帯サイトを作成しています。サンプルコードを参考にしながら修正を加えているのですが、いくつか理解できない箇所があります。まず、関数の引数や処理内容、バッファのクリアなどがわからず困っています。特に、if文での条件式や関数へのパラメータの渡し方が分からず混乱しています。どなたか詳しい方に教えていただきたいです。
  • 携帯サイトを作成するために、PHPを使用しています。しかし、PHPの基礎的な知識がほとんどないため、サンプルコードを参考にしながら進めています。しかし、関数の引数や処理内容、バッファの使い方などがわからず、困っています。特に、if文での条件式や関数へのパラメータの渡し方が分からないため、プログラムの意味が理解できません。どなたか詳しい方にアドバイスをいただきたいです。
  • 超初心者の私が、PHPを使って携帯サイトを作成しています。サンプルコードを参考にしながら進めているのですが、いくつか疑問点があります。まず、関数の引数や処理内容、バッファの使い方がよく分かりません。特に、if文での条件式や関数へのパラメータの渡し方について理解できません。詳しい方に助けていただきたいです。
回答を見る
  • ベストアンサー

phpで携帯サイトを作成しています。

php超初心者です。 現在、phpにて携帯サイトを作成しています。 サンプルコードなどが記載されている本を購入し、 それを解読しながら、自分なりに修正を加え作成しています。 その中で、どうしても理解できない所があり困っています。 どなたか教えて下さい。 サンプルコード function mobileFinish($convertFunc=null, $funcParams=array()) { // 文字コード変換&バッファ出力 $content = ob_get_contents(); ob_end_clean(); $content = mb_convert_encoding($content, 'sjis-win', 'utf-8'); // 変換処理 if ($convertFunc) { $content = call_user_func_array($convertFunc, array_merge(array($content), $funcParams)); } echo $content; まず function 関数名 (引数1,引数2){ 処理方法 }は 引数1,引数2を使って{ }の中の処理をせよ ということだと思うので、 ”$convertFunc=null”と”$funcParams=array()”を使って{ }の中の処理をせよになり、 { }の中の処理というのが、 $content = ob_get_contents(); ob_end_clean(); $content = mb_convert_encoding($content, 'sjis-win', 'utf-8'); つまり、このコード以前に記述されている出力用バッファの内容を取得して、 バッファをクリアして、 文字コードを”utf-8”から”sjis-win”に変換したものを”$content”に格納する。 ここからが理解できないのです。 if ($convertFunc) { $content = call_user_func_array($convertFunc, array_merge(array($content), $funcParams)); } まず if (条件式) { 処理方法 }は、 条件式が「正」の時{ }の中の処処を行え ということだと思うので、 ”$convertFunc=null”つまり”$convertFuncに値が無い時”に{ }の中の処処を行えになり、 call_user_func_array(”呼び出す関数名”,”関数に渡すパラメータがセットされた配列”)は ”呼び出す関数名”は”$convertFunc=null”なんのこっちゃ? ”関数に渡すパラメータがセットされた配列”も”$content”に格納された内容と ”$funcParams=array()”を”array_merge()”で合体させる・・・ ”$funcParams=array()”には何の値が入っているんだ? ”$convertFunc=null”と”$funcParams=array()”のおかげでチンプンカンプンです。 どなたかPHP訳してください。宜しくお願いします。

  • PHP
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

まず、自分でどういう風に解釈し、どういう風に考えたかを説明した上で質問している点が、実にすばらしいと思いました。 バッファうんぬんに関しては、そちらの解釈どおりで正解です。 んで、間違っている点。 ----- ----- ----- ----- ----- ----- 関数に渡す変数の事を引数というのですが、 (具体的に書くと strlen($abc) などの場合の $abc が引数) > function mobileFinish($convertFunc=null, $funcParams=array()) の $convertFunc=null, $funcParams=array() は 引数の指定がなかった場合、この数値が使われるだけです。 いわゆるデフォルト値です。 ----- ----- ----- ----- ----- ----- この function を呼び出す時に、 例えば、 mobileFinish(1,array("hoge01" , "hoge02")); という風に、この function を呼び出した場合には、 $convertFunc = 1, $funcParams = array("hoge01" , "hoge02") という値が渡されます。 ----- ----- ----- ----- ----- ----- んで、次。 > ”$convertFunc=null”つまり”$convertFuncに値が無い時”に{ }の中の処処を行えになり、 実に惜しい。 そう 解釈するのであれば、 $convertFunc=null は、 $convertFunc == null でなければいけないのです。 $convertFunc=null は $convertFunc に null を代入しているだけです。 もし仮に、これをif で 評価したとしたら 常に true が返りますので、常に 実行する事になります。 ----- ----- ----- ----- ----- ----- ちょっと 時間がないので、以降の回答は 他の方にお任せします。

funato0038
質問者

お礼

非常に分かりやすい解説をして頂き ありがとうございます。(^-^ )♪ 目からうろこです!! このコードについては何とか理解することが出来ました。 ただ一つだけ疑問があります。 比較演算子の”==”と 代入演算子の”=” の違いは理解できたのですが、 引数の指定がない場合、 ”$convertFunc”に”null”を代入するという事ですので、 if (null) { 処理方法 }になると思うのですが、 これでは条件式が成立しないので、この if構文 自体が 無効という解釈でよろしいのでしょうか。 それとも ”$convertFunc”には他のファイルで定義された function関数(仮に関数Aとする)が代入される事が わかりましたので、 if (関数A) { 処理方法 } となり 関数Aに値が何も無かった場合には、 if (null) { 処理方法 } になるという解釈でよろしいのでしょうか。 お時間のある時で結構ですので、 教えて頂ければ幸いです。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

> にも関わらす、お礼の返信が遅れてしまい、申し訳ありません。 あ~、全然気にしてません。 基本的に 俺は ここでは ゆる~い回答しかしてないので、 お礼とか 全然ないままの人とか半分近くいますよ。数えてませんけど。 自分もお礼が入ったときに思い出すぐらいもんで。 > 教えて頂きましたif文のサンプルの中で、 んー、これね。正直、ミスったと思ってます。 余計、混乱させるサンプルでしたね。 自分でも 分けが分からない事になって、何がしたかったのか 今でも分かりません。 #3さんの回答もごもっともなのですよ。 正直、ちょっと耳が痛かったです。 俺ってば だいぶ 雑な学習の仕方してきたので、自分でも 「このやり方はこれでいいのだろうか。。。?」と思うことも多々あります。 PHPのマニュアルって結構 丁寧に書いてて、読破して 全部 理解できれば、 色んなケースに対応できるようになります。 まぁ、俺は 必要な時に 「こんな関数ないかな~」って程度でマニュアルを見る程度ですが。 > if (null) は常に”false”であると覚え込もうかとも思いましたが、 多分、あってると思いますよ。 こんな答え方のは 実は 俺も 明確な答えは知りません。 null って PHPに限らず いろんな言語に存在していて、 どの言語でも「なんもない」事を表してるような感じです。 ゼロでも空白でもなく、「無」を表すための記号みたいなものですかね~(自信なし) 基本的に、俺は トライ&エラーで やってみてダメなら、「あぁ、ダメなんだ」ぐらいのユルさでやってます。 while も trueでループを抜けるかfalseでループを抜けるのか よく忘れます。 俺の真似をすると、後々困る事になりますので、悪い見本と言う見方をしておいてください。 > 見ず知らずの方から、こんなに丁寧に教えて頂けるとは思ってもいませんでしたので、 まぁ、自己満足でやってるだけですので、気にせずに。 回答するのに飽きたらフェードアウトするつもりですし。 では、PHPの学習とか 回答とか いろいろ頑張ってください。

noname#243182
noname#243182
回答No.3

なぜマニュアルを参照しないのでしょうか。質問者も、回答者も。

参考URL:
http://www.php.net/manual/ja/language.expressions.php
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

> 引数の指定がない場合、 > ”$convertFunc”に”null”を代入するという事ですので、 > if (null) { 処理方法 }になると思うのですが、 ここまでは合ってます。 > これでは条件式が成立しないので、この if構文 自体が > 無効という解釈でよろしいのでしょうか。 「条件式が成立しない」ってのは「$a == 0」という形式になっていない。と言う事でしょうか? だとしたら、ちょっと違います。 これは null を評価し、falseと判断した結果として、「処理方法」を実行していないだけです。 if構文自体は 問題なく動作しています。 if は 条件式が true か false かしか判断していませんが、色んな 書き方があるのです。 実際、何通りか書いてみましたので、実際に 実行してみると 分かりやすいかと思います。 ちなみに「!(感嘆符)」は 「not」 と同じだと思ってください。 if ($a) みたいな 書き方した時は、$a の中身が 0 とか null とか "" 以外は true になります。 ぶっちゃけ中身があれば true です。 <? //-------------------------------------- print "if (null) : "; if (null) { print "true<br>"; } else { print "false<br>"; } print "if (!null) : "; if (!null) { print "true<br>"; } else { print "false<br>"; } print "<hr>\n"; //-------------------------------------- $a = ""; print "・\$a は \"\"<br><br>"; print "if (\$a) : "; if ($a) { print "true<br>"; } else { print "false<br>"; } print "if (!\$a) : "; if (!$a) { print "true<br>"; } else { print "false<br>"; } print "<hr>\n"; //-------------------------------------- $a = 100; print "・\$a は 100<br><br>"; print "if (\$a) : "; if ($a) { print "true<br>"; } else { print "false<br>"; } print "if (\$a == 100) : "; if ($a == 100) { print "true<br>"; } else { print "false<br>"; } print "if (\$a != 100) : "; if ($a != 100) { print "true<br>"; } else { print "false<br>"; } print "if (\$a != 0) : "; if ($a != 0) { print "true<br>"; } else { print "false<br>"; } print "<hr>\n"; //-------------------------------------- ?> うん。書いてみて思った。わかりづらいな これ。 うん。すみません。これで 我慢してください。 ----- ----- ----- ----- ----- ----- さて、気を取り直して、次。 > ”$convertFunc”には他のファイルで定義された > function関数(仮に関数Aとする)が代入される事が > わかりましたので、 > if (関数A) { 処理方法 } となり > 関数Aに値が何も無かった場合には、 > if (null) { 処理方法 } > になるという解釈でよろしいのでしょうか。 んーっと、もしかしたら、勘違いしてるんじゃないかなと思ったので、 ツッコんでおきますと、 $convertFunc には 「function関数の『名前』」が入っているだけです。 function関数の戻り値が入っているわけではないです。 ----- ----- ----- ----- ----- ----- > if ($convertFunc) { > $content = call_user_func_array($convertFunc,array_merge(array($content), $funcParams)); > } call_user_func_array この関数、実は 俺も使った事がないのですが、 関数名と引数を指定して、その関数名の関数を実行した結果を、戻り値として受け取るって物らしいですね。 なので、今回の場合は、$convertFunc には 関数名が入っているはずですので、 関数名が 入っている場合だけ、call_user_func_array が実行されます。 自分で 書いてて 若干 意味不明になってきましたので、ここらで やめときます。。

funato0038
質問者

お礼

bm_hiro様 非常に迅速な対応をしていただき、大変感謝いたします。 にも関わらす、お礼の返信が遅れてしまい、申し訳ありません。 実はあれから、さんざん色々な書物やWEBサイトなどを 調べまくったのですが、どうしても解釈に自身の持てない箇所があります。 教えて頂きましたif文のサンプルの中で、 >if ($a) みたいな 書き方した時は、$a の中身が 0 とか null とか "" 以外は true になります。 >ぶっちゃけ中身があれば true です。 という教えから $a = ""; if ($a) { print "true<br>"; } else { print "false<br>"; }は if ("") { print "true<br>"; } else { print "false<br>"; }であり、 結果”false”を返すという事が分かりました。 つまり if ( "" ) { 処理内容 } if ( 0 ) { 処理内容 } if (null) { 処理内容 } は全て”false”を返すという事だと考えました。 が、自分なりにPHP訳してみると、 もし値が無ければ ”true” そうでなければ=値があれば ”false” としか考えられず、 print "if (null) : "; if (null) { print "true<br>"; } else { print "false<br>"; } print "if (!null) : "; if (!null) { print "true<br>"; } else { print "false<br>"; } print "<hr>\n"; この中には値らしきものも見当たらず、 if (null) は常に”false”であると覚え込もうかとも思いましたが、 何だかあきらめきれず、またご質問してしまいました。 でもbm_hiro様のおかげで、取り合えずサイトの作成は進めることが 出来るようになりました。本当にありがとうございます。 心より感謝しております。 私はこの様な掲示板に質問を投稿したのは初めてだったのですが、 見ず知らずの方から、こんなに丁寧に教えて頂けるとは思ってもいませんでしたので、 ご回答を頂いた時は、感動すら覚えた程です。 今後は質問するだけでなく、分かる事があれば回答する側にも回ってみようかと思います。 (PHPに関しては初心者ですが、他のカテゴリーなんかで・・・) 尚、上記の疑問はサイト作成の進行には影響していませんので、 本当にお時間のある時にでも、お思い出したらレクチャーしてやってください。

関連するQ&A

  • call_user_funcやcall_user_func_arrayはどのような時に使うのでしょうか?

    PHPのフレームワーク(Zend Fremeworkやsymfony)のコードをみていると、 call_user_func や call_user_func_array をたまに見かけますが、なぜ、 この関数を使用しているのでしょうか? call_user_func_array('test', array($a, $b)); の代わりに test($a, $b); とできないのでしょうか?

    • 締切済み
    • PHP
  • PHP初心者 再帰処理について

    あるフォルダ以下に含まれる全てのフォルダ名をフルパスですべて列挙するという処理を描こうと下記のブログを参考にして自分で少し書き換えたのですが、うまくいきません。 http://blog.asial.co.jp/12 <参考にした部分> function getFileList($dir) { $files = scandir($dir); $files = array_filter($files, function ($file) { // 注(1) return !in_array($file, array('.', '..')); }); $list = array(); foreach ($files as $file) { $fullpath = rtrim($dir, '/') . '/' . $file; // 注(2) if (is_file($fullpath)) { $list[] = $fullpath; } if (is_dir($fullpath)) { $list = array_merge($list, getFileList($fullpath)); } } return $list; } </参考にした部分> <自分で変更したコード> function getFileList($dir) { $files = scandir($dir); $files = array_filter($files, function ($file) { // 注(1) return !in_array($file, array('.', '..')); }); $list = array(); foreach ($files as $file) { $fullpath = rtrim($dir, '/') . '/' . $file; if (is_dir($fullpath)) { $list[] = $fullpath; $list[] = array_merge($list, getFileList($fullpath)); } } return $list; } </自分で変更したコード> 変更といってもis_fileの部分の削除と$list[] = $fullpath;を追加しただけなのですが、「~ bytes exhausted」というエラーになってしまいます。 再帰関数が内部的にどういう処理をしているのかよくわかってないので、正直変更したコードがどういう動きをしているのかいまいち理解できません。参考書にある再帰関数は腑に落ちないながらも結果としてはそうなるということは理解しました。 あとそれ以前に $files = array_filter($files, function ($file) {   return !in_array($file, array('.', '..')); の部分がわかりません。 scandirの戻り値には要素の最初の方に「.」と「..」が付くのでそれを削除する目的だとブログにはありますが、in_arrayはただ第一引数のものを第二引数から検索するだけのはずなのに、$filesの中身をarray_filtersの処理後に確認してみるとちゃんと「.」と「..」が削除されていて不思議です。あとin_arrayは第一引数のものを第二引数の中から検索するという関数だと思いますが、なぜそれをわざわざ反転させて((array('.', '..'), $file);じゃなく($file, array('.', '..'));)!in_arrayとしてるんでしょうか? *ちなみに引用したブログのコードの動作は確認済みで元のコードは完全に正しいです。引用したコードに文句をつけているわけではなく自分がわかっていないだけです。(^^ゞ 以上です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQLで携帯サイトを開発しています。

    PHP+MySQLで携帯サイトを開発しています。 文字コードはSJISが望ましいということなので、 mb_http_output('SJIS'); mb_internal_encoding('EUC-JP'); ob_start('mb_output_handler'); を入れることで出力をSJISにしたのですが、ドコモでCSSを使用するために header("Content-type:application/xhtml+xml;"); を入れたところ、文字化けしてしまいます。 場所を変えたり、charsetを入れたりしても上手く動きません。 アドバイスいただければ助かります。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • phpコールバック関数について

    php初心者のものですが、コールバック関数(可変関数)についての質問です。 //引数の与えらえられた名前をもつ関数が存在すれば呼び出すための関数 function func_caller($name)(2) { if (function_exists($name)) { (3) $name(); //可変換数をして関数の呼び出し } } function foo() { echo 'foo call', PHP_EOL; } func_caller('foo'); //foo called(1) とあるのですが (1)の関数が(2)に呼ばれて$nameはfooが入ってて (3)が評価されまでわかるのですが次にどうなっていくのかわかりません。 どなたかわかる方いらっしゃいましたらどうか教えていただけないでしょうか? 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • array_mapの再帰処理がうまく行かない

    長文で失礼します。 array_mapでの再帰処理がうまく行かないのでどこが間違っているか教えてください。 まず、このような配列があります。配列の中に配列があります。 $ary = array(1, 2, null, array("a", null, "c")); この配列の中のnullを"なし"という文字列に変換したいです。 array_mapを使って再帰的にやってみました。 まずはうまく行ったコードから。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Nashi($ary)); // nullを"なし"に置換する関数 function null2Nashi(  $in_array ){  if(is_array($in_array)){   return array_map("null2Nashi", $in_array);  } else {   if ($in_array === null){    $in_array = "なし";   }   return $in_array;  } } ------------------------------------------------------ 結果はnullが"なし"に変換されました array (size=4)  0 => int 1  1 => int 2  2 => string 'なし' (length=6)  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => string 'なし' (length=6)    2 => string 'c' (length=1) そしてこの"なし"をコード内で指定するのではなく引数で指定したいと思って無名関数を使って以下のコードにしました。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Str($ary, "なし")); // nullを指定文字列に置換する関数 function null2Str(  $in_array, // null値を含む配列  $in_str // null値を変換したい文字列 ){  $n = function($n_array) use($in_str){   if(is_array($n_array)){    return array_map($n, $n_array); //…(1)   } else {    if ($n_array === null){     $n_array = $in_str;    }    return $n_array;   }  };  return $n($in_array); } ------------------------------------------------------ 結果はnullは何も変換されませんでした。 array (size=4)  0 => int 1  1 => int 2  2 => null  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => null    2 => string 'c' (length=1) どうやら(1)のarray_mapが動作していないようです。要素を分解せずに$nの無名関数に渡さずにそのまま第2引数を返しているだけみたいです。 何か対応方法があるでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのusort関数について

    PHPにおけるusort関数およびuasort uksort関数の使い方がわかりません。 $array = array("b" => "bbbb","c" => "cc","d" => "ddddddddddd","e" => "eee","a" => "a","f" => "ffffffff","g" => "gg","h" => "hh"); 上記のような配列があった場合 uasort($array, function($a,$b){ if (strlen($a) == strlen($b)) { return 0; } if(strlen($a) > strlen($b)){ return -1; }else if(strlen($a) < strlen($b)){ return 1; } } ); print_r($array); 上記のようなコードの場合 ( [d] => ddddddddddd [f] => ffffffff [b] => bbbb [e] => eee [h] => hh [g] => gg [c] => cc [a] => a ) という結果がかえてきます。 ただ、実際このコードでなにがおきてるかわかりません。 まず、uasort関数の第二引数に渡す関数の引数 $a,$bはいったいどんな順番で第一引数の配列からわたされているのでしょうか? そして、$a と$ bの値が同じ場合に0を返した場合なにがおきてるのでしょうか? 同じく return 1;を返すときと return -1;を返すときと いったいどのような処理がおこなわれていてどういうなぜ 上記のような配列を返すことになるのでしょうか? そもそも PHPマニュアルから参照しますが 比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。 上記説明も、どうにも理解できません。 どうも全体的にusort関数系の使い方がわかりません。 識者の方よろしくご教授いただけますようお願いします。

    • ベストアンサー
    • PHP
  • Pythonでcall_user_funcを行う

    お世話になります。 最近Pythonの勉強を始めた初心者です。 GAE/Python2.5で、PHPで言うcall_user_funcを使う方法を探しております。 具体的に言いますと、関数名(メソッド名)を変数に入れて、それを呼び出す方法を探しています。 例えばPHPで言えば下記のようなコードです。 ---------------------- <?php // 呼び出すクラス class CTestClass {   // 呼び出すメソッド   function TestFunc()   {     echo 'Call <CTestClass::TestFunc()>';   } } // 変数にメソッド名を入れて呼び出す $func = 'TestFunc'; $obj = new CTestClass(); call_user_func( array( $obj, $func ) ); // print Call <CTestClass::TestFunc()> ---------------------- Pythonでは上記のような事は可能でしょうか? また、メソッドを呼び出すのと普通のグローバル関数を呼び出すのでやり方が違う場合はそちらも教えて頂けるとあり難いです。 以上、よろしくお願い致します。

  • 22年春 基本情報処理試験 問8 マージソート

    22年春の基本情報処理試験 、問8のマージソートが解らないでいます。 設問2で与えられている、3、8、2、7、5、1という値を関数Sortに渡し、 これを実行すると、 一番最初に関数Mergeが実行される時に、関数Mergeに渡される引数は、 slist1 = 8、num1 = 1、slist2 = 2、num2 = 1になりますよね? それで、関数Mergeを実行して、list[] = {2,8} が返却されるところまでは、 理解できるのですが、その後の動きがわかりません。 僕はいくら考えても、ここで終わっちゃうんです。 どの関数に、どの引数を渡してあげればよいのでしょうか… どなたか教えて下さい。 よろしくお願いします。

  • 【PHP】関数で処理が止まってる??

    お世話になります。 PHPでの質問ですが、PHPに限ったものではないように思いますので、プログラム全般に対しての質問と思って下さって結構です。 ※PHP特有のという意見があれば、それも大歓迎です。 下記のようなコードを組んでみました。 <?php echo "func1の結果["; echo func1(); echo "]"; function func1(){ (内容は割愛) return TRUE; } ?> このコードをアップしてアクセスしてみると   出力結果  func1の結果[ でした。 ブラウザのステータスに「ページが表示されました」とあるので、処理中で出力待ちということはないと思います。 > echo func1(); > echo "]"; の箇所の出力はどうなっていると考えればいいのでしょうか? 「関数の内容次第で・・・」とお答えになる方、どういう内容だとこのような結果になるのかというところでお答えください。 私のプログラムによる根本的な考え方は、プログラムは上から下に順番になので、 上記内容の箇所にどんなコードがあったとしても、func1関数はTRUEを返すので、結果としては「func1の結果[1]」となるはずでした。 でも実際の出力結果をみると処理が途中で(おそらくfunc1()内で)止まっているともいます。 timeoutではないため無限ループに嵌ってっていうのもないと思います。 これはどういうことでしょう???

    • 締切済み
    • PHP
  • phpのarrayについて、この画像で、一番上にあ

    phpのarrayについて、この画像で、一番上にある $arr = array();がなくても成立すると思うんですが、一番上のはどういう意味があるんでしょうか? またarray()のかっこのなかにはなにがはいるんですか?また、どういう呼び名ですか?関数の場合はかっこのなかは引数なので、この場合はなんですか?

    • ベストアンサー
    • PHP