読者です 読者をやめる 読者になる 読者になる

恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

PHP Advent Calendar jp 2011〜気になったものをピックアップ その1〜

[php]

PHP Advent Calendar jp 2011で気になったものをピックアップと感想を。

まとめは下記。
PHP Advent Calendar jp 2011 まとめ



フレームワークで語るMVCの話 PHP Advent Calendar #19

php:cakephp,Symfony 2
ruby:rails
python:Django
それぞれのフレームワークの特徴とMVCのお話。
筆者のオススメはSymfony 2。
Symfony 2のメリットとしては、

必要な機能をライブラリの形で独立して作り上げたコンポーネントの集合体

以前cakephpを、現在はcodeigniterを使っているが
cakephpはファイル名の命名規則など事細かにルールががっちりしてたが、
codeigniterはルールなどはあまりなく、最小限の必要機能だけあってやりたいようにやっちゃってー的でかなり印象が違った。
symfony 2もcodeigniterと似ている感じなのか・・な・・

あとは、controllerにロジックを書きすぎてはいかんという話。これは常に意識しよう。




isset() 関数にご用心! ( #phpadvent2011 Day 17 )

変数や要素確認で使うisset()関数の落とし穴の話。
■落とし穴1,
・存在している要素,値がnullの場合は「false」を返す。
・配列要素の存在の確認には、array_key_exists() が良いみたい。

■落とし穴2,
・文字列が数値に変換される場合があるので、配列の要素の要素などの確認に使うと意図しない挙動が起きる可能性がある。
引用:

 <?php
 $noodles = array(
     'udon'  => 'white',
     'soba'  => 'gray',
     'pasta' => 'yellow',
     'malony' => null,
 );

isset($noodles['udon']['color']); // true (えー、うそん!)
echo $noodles['udon']['color']; // 'w' が出力される (なにそれ?)

結論としては、
・$noodles['udon'] は「white」という文字列
・文字列変数に続く [] 内の文字列「color」は数値「0」に変換される
・$noodles['udon'][0] は、「white」の 1 文字目の 'w'
_isset() 関数での評価も true
詳しくは本家を。
2つ目は知らなかった。
以下、似たようなやつを改めて確認してみた。

if($var) isset empty is_null
$i=1 TRUE TRUE FALSE FALSE
$i=""; FALSE TRUE TRUE FALSE
$i=0; FALSE TRUE TRUE FALSE
$i=NULL; FALSE FALSE TRUE TRUE
$i FALSE FALSE TRUE TRUE
$i=array() FALSE TRUE TRUE FALSE
$i=array(1) TRUE TRUE FALSE FALSE



'==' による文字列比較をしてはいけないことを理解する #phpadvent2011 16th

文字列の比較に「==」を使ってはいけないという話。
まずは引用。

<?php
if ( "01" == "1" ) {
    echo "SAME";
} else {
    echo "DIFFERENT";
}
//結果:SAME

ひぃぃぃぃぃぃぃぃぃ〜
知らなかった。。。
ダブルクオテーションなしなら分かるが、
くくっているので文字列として扱われると思っていた・・・orz

こうなる原因の結論としては、
・==演算子で比較した際にphpの内部では、zendi_smart_strcmp関数が呼ばれる。
・zendi_smart_strcmp関数はまず数値と扱える場合は数値として、それ以外を文字列として比較をする。
なので、ダブルもシングルクオートも関係なしということに。
勉強になりました。
詳しくは本家を。



残りは次回で〜