初心者から中々抜け出せない
1から処理をかけない
そんな悩みを抱えたプログラミング学習者に向けて、「脱初心者のためのプログラミング学習」についてPHPを例にまとめました。
やり方自体は同じですので、他の言語をメインとしている人は自分の環境に置き換えながら学習して、初心者から抜け出しましょう。
最後まで読み、これが日頃からの習慣となれば、脱プログラミング初心者はすぐにやってくるはずですよ。
「コピペで動いた」は卒業しよう
ネットで調べてサンプルコードを貼り付けるだけでも動くようなプログラムは数多く存在します。もちろんそれで完成すれば問題ありませんが、プログラミングの技術をより実践レベルで身につけるのであれば、「コピペで動いた」というような初心者状態から脱却しなければなりません。
そのためには、コードをじっくり読むことです。長いコードや知らない関数や記述が多いと読むこと自体を諦めてしまいがちですが、それではいけません。
最初は短いコードから挑戦して、徐々にコードを読む耐性をつけていきましょう。そうすれば、どこを触ればどのように変わるか、何故エラーになってしまうのかが見えてきます。
もしコピペで使用しているコードがあれば、一度その処理を最初から追いかけてみてください。そうすれば、必要のない処理に気づけたり、エラーの可能性を回避することにも繋がります。まずは上から1行づつ読んで、実際の動きに合わせて順番通りに読むようにしてみるのが良いでしょう。知らない関数や記法は、その都度調べることです。ここをサボってしまえば、結局は「今、何しているかわからない」という状態に陥ってしまい、結局はわからない処理を続けてしまうことになるからです。
変数の中身を理解する
今回はPHPで処理の読み解き方、変数の状況確認の手順をご説明します。
値は基本的に変数に入れてやり取りされます。お問い合わせフォームで送信ボタンを押しても、まずはグローバル変数の$_POSTにデータが入ります。最初はどんな状態になっているのか、10行目にはどうなっているのか、このように1行ずつどう変化しているのかを諦めずに追っていくことこそが大切なのです。
では、以下の処理を見てみましょう。
<?php
function shori($post){
if(empty($post)){
return;
}
$ng_list = [
'name' => 'YQUAL',
'fruit' => 'りんご',
'fish' => 'いわし',
];
$omake = [
'omake' => 'ケーキ',
];
$result = array_diff($post, $ng_list);
if( count($result) === 3 ){
$result = array_merge($result, $omake);
}
return $result;
}
?>
NGなければ「ケーキ」あげるよ
<form action="" method="post">
名前:<input type="text" name="name" value=""><br>
果物:<input type="text" name="fruit" value=""><br>
お魚:<input type="text" name="fish" value=""><br>
<input type="submit">
</form>
【結果】
<pre>
<?php var_export(shori($_POST)); ?>
</pre>
名前、果物、お魚を送信して、それぞれのNGワードがなければおまけにケーキをくれるというものです。どんなことに役立つかは気にせずいきましょう。
では、このプログラムはどのように動いているのかを、以下の点に注目しながら見ていきましょう。
- 何を入れたのか
- 何が行われているのか
何を入れたのか(開始)
まず重要なのは何を入れたのか、という開始地点です。まず、上半分のPHPを見てみましょう。
<?php
function shori($post){
if(empty($post)){
return;
}
$ng_list = [
'name' => 'YQUAL',
'fruit' => 'りんご',
'fish' => 'いわし',
];
$omake = [
'omake' => 'ケーキ',
];
$result = array_diff($post, $ng_list);
if( count($result) === 3 ){
$result = array_merge($result, $omake);
}
return $result;
}
?>
2行目からshoriという関数が作られていますね。そして、カッコの終わりを追っていけば19行目まで続いているので、PHP部分はshori関数を定義しているということがわかります。
では、その関数がどこで実行されているのかを、下半分を見てみましょう。
NGなければ「ケーキ」あげるよ
<form action="" method="post">
名前:<input type="text" name="name" value=""><br>
果物:<input type="text" name="fruit" value=""><br>
お魚:<input type="text" name="fish" value=""><br>
<input type="submit">
</form>
【結果】
<pre>
<?php var_export(shori($_POST)); ?>
</pre>
11行目のPHP部分にshoriという記述があります。ここが発火地点ですね。
<?php var_export(shori($_POST);); ?>
var_exportは受け取った値をHTML上に出力するために使っています。囲っているpreタグは出力されたコードを行替えしてくれるので、可視性を良くするために使っています。
そして、shori関数には引数がついています。関数を定義する2行目にあるshoriの後ろのカッコ内に入れている$postです。
shori関数を発火させる時には、$_POSTという変数をセットしていますね。これはグローバル変数ですので、コード内で宣言されていなくても使用することができます。
$_POSTにはPOSTフォームで送信した値が配列でセットされるので、データを送信していない状態では「array()」になります。
では、以下のように入力して送信を押せば、どういった値が入るのか見てみましょう。
$_POSTの中身
array (
'name' => 'YQUAL',
'fruit' => 'みかん',
'fish' => 'たい',
)
shori関数に引数としてセットしている$_POSTの中身は上記のようになっています。これがセットした最初の値になります。
何が行われているのか(処理)
関数にセットした$_POSTの中身がどうなっているかわかりました。
次は、shori関数内でどういった処理が行われ、それぞれの変数には何が入れられているのか、どういった処理がされているのかを追っていきましょう。
<?php
function shori($post){
if(empty($post)){
return;
}
$ng_list = [
'name' => 'YQUAL',
'fruit' => 'りんご',
'fish' => 'いわし',
];
$omake = [
'omake' => 'ケーキ',
];
$result = array_diff($post, $ng_list);
if( count($result) === 3 ){
$result = array_merge($result, $omake);
}
return $result;
}
?>
3行目を見てみましょう。
if(empty($post))
if文で条件分岐を行っています。その条件式はempty($post)ですね。
$postには引数として受け取った値が入っているので、shori関数を発火した時点での$_POSTの値ですね。emptyは空かどうかを判定するために使われるので、$post($_POST)の中身が空かどうか確かめています。
【PHP公式マニュアル】empty
初期状態の$_POSTは空配列のため、この条件に一致します。そのため、if文の中に書かれたreturnという処理が行われ、関数が終了します。
returnで戻り値をしていないので、この場合shori($_POST)の結果はnullとなります。
初期状態通りですね。
emptyで確認した結果、空でなければ次の処理に進みます。なので、先程と同じ値を送信してみましょう。
array (
'name' => 'YQUAL',
'fruit' => 'みかん',
'fish' => 'たい',
)
$postの中身が空では無くなったので、3行目のif文はスキップして次の処理に移ります。
次は$ng_listという変数に配列をセットしています。変数名の通り、ここで配列として設定されているものが各値のNGワードです。今回であれば名前(name)で送信したYQUALが該当しますね
$ng_list = [
'name' => 'YQUAL',
'fruit' => 'りんご',
'fish' => 'いわし',
];
次は$omakeという変数に配列がセットされています。これが、NGが無かった際にくれる「ケーキ」のようです。
$omake = [
'omake' => 'ケーキ',
];
では次の14行目の処理を見てみましょう。
$result = array_diff($post, $ng_list);
$resultという変数に、array_diff($post, $ng_list)の結果を入れています。
array_diffという関数は、配列の引き算のようなものです。引かれる対象が第一引数の$post、その判定にしようされる配列が第二引数にセットされている$ng_listになります。
【PHP公式マニュアル】array_diff
$postと$ng_listで一致しているものは、「‘name’ => ‘YQUAL’」なので、array_diffの結果では排除され、その値が$resultへセットされます。
15行目の$resultの中身
array (
'fruit' => 'みかん',
'fish' => 'たい',
)
では15行目の処理を見てみましょう。
if( count($result) === 3 )
if文で条件分岐をしています。countという関数に配列をセットした場合は配列内の要素数を計算してくれます。$resultの配列にはfruitに「みかん」と、fishに「たい」の2つです。
条件式では===で配列内の数と3が一致しているかどうかを確認しています。
今回は1つNGワードがあり、15行目の段階では配列内に要素が2つしかありませんので、if文内の処理はスキップされて18行目へ移動します。
return $result;
returnの後ろに値をセットすることで戻り値とすることができます。32行目のvar_exportには戻り値としてセットされた$resultの中身が返ってくるので、結果は以下の通りです。
では、次はNGワードを回避するために、名前を「すみれ」にして送信してみましょう。
それでは14行目の処理をみてみましょう。
$result = array_diff($post, $ng_list);
最初に$resultの変数に値をセットしたポイントです。$postの中身と$ng_listの中身で一致するものがないため、array_diffの関数の結果は$postと同じになります。
array (
'name' => 'すみれ',
'fruit' => 'みかん',
'fish' => 'たい',
)
次に15行目の処理です。
countの結果、配列の中身に3つの要素が見つかったので3が返ってきます。===のチェックで3と一致したので、16行目のif文内の処理が実行されます。
$result = array_merge($result, $omake);
array_mergeの関数では、引数にセットされた配列を合わせることができます。$resultに入っている関数と、$omakeに入っている「’omake’ => ‘ケーキ’」の配列を合わせた結果は以下の通りです。
array (
'name' => 'すみれ',
'fruit' => 'みかん',
'fish' => 'たい',
'omake' => 'ケーキ',
)
上記の配列が$resultへ新たにセットされます。これでif文内の処理は終わり、最後のreturn $resultで、おまけのケーキが追加された配列が返されます。
無事おまけのケーキが追加されました。
このように、1行ずつ分解して見ていき、その都度変数の中身がどうなっているのか、どういった処理がされているのかを理解していくことが大切です。わからない関数や記法で書かれていたり、長文にもなるプログラムは読むのが大変ですが、自分が動かしているものであれば1つずつゆっくりと処理を追っていくことです。
まとめ
いかがだったでしょうか。
今回は「脱初心者のためのプログラミング学習」について、処理の追い方をご紹介しました。
現在Webプログラミング学習に取り組んでいたり、実務でPHPを使う機会がある人は、ぜひ参考にしてみてくださいね。