Contents
「第1回 PHP 8 上級 模擬試験」を解説していきます
本記事ではひたすら下記記事の模擬試験の解説をしていきたいと思います!
第1回 PHP 8 上級 模擬試験
https://study.prime-strategy.co.jp/study/ph8ex1/
解説記事一覧
- 【php8上級/準上級試験】模擬問題解説 問題1.~ 3. abstract staticメソッド 整数オーバーフロー
- 【php8上級/準上級試験】模擬問題解説 問題4. __construct() __destruct __call() __callStatic()
- 【php8上級/準上級試験】模擬問題解説 問題5. __toString() 「例外を投げる(throw new \Exception)とは?」 __invoke() __get() __debugInfo()
- 【php8上級/準上級試験】模擬問題解説 問題6. &参照(リファレンス)unset()
- 【php8上級/準上級試験】模擬問題解説 問題7. 名前空間とグローバル空間 use エイリアス(as)
- 【php8上級/準上級試験】模擬問題解説 問題8. error_reporting set_error_handler() 例外捕捉
- 【php8上級/準上級試験】模擬問題解説 問題9. interface implements ArrayAccess
- 【php8上級/準上級試験】模擬問題解説 問題10. SPL RecursiveDirectoryIterator RecursiveIteratorIterator SplFileInfo SplFileObject
- 【php8上級/準上級試験】模擬問題解説 問題11. $_SERVER $GLOBALS $argv $_COOKIE
- 【php8上級/準上級試験】模擬問題解説 問題12. list() iterable
- 【php8上級/準上級試験】模擬問題解説 問題13. 可変変数
- 【php8上級/準上級試験】模擬問題解説 問題14. クラスの型宣言 Null合体代入演算子(??=)
- 【php8上級/準上級試験】模擬問題解説 問題15. private final
- 【php8上級/準上級試験】模擬問題解説 問題16. if for break
- 【php8上級/準上級試験】模擬問題解説 問題17. XSS (クロスサイトスクリプティング) htmlspecialchars()
- 【php8上級/準上級試験】模擬問題解説 問題18. $_FILES
- 【php8上級/準上級試験】模擬問題解説 問題19. CSRF (Cross-Site Request Forgery) random_bytes()
- 【php8上級/準上級試験】模擬問題解説 問題20. $_SESSION
- 【php8上級/準上級試験】模擬問題解説 問題21. ガベージコレクション xdebug_debug_zval()
- 【php8上級/準上級試験】模擬問題解説 問題22. Directory DirectoryIterator SeekableIterator
- 【php8上級/準上級試験】模擬問題解説 問題23.mail()
- 【php8上級/準上級試験】模擬問題解説 問題24. escapeshellarg() escapeshellcmd()
- 【php8上級/準上級試験】模擬問題解説 問題25 php:// stream_wrapper_register
- 【php8上級/準上級試験】模擬問題解説 問題26 htmlspecialchars() htmlentities() strpos()
- 【php8上級/準上級試験】模擬問題解説 問題27 Phar __HALT_COMPILER()
- 【php8上級/準上級試験】模擬問題解説 問題28 function_exists()
- 【php8上級/準上級試験】模擬問題解説 問題29 openssl_encrypt() openssl_decrypt()
- 【php8上級/準上級試験】模擬問題解説 問題30 strtotime()
- PHP セッション名の変更方法と php.ini の記述方法まとめ
- モダンなPHPコードで使用!無名関数の使い方
- 【PHP】stdClass を使用して(object) でキャスト
- 【PHP】プロトコル / ラッパーについて(file:// php:// http:// https://)
- 「PHPでJSONを扱う」json_encodeとjson_decode完全ガイド
- 【PHP】新しい方の指定方法「nullable」
模擬問題 22
関数 に関する説明の中で、誤っているものを1つ選びなさい。
なお「\」はバックスラッシュに読み替えること。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。
Directory クラスのインスタンスを作るには dir() 関数を使います。new 演算子は使いません。
chdir ( string $directory ) : bool
getcwd ( ) : string
DirectoryIterator extends SplFileInfo implements SeekableIterator {
public DirectoryIterator::__construct ( string $path )
RecursiveDirectoryIterator extends FilesystemIterator implements SeekableIterator , RecursiveIterator {
RecursiveIteratorIterator implements OuterIterator {
public RecursiveIteratorIterator::__construct ( Traversable $iterator , int $mode = RecursiveIteratorIterator::LEAVES_ONLY , int $flags = 0 )
SeekableIterator extends Iterator {
RecursiveIterator extends Iterator {
Iterator extends Traversable {
Directory クラスは、ディレクトリ内を走査するためのクラスである。
そのため、以下のコード
$dir_obj = dir(__DIR__);
var_dump($dir_obj);
while (false !== ($entry = $dir_obj->read())) {
echo $entry, PHP_EOL;
}
$dir_obj->close();
を実行すると、結果は次のとおりとなる。
object(Directory)#1 (2) {
["path"]=>
string(10) "/home/php_exam"
["handle"]=>
resource(5) of type (stream)
}
.
..
.cache
.config
(以下略)
Directory クラスとは?
Directory クラスは、ディレクトリの内容を反復処理するための 組み込みクラス です。
read() は 1回の呼び出しごとに1つのエントリを取得 し、エントリがなくなると false を返すため、while ループが終了します。
問題文の内容は正しい⭕です
chdir() 関数はカレントディレクトリを変更する。また getcwd() 関数はカレントのワーキングディレクトリを取得する。
そのため、以下のコード
var_dump(getcwd());
chdir('../');
var_dump(getcwd());
を実行すると、結果は次のとおりとなる。
string(14) “/home/php_exam”
string(5) “/home”
この説明に誤りはありません。内容は⭕です
DirectoryIterator クラスは、ファイルシステムのディレクトリを閲覧するためのシンプルなインターフェイスを提供する。
SeekableIteratorを実装しているため foreach などが使える。
また DirectoryIterator が SplFileInfo を継承しているため、ファイルの情報に纏わるメソッドなどを一通り使う事ができる。
また SplFileInfo クラスには __toString() が実装されているため、ファイルへのパスを文字列で返すことが出来る。
そのため、以下のコード
// 現在のディレクトリを走査
foreach (new DirectoryIterator(__DIR__) as $file) {
if($file->isDot()) {
continue;
}
echo $file, PHP_EOL;
if ($file->isDir()) {
// DirectoryIteratorのインスタンスを使って1階層深いディレクトリを走査
foreach (new DirectoryIterator($file) as $file2) {
if($file2->isDot()) continue;
echo "\t{$file2}", PHP_EOL;;
}
}
}
を実行すると、結果は次のとおりとなる。
.cache
.config
.bashrc
Beginner
sample
src
Advanced
sample
src
(以下略)
のような表記となり、ディレクトリ階層を 1 段深くまで処理する事ができる。
DirectoryIterator と SeekableIterator
DirectoryIterator は SeekableIterator を 実装していません。
項目 | 内容 | 補足・修正点 |
---|---|---|
DirectoryIterator と SeekableIterator | DirectoryIterator は SeekableIterator を 実装していない | DirectoryIterator は Iterator を実装 |
SplFileInfo の継承関係 | DirectoryIterator は SplFileInfo を継承 | getSize() , getMTime() , isDir() などが利用可能 |
SplFileInfo::__toString() | ファイル名のみ を返す | フルパスを取得するには getPathname() を使用 |
new DirectoryIterator($file) | $file->getPathname() を渡すべき | DirectoryIterator は文字列のパスを受け取る |
出力結果の整形 | "\t" によるインデント | OS によってタブの扱いが異なる可能性あり |
よって問題文は誤り❌です
RecursiveDirectoryIterator は、ファイルシステムのディレクトリを再帰的に反復処理するためのインターフェイスである。
ただしこのクラス単体では再帰的な反復処理はできず、RecursiveIteratorIterator クラスを合わせて使う必要がある。
そのため、以下のコード
$directorys = new \RecursiveDirectoryIterator(__DIR__);
$iterator = new \RecursiveIteratorIterator($directorys);
foreach($iterator as $file) {
echo $file, PHP_EOL;
}
を実行すると
/home/php_exam/.cache
/home/php_exam/.config
/home/php_exam/.bashrc
/home/php_exam/Beginner
/home/php_exam/Beginner/sample
/home/php_exam/Beginner/src
/home/php_exam/Beginner/src/1.php
/home/php_exam/Beginner/src/2.php
(略)
/home/php_exam/Advanced
/home/php_exam/Advanced/sample
/home/php_exam/Advanced/src
(以下略)
のような表記となり、再帰的にファイルを処理する事ができる。
よって選択肢の内容は正しい⭕です
問題番号 | 正解の選択肢 |
---|---|
1 | PHPの「最新以外の(古い)コード」は、公式サイトでの提供は全くしていない。そのため、古いバージョンのコードが必要な場合、別途「非公式の外部サイト」からソースコードを入手する必要がある。 |
2 | 論理型 (boolean) は「真偽値」とも呼ばれ、値は true か false か null のいずれかになる。なお、true、false、null の文字は、大文字でも小文字でもよい。 |
3 | 抽象クラスから継承する際、親クラスで abstract としてマークされた全てのメソッドは子クラスで定義する必要があり、可視性は同等(またはより緩い制約)で、必須引数の数は同じであれば型宣言が異なってもかまわない。 |
4 | PHP において、デストラクタは __destruct() メソッドで実装される。親クラスのデストラクタは暗黙的に呼ばれ、呼び出し順序は「子クラスのデストラクタ → 親クラスのデストラクタ」となる。 |
5 | __get() はアクセス不能(protected または private)または存在しないプロパティからデータを読み込む際に使用される。なお、__getStatic() は存在せず、オブジェクトや静的コンテキストで動作しない。 |
6 | PHP のリファレンス渡しを使用すると、関数内で引数を修正できる。(※※正解テキストでは「呼び出す側で変数に & を付ける必要がある」と記載されています。) |
7 | 名前空間は namespace キーワードで宣言する。通常はファイルの先頭に記述する必要があり、名前空間宣言前に書かれたクラスはその名前空間に含まれない。 |
8 | PHP 5 では Exception クラスが全例外の基底クラスだったが、PHP 7 以降は Exception クラスは Throwable インタフェースを基底とし、Error クラスが内部エラーの基底クラスとして導入された。 |
9 | ArrayAccess インターフェイスは、オブジェクトを配列としてアクセスするための機能を提供する。 |
10 | SplFileInfo クラスは、ファイルの情報取得や操作を行うためのクラスである。 |
11 | $_COOKIE は、HTTP クッキーから渡された値が連想配列として格納され、また設定も可能である。 |
12 | PHP 7.1.x では、文字列操作関数で負のオフセット指定が可能となり、[] や {} による文字単位のアクセスも文字列の末尾からのオフセットとして解釈される。 |
13 | 可変変数は、スーパーグローバル変数にも使用できる。 |
14 | PHP 7.4.x では、波括弧を使った配列や文字列のオフセットアクセスの文法は非推奨となった。 |
15 | PHP 8 では、private メソッドの継承に関するルールが変更され、親クラスの同名メソッドの可視性に関係なく子クラスでオーバーライド可能となった。 |
16 | break は、現在実行中の for, foreach, while, do-while, switch 構造の実行を終了し、オプションでネストしたループの何段分を抜けるか指定できる。 |
17 | XSS 対策として、htmlentities() を適切に使用することで、文字列や配列の入力に対して安全な出力が可能となる。 |
18 | アップロードされたファイルの元のファイル名は、$_FILES[‘{formのnameの値}’][‘name’] に格納され、move_uploaded_file() の第二引数として利用できる。 |
19 | uniqid() と mt_rand() を組み合わせることで、暗号論的にランダムな(推測困難な)トークンを生成できる。 |
20 | PHP のセッションでは、セッション ID がクッキーに保存され、session_set_cookie_params() によりそのクッキーのパラメータを設定できる。 |
21 | PHP の変数の参照カウントは、xdebug_debug_zval() で確認でき、オブジェクトを clone した場合は内部的に参照が使われ、一時的に参照カウントが増加する。 |
22 | DirectoryIterator クラスは、ディレクトリ内のファイルやサブディレクトリの情報を取得するシンプルなインターフェイスを提供する。 |
23 | mail() 関数は、メールを送信するための関数で、第四引数で追加のヘッダー情報を指定できる。 |
24 | escapeshellarg() と escapeshellcmd() は、外部入力をシェルコマンドの引数として使用する際に必要なエスケープ処理を行い、どちらを使用しても意味合いは同じである。 |
25 | stream_wrapper_register() 関数を使用すると、新しいストリームラッパー(プロトコルハンドラ)を登録できるが、既に存在する場合は失敗する。 |
26 | strpos() 関数は、文字列内で指定した部分文字列の最初の出現位置を返し、見つからなければ false を返す。ただし、先頭位置の場合は 0 が返るため注意が必要。 |
27 | Phar のスタブには __HALT_COMPILER() が使用され、これ以降のコードはコンパイルされない。 |
28 | function_exists() 関数は、指定された関数が定義されているかどうかをチェックし、存在すれば true を返す。 |
29 | openssl_decrypt() 関数は、openssl_encrypt() で暗号化されたデータを正しく復号し、元のデータを取り戻す。 |
30 | strtotime() 関数は、英語形式の日付文字列を Unix タイムスタンプに変換し、無効な日付の場合は false を返す。 |