[模擬問題] PHP7初級 – フレームワーク、パッケージ管理、メールの送信(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: フレームワーク、パッケージ管理、メールの送信 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

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

  1. Composer を使用して composer.json に書かれたパッケージをインストールするコマンドは compose -i である
  2. Composer でインストールしたパッケージを読み込むには、ソースコードで use ‘vendor/autoload.php’; と記述する
  3. Swift Mailer では Swift_Message オブジェクトを作成し、To プロパティでメール宛先を、Body プロパティでメール本文を指定する
  4. Zend Framework フレームワークは PHP に標準で含まれる
  5. Laravel フレームワークは Blade テンプレートエンジンを標準サポートする

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





























解答

正解は 5. です。

解説

1. Composer を使用して composer.json に書かれたパッケージをインストールするコマンドは compose -i である

Composer を使用して composer.json に書かれたパッケージをインストールするコマンドは composer install です。

スペルミスで多いのですが、compose コマンドではありません。
また、composer -i というオプションは存在しません。

似たようなファイルで composer.lock というものがあります。
こちらには、インストールされた時点のパッケージのバージョンが記載されます。
composer.lock がある状態では、原則こちらの情報を利用してインストールされます。
なぜなら、Composer でインストールされたパッケージのバージョンが異なることにより動作が変わることを防ぐためです。
チームなど共同で開発する場合には、同じ環境を用意するという意味で非常に重要なファイルとなります。

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

Composer でインストールできるパッケージは Packagist で探すことが可能です。

Packagist
https://packagist.org

例えば、テストユニットで有名な PHP Unit は次のページで確認できます。

Packagist – PHP Unit
https://packagist.org/packages/phpunit/phpunit

Composer でパッケージを管理する場合、requires でいろいろなパッケージが自動追加されます。
そして、requires で自動追加されたパッケージにも requires が含まれます。
複数のパッケージをインストールする場合、この requires で指定されているパッケージがかぶってしまい、一部バージョン衝突に気をつけるケースも出てくるかもしれません。

2. Composer でインストールしたパッケージを読み込むには、ソースコードで use ‘vendor/autoload.php’; と記述する

use 演算子は名前空間のエイリアスを作成するものです。

PHP マニュアル – 名前空間の使用法: エイリアス/インポート
https://www.php.net/manual/ja/language.namespaces.importing.php

オートローダーは、クラスやインターフェイスが定義されていなくても自動的に読み込むための機能です。

PHP マニュアル – クラスのオートローディング
https://www.php.net/manual/ja/language.oop5.autoload.php

Composer でインストールしたパッケージはオートローダーを利用して読み込みますが、オートローダーが書かれている PHP ファイル自体を読み込む場合は requirerequire_once を利用します。

require 'vendor/autoload.php';

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

PHP ファイルを読み込むものに includeinclude_once がありますが、こちらを使わない理由は当然、読み込み時にエラーが発生しないためです。
Composer でインストールしたパッケージは当然必須なので、読み込めなかった場合にはエラーにしておかないと問題となります。

また、PHP のオートロードには PSR に準拠すると良いでしょう。
PSR-0 と PSR-4 がオートロードに関するドキュメントになりますが、PSR-0 は現在は非推奨のため PSR-4 に準拠すると良いでしょう。
composer.json"autoload": { "psr-4": {} } の形で追加することができます。
書き換えただけでは反映されないので、composer dumpautoload コマンドを実行して反映させる必要があります。

PHP-FIG – PSR-4: Autoloader
https://www.php-fig.org/psr/psr-4/

オートロードには __autoload() 関数がありましたが、こちらは PHP 7.2 で非推奨となり、PHP 8.0 で廃止となりました。

3. Swift Mailer では Swift_Message オブジェクトを作成し、To プロパティでメール宛先を、Body プロパティでメール本文を指定する

Swift Mailer では Swift_Mailer オブジェクトを作成します。
メール宛先は setTo() メソッドで、メール本文は setBody() メソッドで指定します。

メールを送信するには、次のようなステップで行います。

Composer で Swift Mailer をインストールします。

composer require swiftmailer/swiftmailer

オートロードで Swift Mailer を読み込みます。

require_once './vendor/autoload.php';

メールを送信します。

$transport = Swift_SmtpTransport::newInstance('smtp.example.com', 25);
$mailer = Swift_Mailer::newInstance($transport);

$message = new Swift_Message();
$message->setFrom(['user1@example.com' => 'Sender']);
$message->setTo(['user2@example.com', 'user3@example.com']);
$message->setSubject('メールの件名');
$message->setBody('Swift Mailer - メール送信テストです。');

$mailer->send($message);

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

メール送信したのにメールが届かない場合、大きく2つの原因が考えられます。
送信サーバー側の問題で送信できない場合と、受信側の設定でメール受信ができない場合です。

送信サーバー側の問題は、主にメールサーバーへの接続ができないケースが多いです。
また、メール送信サーバーに常に接続できる保証はないため、エラー処理は必須です。
こちらはメール送信時にエラーがログなどで調査できるので、まだ比較的調査がしやすいです。

また困ったケースとして、受信者のメールアドレスが RFC 違反のメールアドレスで作成されていることが原因というケースもあります。
これが厄介な点は、docomo や au などの携帯キャリアメールで存在していることです。
この RFC 違反のメールアドレスは、メールアドレスは存在するのに、そもそも送信できない場合があります。
また、入力バリデーションでも存在するメールアドレスをエラーとして弾いてしまう事も考えられます。

NTT Docomo – 特殊な形式のアドレス(RFC違反アドレス)のご利用について
https://www.docomo.ne.jp/service/docomo_mail/rfc_add/

より問題なのは、受信側の設定でメール受信ができない場合です。
わかりやすいものは、迷惑メールに分類されてしまっている例です。
メールは送信元メールアドレスは原則自己申告です。
そこで、そのメールアドレスが正しい送信サーバーから送信されているか確認する方法が必要です。
その仕組として SPF、DKIM、DMARC、BIMI などを把握し設定することが重要です。
これはネットワークスペシャリストレベルの基礎知識となりますので、初級者には難しいかもしれません。
ネットワークに強い上級エンジニアにシステム構成をレビューしてもらうことも必要になるかもしれません。

他にも、受信側メールサーバーの仕様で受信できないメールというのも存在します。
例えば、ファイルサイズが大きな添付ファイルをつけたメールは受信メールサーバー側が自動的に破棄しているケースなどが該当します。
受信側メールサーバーはそのメールサーバーを管理している会社の設定に依存しており、公開されていないことも多いため、原因の切り分けに苦労することもあります。

このようにメールを安定して相手に届けるというのは、運用としてかなり気を使うものなのです。
安定して確実にメールが相手に確実に届くということはない、という前提でシステム設計することも重要です。

では、メールが確実に相手に届いているのにはどうしたら良いのか?という点です。
新規ユーザー登録画面で、一度メールに登録用 URL が届いて、続きはそちらから継続する場合がありますよね。
または、新規ユーザー登録後に、メールに届いた認証コードを入力させる場合がありますよね。
これは、相手にメールが届いていることを確実に確認する一つの手法になります。

まずは一度でも確実にメールが届いていることを確認しておくと、後々の運用でメールが届かなくなったときの問題点の切り分けが少ししやすくなります。

4. Zend Framework フレームワークは PHP に標準で含まれる

フレームワークは別途導入する必要があります。
Zend Framework フレームワークも PHP とは別に導入する必要があります。

Zend Framework と似た言葉で、Zend Engine があります。
こちらは PHP のインタプリタで、PHP に標準で含まれています。
エンジンとフレームワークを混同しないようにしましょう。

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

現在 Zend Framework は Laminas Project という Linux Foundation によってホストされるコミュニティ主体 OSS プロジェクトへ移管されています。

Zend Framework – Endings and Beginnings: Goodbye, and Please Welcome the Laminas Project!
https://framework.zend.com/blog/2020-01-24-laminas-launch.html

他にも、PHP 標準関数には zend_version() 関数など zend という文字を含んでいるものもあります。
それぞれ、Zend Technology 社がもとになった名前です。
Zend Technology 社は買収されており、現在は Zend by Perforce として残っています。

5. Laravel フレームワークは Blade テンプレートエンジンを標準サポートする

選択肢のとおりです。

Laravel フレームワークでは Blade テンプレートエンジンを採用しています。
テンプレートエンジンには他にも、Twig や Smarty などがあります。

テンプレートエンジンは MVC モデルや MVVM モデルのビューを担当する箇所になります。
テンプレートエンジンを利用すると、PHP から表示部分を分離することができ、フロント側のデザインが分業しやすくなるメリットがあります。

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

PHP はもともと HTML に埋め込む言語としての特徴がある言語です。
テンプレートエンジンを使用しなくても、素の PHP で同様の実装することが可能です。
フレームワークが使用しているからといって、他の手法で対応することも可能です。

ただし、大抵はフレームワークのお作法に則った作り方をしている方が良いケースがほとんどです。
フレームワーク自体のバージョンアップなどの際にはネット上に知見が多く存在し、混乱せずアップデートできるためです。
また、チームで開発している際に、新たな人材に応援を頼みやすいというメリットもあります。

試験の情報

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をコピーしました!
目次