[模擬問題] PHP7初級 – データとロジックの結合:オブジェクトの操作(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: データとロジックの結合:オブジェクトの操作 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

次の選択肢のなかで、誤っているものはどれでしょう? (1つ選択)

  1. クラスとインスタンスの関係は、クラスが設計図でクラスを基にした実体がインスタンスである
  2. クラスにはプロパティやメソッドを含むことができ、インスタンスを作成するときに実行される特別なメソッドをコンストラクタという
  3. Exception 系エラーの例外処理には try ブロックで例外発生を監視し catch で例外発生した際の処理を書く
  4. クラスと継承したサブクラスで使用可能なアクセス権として extend を指定する
  5. 名前空間が異なる場合は、クラス名が第三者のクラス名と同じでも問題ない

解答と解説は下にスクロールしてください





























解答

正解は 4. です。

解説

1. クラスとインスタンスの関係は、クラスが設計図でクラスを基にした実体がインスタンスである

選択肢のとおりです。

オブジェクト指向プログラミングでは、中心となるクラスとインスタンスの関係を正しく把握しておくことが重要です。

クラスはざっくり説明すると、変数と関数をひとまとめにしたものになります。
クラスで設計する変数は状態を表すプロパティ、関数は振る舞いを表すメソッドと呼ばれます。
クラスに関連するプロパティやメソッドをひとまとめにするだけではなく、関連性をクラス内に閉じ込めることで変数や関数の影響範囲を最小にすることができます。

また、インスタンスはクラスを基に作成される実体となります。
クラスはあくまで実体のインスタンスを作るための設計図に過ぎません。
オブジェクト指向プログラミングで、オブジェクトとして作成されるのはクラスではありません。

上記説明はあくまでもオブジェクトの初歩です。
オブジェクト指向プログラミングは初心者が躓きやすい項目です。
なかなか1度では本質をつかみにくいと思いますので、理解が難しい場合はなんども反復して学習してください。

【試験合格後もステップアップ!】

インスタンスとオブジェクトは混同しがちなので、正しく理解しましょう。

インスタンスはクラスを基に作成されるオブジェクトの一種です。
ただし、オブジェクトはインスタンス以外でも作成されることもありますし、オブジェクトの用語の意味はインスタンスよりも範囲が広いものとなります。

この包括関係を把握してください。

2. クラスにはプロパティやメソッドを含むことができ、インスタンスを作成するときに実行される特別なメソッドをコンストラクタという

選択肢のとおりです。

コンストラクタとはインスタンスを作成するときに実行される特別なメソッドです。
_construct() という特別なメソッドを実装します。

【試験合格後もステップアップ!】

コンストラクタは以前の PHP バージョンではクラス名と同じメソッド名で作成するという仕様がありました。
例えば、 foo クラスのコンストラクタは function foo() でした。
現在はこの仕様は廃止されています。 古い PHP のソースコードではこの仕様に基づいたコンストラクタに注意してください。

また、インスタンスのプロパティ変数にアクセスした際に、クラスにおいて定義されていない変数である場合でも定義が自動的に生成され値が保存されます。
この機能を動的プロパティというのですが、バグの温床となるため将来の PHP では廃止される予定で議論が進んでいます。
動的プロパティは使わないようにしましょう。

3. Exception 系エラーの例外処理には try ブロックで例外発生を監視し catch で例外発生した際の処理を書く

選択肢のとおりです。

例外処理は try - catch - finaly ブロック構文で表現されます。

まず、 try ブロック内に例外の発生がある可能性のある処理を記述します。
次に、 catch ブロック内に例外が発生した場合の処理を記述します。
最後に、 finally ブロック内には例外発生の有無に関わらず実行される処理を記述します。 finally ブロックは記載しなくても構いません。

【試験合格後もステップアップ!】

finallytry もしくは catch ブロック内に return 文がある場合には注意が必要です。

return 文が try もしくは catch ブロックの内部に存在した場合でも、 finally ブロックは実行されます。
return 文は出現した時に評価されますが、 結果は finally ブロックが実行された後に返されます。
finally ブロックにも return 文が存在した場合は、 finally ブロックから値が返されます。

4. クラスと継承したサブクラスで使用可能なアクセス権として extend を指定する

extend ではなく protected です。

private アクセス権は、自分自身のクラス内のみからアクセスできます。
public アクセス権は、どこからでもアクセスできます。
rotected アクセス権は、 private アクセス権より少し広範囲で、継承したサブクラス内からもアクセスできるようになります。

protected function foo() のようにアクセス権を指定すると、自分自身のクラス以外に継承したサブクラスからもアクセスできるようになります。

【試験合格後もステップアップ!】

アクセス権はできるだけ狭く設定するのが、オブジェクト指向プログラミングを含むすべてのプログラムで重要な考え方です。
基本的には private アクセス権でプロパティやメソッドは公開し、外部からアクセスが必要になったときに改めて protectedpublic アクセス権に変更するように設計してください

5. 名前空間が異なる場合は、クラス名が第三者のクラス名と同じでも問題ない

選択肢のとおりです。

別の関数内では同じ変数名を使っても問題ないことは、コーディングしている人ならよくご存知かと思います。
これは、関数内でのみ変数名が使われるため、別の関数内の変数に影響を与えないためです。
このような考え方をクラスに展開し、同じクラス名を使えるように拡張するイメージが名前空間です。

名前空間はクラス名を階層構造で表現できるようにできます。
これは、同じファイル名でもファイルの保存先が異なると保存できるイメージをしてみてください。

また、名前空間には同じようなクラス群をまとめるという重要な役割もあります。
これも、ドキュメントと写真は別のフォルダで管理するようなイメージをしてみてください。

【試験合格後もステップアップ!】

名前空間を利用する際には、これまでのグローバル関数などにも一部影響があります。

例えば、 sort() 組み込みグローバル関数は \sort() のように、グローバル関数であることを明記するために \ を関数前に記載することもあります。

試験の情報

PHP7初級試験 の詳細およびキャンペーン情報はこちら
https://www.phpexam.jp/summary/novice7/

模擬問題作成及び解説

三雲 勇二
プライム・ストラテジー株式会社 所属。PHP 技術者認定機構で実施している 7 試験 ( PHP8上級 / PHP5上級 / PHP7初級 / PHP5初級 / 徳丸実務 / 徳丸基礎 / KUSANAGI for WordPress ) 含め多数の試験に合格。ペチゾーをデスク周りにおいて日々お仕事しています。
Facebook: facebook.com/yuji.mikumo
Twitter: @maikeru

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次