黄昏より暗きもの、血の流れより赤きもの

黄昏より暗きもの、血の流れより赤きもの

自分の好きな事を好きなように書いて行きます。

PHPで気をつけるべき2つの事例(演算子、クラス、修飾子)

目次



  • 0.始めに

  • 1.演算子「==」と「===」とでは意味が違う

  • 2.クラスの変数の修飾子privateの扱い方に注意

  • 最後に.上記の様な事例を人に説明できる事も大切

0.始めに


筆者はPHPを使い始めて1年の月日が過ぎた。近日就職の試験でPHPの問題が出されたとき全く出来なかった。そこで面接終了後、企業がこのようなプログラミングの問題を出題する理由を4つ考えてみた。


  1. 受験者を落としたいから

  2. 面接で「PHPの欠点は何ですか?」「オブジェクト指向型言語を意識した設計をしていますか?」と聞くより、より受験者の実力を見やすいから

  3. アプリが作れるだけでなく、基本的な事を知っていて欲しいから

  4. キチンと普段からPHPの型やクラスの変数の修飾子を意識して設計して欲しいから

つまりこのような問題には、「こんな事に気をつけて実装するといいよ」という先人のメッセージが詰まっている事に気がついた。そこで本日は就職の試験の模擬問題から、PHPで気をつけるべき2つの事例について話していく。

1.PHPの型指定にくれぐれも注意


1.1:背景


例えばC言語Java言語では変数を定義するとき、「int a;」「double b;」と言った変数の前に型を付ける事が必須だ。しかしPHPの場合「$a = 1;」「$b = 'str';」と型指定をしなくても変数に値が入力できてしまう。これが便利な時と不便な時がある。例えば「if($a == 1)」と書いた時に、誤判定の原因となる事がままにある。以下の例題を見て行こう。

1.2:例題1


「===」は何をするか? 「==」がtrueを返し「===」がtrueを返さないサンプルを示せ。(「Yahoo!がPHPエンジニアを雇う時に聞く質問:Do You PHP はてな」の第8問より)

例題1の解答


「==」は文字列の冒頭に数字があれば同じ物と判定するが、「===」は二つの変数の型が一致するときのみtrueを返す。例えば、10 == '10X'では冒頭に10が一致するのでtrueとなるが、10 === '10X' ならばfalseを返す。

1.3:例題2


次の空欄を埋めよ。wrong.phpの実行結果は、__________となり、right.phpの実行結果は__________となる。

wrong.php

right.php

例題2の解答


wrong.phpの実行結果は、「++100100x」となり、right.phpの実行結果は「+10x100100x」となる(答)


ここでwrong.phpとright.phpの主な違いは、



  1. 使ってる演算子が違う。wrong.phpでは「==」、right.phpでは「===」となっている。

  2. if文の中身が違う。wrong.phpでは「10」、right.phpでは「"10"」となっている。

このため、wrong.phpでは例題1より「配列の要素の内、10と含まれている要素の場合に+を出力」と言う意味となり、right.phpでは「配列の要素の内、文字列"10"と完全に一致する要素がある場合に+を出力」と言う意味となる点に注意。

1.4:if文の判定ミスを防ぐには?


こうした事態を防ぐには、C言語Javaと「==」の挙動が違うため、「==」の代わりに「===」を使う等の対策が必要だ。if文内の書き方(文字列なのか数値なのか?)を気をつけるとともに、変数の型を意識したコーデイングを心がけたい。

2.クラスの変数の修飾子の扱い方に注意


昨今はWebの世界でもHadoop*1Javaを土台とした、オブジェクト指向型言語に関する技術が脚光を浴びている。そんな最中、PHPもクラスを使えるようになった。しかしJavaがコンパイルエラーで止めてくれる所をPHPは止めてくれる事がある。以下の例題を見てみよう。

2.1:例題1


オブジェクト指向型言語のクラスの変数における修飾子public、private、protectedの意味を説明せよ。

例題1の解答



  • private修飾子:自分自身が含まれるクラス内からしかアクセスできない

  • protected修飾子:同じパッケージ及び継承するサブクラスからしかアクセスできない。

  • public修飾子:全ての場所からアクセス可能。

2.2:例題2


例題2の解答


num1 = 1,num2=3,num3=5,num4=1,num5=,num6=5(答)。

注意するべき点


例題2を見ての通り、private修飾子の変数がAクラスのサブクラスであるBクラスで呼ばれているにも関わらず、エラーにならずそのまま実行されてしまう。Javaで同じような事をすればコンパイラが止めてくれる所だが、PHPではそうでない点は気をつけたい。尚実際にJavaだとどうなるのかを知りたい方は、過去の記事「クラスの継承とクラス変数の修飾子に関する問題(プログラム勉強中)」を見て欲しい。

最後に.上記の様な事例を人に説明できる事も大切


ちなみにこういった注意するべき点を、人に説明できるようにする事も大切だ。例えば面接の場で「PHPの欠点は何ですか?」と聞かれたら、


  • 変数の型指定が無いので思わぬエラーにつながり易い点です。演算子「==」の使い方を誤ると、間違った文字列がtrueとなる事があるので、普段から「===」を使う等して誤判定を防いでいます。

  • クラスの扱いがJavaと違う点です。クラスのprivate修飾子を付けたときの挙動がJavaと違うので気をつけています。

と言うように説明できるようにしておくと、普段からコーデイングに活かす事につながる。以上で今回の記事をお開きとする。最後まで読んでくれた読者に感謝したい。

*1:大規模データの分散処理を支えるJavaソフトウェアフレームワーク