[模擬問題] PHP7初級 – 他のWebサイトやサービスとのやり取り(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: 他のWebサイトやサービスとのやり取り からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

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

  1. リモートのデータを取得するには file_get_contents() 関数を使用することはできないので、curl 系の関数を使う必要がある
  2. curl 系の関数を使う場合は curl_open() 関数でセッションを開き curl_close() 関数でセッションを終了する
  3. curl 系の関数では GET と POST のみ取り扱うことができるため API 連携でよく使われる
  4. http_build_query() 関数は URL クエリ文字列作成に使用できる
  5. レスポンスとして JSON 形式でヘッダー出力する場合には curl_setopt() 関数のオプションとして CURLOPT_HTTPHEADER を使用する

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





























解答

正解は 4. です。

解説

1. リモートのデータを取得するには file_get_contents() 関数を使用することはできないので、curl 系の関数を使う必要がある

リモートのデータを取得するのに file_get_contents() 関数も使用することが可能です。

この問題は「ファイルの操作」でも扱った内容なので、自信がない場合はもう一度確認してみることをお勧めします。
[模擬問題] PHP7初級 – ファイルの操作(エバンジェリスト三雲勇二からの出題)

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

「ファイルの操作」のステップアップでも記載しましたが、file_get_contents() 関数と file_put_contents() 関数は一度にファイルを読み込む仕様ですので、メモリの使用量を考慮する必要があります。
リモートファイルの大きなファイルを読み書きする場合には、ネットワーク速度も関係してくるのでさらに処理が遅くエラーになる可能性が高まります。
また、ネットワーク帯域を専有しないよう気をつける必要などもあります。

リモートのデータを取得するときには、予めどのくらいの容量になるのか?、データを取得する際は他のデータ通信に影響を与えないようになっているか?など、事前に気をつけてください。

2. curl 系の関数を使う場合は curl_open() 関数でセッションを開き curl_close() 関数でセッションを終了する

curl_init() 関数で cURL セッションを初期化した後に、 curl_close() 関数で cURL セッションを終了する流れとなります。
curl_open() という関数は存在しません。

curl 関数の使い方の例です。

// cURL セッションの初期化
$ch = curl_init();

// オプションを設定
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 転送の実行
$html = curl_exec($ch); 

// 出力をデバッグ
var_dump($html);

// cURL セッションの終了
curl_close($ch);

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

curl_init() 関数などの curl 系関数を実行したときにエラーが表示されることがあります。

> PHP Fatal error:  Uncaught Error: Call to undefined function curl_init()

これは curl モジュールが読み込まれていないために発生するものです。
この場合は大きく 3 つ確認する必要があります。

1つめに、curl 自体がインストールされていることを確認します。

curl --version

これでバージョン情報が確認できます。
エラーが表示された場合は、この段階で問題が発生しています。

2つめに、curl 拡張モジュールのインストールを確認します。
CentOS 系で例を上げるなら、

dnf list --installed | grep php-curl

インストールされているパッケージを探すか、ファイルを検索します。

3つめに、拡張モジュールが有効化されているか確認します。

php -m

実行結果の中に curl が存在することを確認します。
phpinfo() でも確認できます。

最後によくあるミスとして、上記のエラーを対策した後にもエラーが消えない場合、ウェブサーバーや php-fpm のサービス再起動漏れなどもあります。
「再起動をすると使えるようになった」と言われた場合は、この作業が漏れていたことが主な原因です。

3. curl 系の関数では GET と POST のみ取り扱うことができるため API 連携でよく使われる

curl 系の関数では GET と POST 以外のメソッドも使えます。
API 連携ではさまざまな HTTP メソッドが利用されます。

特に API 連携でよく使われるものとして、PUT や DELETE など取り扱うことができます。

// POST の場合
curl_setopt($ch, CURLOPT_POST, true);
// POST は別の書き方もあります
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

// PUT の場合
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');

// DELETE の場合
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');

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

curl 系の実装例で $curl の他に $ch という変数名が使われることに疑問を持つかもしれません。
これは cURL handle の頭文字を取っていると言われています。
PHP 公式ドキュメントでも $ch と書かれていますので、変える必要がない場合は変数名も $ch に統一しておくと、他の方が読むときも読みやすくなるかと思います。
ソースコードは書くことより読まれることのほうがはるかに多いので、読みやすいコードを目指す場合は変数名にも気をつけると良いでしょう。

4. http_build_query() 関数は URL クエリ文字列作成に使用できる

選択肢のとおりです。

http_build_query() 関数の使い方は以下のとおりです。

$array = [
    'key1' => 'value1',
    'key2' => 'value2',
];
$query = http_build_query($array);

echo $query;
// key1=value1&key2=value2

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

基本的にクエリ文字列なので、文字列以外を指定する場合は注意が必要です。
例えば、気をつけるべきは次のような値です。

true は 1 になります。数値に変換されるためです。

echo http_build_query(['keytrue' => true]);
// keytrue=1

false は 0 になります。数値に変換されるためです。

echo http_build_query(['keytrue' => false]);
// keyfalse=0

null はクエリ文字列が作成されません。

echo http_build_query(['keynull' => null]);
//

'' 空文字列はキーのみになります。

echo http_build_query(['keyemptystr' => '']);
// keyemptystr=

[] 空配列はクエリ文字列が作成されません。

echo http_build_query(['keyemptyarray' => []]);
//

よくあるミスとして、キーのみ送信したい場合に null を指定しがちですが、正しくは '' 空文字列を指定します。

5. レスポンスとして JSON 形式でヘッダー出力する場合には curl_setopt() 関数のオプションとして CURLOPT_HTTPHEADER を使用する

curl_setopt() 関数含む curl 系の関数はリクエストで使用するものです。
レスポンスとは問い合わせのあったものに対する応答です。
リクエストは問い合わせです。

レスポンスでは header() 関数を使用します。
レスポンスを JSON 形式に指定する場合は通常文字コード指定も含めて以下のように書きます。

header('Content-Type: application/json; charset=utf-8');

上記のコードは、PHP 側で API の応答などでよく使われるテクニックです。

また、 header() 関数は以前にも書いたとおり先にボディレスポンスが発生していると、関数の実行に失敗します。

Warning: Cannot modify header information – headers already sent by 〜

このようなエラーが出た場合は、 header() 関数以前にすでに何らかのボディレスポンスが行われていることが原因です。

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

選択肢の内容で、リクエストで使う curl_setopt() 関数は以下のように使います。

curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ]);

よくある間違いの書き方は下記のような例です。

curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type' => 'application/json' ]); //間違い

連想配列で指定するわけではないので注意してください。

試験の情報

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

無料ウェブセミナーのお知らせ

2022年12月7日(水) にオンラインで『PHP8とPHPの教え方解説セミナー』を無料で開催いたします。
エバンジェリストの私こと三雲も「PHP 8 初心者向け」のテーマで登壇いたします。
こちらのご参加も、どうぞよろしくお願いいたします!

PHP8とPHPの教え方解説セミナー(12月7日@ONLINE)
https://www.phpexam.jp/2022/09/16/php%EF%BC%98%E3%81%A8php%E3%81%AE%E6%95%99%E3%81%88%E6%96%B9%E8%A7%A3%E8%AA%AC%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC12%E6%9C%887%E6%97%A5online/

お申し込みページ(Peatix)
https://peatix.com/event/3359447/view

模擬問題作成及び解説

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

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

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