2017年9月22日金曜日

forおじさん

なんでもかんでも、ループ処理に for を使う年配プログラマーの事を言うそうです。
おそらく、C言語から入った人ではないでしょうか?
たしかにPHPでは for って滅多に使いませんね。

forを見ると、無性に他の処理で置き換えたくなることもあります。
だって、forはめんどくさい場合が多いですもん。

たとえば、

max = count($a);
for (i=0;i<max;i++) { $a[i] }

こういう無駄に複雑な処理!

foreach ($a as $item) {$item}
としたほうが、扱いが非常に楽です。
楽ってことは、バグが入りにくいです。

さらに処理内容によっては、map系など各要素にコールバック関数を適用する関数を使うとさらにスマートで不具合が出にくくなります。

まぁ、foreach だけ使ってれば大抵問題なし。 便利すぎます。

whileもありますが、私はforeachじゃ面倒な場面で使う程度です。滅多に使いません。

phpマニュアルにあるような例

$i = 1;
while ($i <= 10) {
    echo $i++;
}

これだと、while ではなく for を使います。

for ($i=1; $i <= 10; $i++) { echo $i;}

可読性の問題です。

まとめると

①配列をループで取り出す場合は、foreach。
②条件でループさせるる場合は、while。※初心者が意図せず無限ループさせる鬼門
③決まった回数をループさせる場合は、for。
④配列の各要素で処理するなら、集合関数。※foreachにする場合もあり

①と④は似てますが、たとえば①は途中でbreak;が行えますが、④は必ず全ループです。
あとは、スコープの違いがあるため、変数の扱い方が異なります。

ちなみに
「foreach の最中に、元の集合を追加・削除するのは禁忌事項です」
という情報を見かけたが、PHPのforeachを理解していないと思われます。
元の集合を追加・削除する時こそ、foreachが有効だし、これができるというのがforeachの特徴である。


セキュリティーに精神論はやめよう

たまに精神論でセキュリティーを語る人や、精神論者vs現実主義者の言い争いを見かけます。
簡単な例ですが、※あくまで例

精神論でいくと、1カ所対策を徹底するだけで良い。だから1カ所の対策のみでよい。

現実は、そこをミスって脆弱の発生。

なので現実主義者は、2か所以上で対策を行い、万が一片方がミスっても突破されないようにするべきと唱える。
一カ所のみというのは、ミスに対して脆弱である。

長く大量のコードを扱ったり見ていたりすれば明白です。
人間は必ず間違う物。可能性がある物はいずれ現実になります。

徹底すればよいという、非現実的な精神論はやめるべきです。

ちなみに二重にする以外には、ミスしにくい構造を作る事ですね。
フレームワーク側で強制させることです。※ある意味これも二重対策
たとえば、$_POSTをバリデーション後に別変数へ格納unsetし、外部からのデータを直接使えなくする仕組み等。
使っちゃだめと決めても、使えるってことは使っちゃう人が出るということです。なので使えなくします。

こういう考えは、プログラミングに限らず、仕事の仕組みとして非常に重要です。

2017年9月21日木曜日

staticメソッドの呼び出しは、selfでなくstaticにしよう

その前に、「$this」はまだしも「$this->」で呼び出すのはやめましょう。
静的なのかインスタンスがあるのか、構造がわかりにくくなります。

selfは、古くららphpを使っていた人がよく使います。
staticは5.3から追加された遅延静的束縛機能です。

selfだと、クラスを継承した時にselfが継承クラスに置き換わらないので、非常に面倒です。
継承禁止のクラスでのみ使うべきです。
でないと、親クラスからコピペしまくり状態という、悲惨なコーディングになります。

statcは、簡単に言えば、呼び出されているクラスに置き換わります。
これがちょっと曲者でして、

selfで呼び出した先でstaticで呼び出すと、selfで呼び出されているクラスに置き換わります。

selfはコンパイル時に静的にクラス名が入り、staticは実行時に動的に入るイメージをすれば良いと思います。

まぁ、ややこしくなって不具合の元なので、staticで統一しましょうってことです。