PHP7初級試験 模擬問題 – 出題範囲: データとロジックの結合:オブジェクトの操作 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!
問題
次の選択肢のなかで、誤っているものはどれでしょう? (1つ選択)
- クラスとインスタンスの関係は、クラスが設計図でクラスを基にした実体がインスタンスである
- クラスにはプロパティやメソッドを含むことができ、インスタンスを作成するときに実行される特別なメソッドをコンストラクタという
Exception
系エラーの例外処理にはtry
ブロックで例外発生を監視しcatch
で例外発生した際の処理を書く- クラスと継承したサブクラスで使用可能なアクセス権として
extend
を指定する - 名前空間が異なる場合は、クラス名が第三者のクラス名と同じでも問題ない
解答と解説は下にスクロールしてください
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
解答
正解は 4. です。
解説
1. クラスとインスタンスの関係は、クラスが設計図でクラスを基にした実体がインスタンスである
選択肢のとおりです。
オブジェクト指向プログラミングでは、中心となるクラスとインスタンスの関係を正しく把握しておくことが重要です。
クラスはざっくり説明すると、変数と関数をひとまとめにしたものになります。
クラスで設計する変数は状態を表すプロパティ、関数は振る舞いを表すメソッドと呼ばれます。
クラスに関連するプロパティやメソッドをひとまとめにするだけではなく、関連性をクラス内に閉じ込めることで変数や関数の影響範囲を最小にすることができます。
また、インスタンスはクラスを基に作成される実体となります。
クラスはあくまで実体のインスタンスを作るための設計図に過ぎません。
オブジェクト指向プログラミングで、オブジェクトとして作成されるのはクラスではありません。
上記説明はあくまでもオブジェクトの初歩です。
オブジェクト指向プログラミングは初心者が躓きやすい項目です。
なかなか1度では本質をつかみにくいと思いますので、理解が難しい場合はなんども反復して学習してください。
【試験合格後もステップアップ!】
インスタンスとオブジェクトは混同しがちなので、正しく理解しましょう。
インスタンスはクラスを基に作成されるオブジェクトの一種です。
ただし、オブジェクトはインスタンス以外でも作成されることもありますし、オブジェクトの用語の意味はインスタンスよりも範囲が広いものとなります。
この包括関係を把握してください。
2. クラスにはプロパティやメソッドを含むことができ、インスタンスを作成するときに実行される特別なメソッドをコンストラクタという
選択肢のとおりです。
コンストラクタとはインスタンスを作成するときに実行される特別なメソッドです。 _construct()
という特別なメソッドを実装します。
【試験合格後もステップアップ!】
コンストラクタは以前の PHP バージョンではクラス名と同じメソッド名で作成するという仕様がありました。
例えば、 foo
クラスのコンストラクタは function foo()
でした。
現在はこの仕様は廃止されています。 古い PHP のソースコードではこの仕様に基づいたコンストラクタに注意してください。
また、インスタンスのプロパティ変数にアクセスした際に、クラスにおいて定義されていない変数である場合でも定義が自動的に生成され値が保存されます。
この機能を動的プロパティというのですが、バグの温床となるため将来の PHP では廃止される予定で議論が進んでいます。
動的プロパティは使わないようにしましょう。
3. Exception
系エラーの例外処理には try
ブロックで例外発生を監視し catch
で例外発生した際の処理を書く
選択肢のとおりです。
例外処理は try - catch - finaly
ブロック構文で表現されます。
まず、 try
ブロック内に例外の発生がある可能性のある処理を記述します。
次に、 catch
ブロック内に例外が発生した場合の処理を記述します。
最後に、 finally
ブロック内には例外発生の有無に関わらず実行される処理を記述します。 finally
ブロックは記載しなくても構いません。
【試験合格後もステップアップ!】finally
と try
もしくは catch
ブロック内に return
文がある場合には注意が必要です。return
文が try
もしくは catch
ブロックの内部に存在した場合でも、 finally
ブロックは実行されます。 return
文は出現した時に評価されますが、 結果は finally
ブロックが実行された後に返されます。 finally
ブロックにも return
文が存在した場合は、 finally
ブロックから値が返されます。
4. クラスと継承したサブクラスで使用可能なアクセス権として extend
を指定する
extend
ではなく protected
です。
private
アクセス権は、自分自身のクラス内のみからアクセスできます。public
アクセス権は、どこからでもアクセスできます。 rotected
アクセス権は、 private
アクセス権より少し広範囲で、継承したサブクラス内からもアクセスできるようになります。
protected function foo()
のようにアクセス権を指定すると、自分自身のクラス以外に継承したサブクラスからもアクセスできるようになります。
【試験合格後もステップアップ!】
アクセス権はできるだけ狭く設定するのが、オブジェクト指向プログラミングを含むすべてのプログラムで重要な考え方です。
基本的には private
アクセス権でプロパティやメソッドは公開し、外部からアクセスが必要になったときに改めて protected
や public
アクセス権に変更するように設計してください
5. 名前空間が異なる場合は、クラス名が第三者のクラス名と同じでも問題ない
選択肢のとおりです。
別の関数内では同じ変数名を使っても問題ないことは、コーディングしている人ならよくご存知かと思います。
これは、関数内でのみ変数名が使われるため、別の関数内の変数に影響を与えないためです。
このような考え方をクラスに展開し、同じクラス名を使えるように拡張するイメージが名前空間です。
名前空間はクラス名を階層構造で表現できるようにできます。
これは、同じファイル名でもファイルの保存先が異なると保存できるイメージをしてみてください。
また、名前空間には同じようなクラス群をまとめるという重要な役割もあります。
これも、ドキュメントと写真は別のフォルダで管理するようなイメージをしてみてください。
【試験合格後もステップアップ!】
名前空間を利用する際には、これまでのグローバル関数などにも一部影響があります。
例えば、 sort()
組み込みグローバル関数は \sort()
のように、グローバル関数であることを明記するために \
を関数前に記載することもあります。