初めてのPHPを読んで詳細に調べたくなったところまとめ

[プログラミング始めて1か月の超初心者がPHP7技術者認定初級試験を受けてみた](https://qiita.com/desho/items/90ae697783ce5c0dcefa)で学んでいた[初めてのPHP](https://www.oreilly.co.jp/books/9784873117935/)。
私が読み進めながら、少し疑問に思って調べたところを整理します。
私と似たようなところを疑問に感じた方が、この記事を参照して本が読みやすくなれば幸いです。

実行環境は PHP 7.3.7 です。

# 2章 テキストと数の操作

## [printf()](https://www.php.net/manual/ja/function.printf.php)

### 丸めに注意

```php:printf('%.1f',$num);
$num = 5.24;  // 5.2
$num = 5.25;  // 5.2
$num = 5.251; // 5.3
$num = 5.26;  // 5.3
```
### [sprintf() ](https://www.php.net/manual/ja/function.sprintf.php)との違い
printf() は出力した文字列の長さが戻り値。
sprintf() はフォーマットされた文字列が戻り値。


# 3章 ロジック：判定と繰り返し

## [strcmp()](https://www.php.net/manual/ja/function.strcmp.php)

### [strcasecmp() ](https://www.php.net/manual/ja/function.strcasecmp.php)との違い
strcmp() は大文字小文字を区別する。
strcasecmp() は大文字と小文字を区別しない。
戻り値が異なる。

```php:\$a=1,\$b=5
print strcmp($a, $b);      // -1
print strcasecmp($a, $b);  // -4
```
```php:\$a='abc',\$b='def'
print strcmp($a, $b);      // -1
print strcasecmp($a, $b);  // -3
```
```php:\$a=2,\$b=26978
print strcmp($a, $b);      // -4
print strcasecmp($a, $b);  // -4
```

### [宇宙船演算子 <=> ](https://www.php.net/manual/ja/migration70.new-features.php)との違い

宇宙船演算子は戻り値が -1, 0, 1 のいずれか。
宇宙船演算子は文字列を数値に変換する。

```php:\$a='5bc',\$b=367
print strcmp($a, $b);  // 1  先頭の 5 と 3 とを比較
print $a <=> $b;       // -1 数値変換して 5 と 367 とを比較
```

# 7章 ユーザとの情報交換：Webフォームの作成

## [$_SERVER](https://www.php.net/manual/ja/reserved.variables.server.php)

### 'PHP_SELF' が XSS のセキュリティホールになり得る理由
[pentan.info](http://pentan.info/php/php_self_security.html)さんのまとめがわかりやすいです。


## [filter_input()](https://www.php.net/manual/ja/function.filter-input.php)

### option 指定する min_range と max_range
注) ここでは filter_input() の代わりに[ filter_var() ](https://www.php.net/manual/ja/function.filter-var.php)を使用しています。

```php:var_dump($num);
$num = 0;  // bool(false)
$num = 1;  // int(1) 'min_range' で指定した値は含む
$num = 2;  // int(2)
$num = 8;  // int(8)
$num = 9;  // int(9) 'max_range' で指定した値は含む
$num = 10; // bool(false)

$num = filter_var($num, FILTER_VALIDATE_INT, array(
    'options'=>array(
        'min_range' => 1,
        'max_range' => 9
    )));
```


## [htmlentities()](https://www.php.net/manual/ja/function.htmlentities.php)

### [htmlspecialchars()](https://www.php.net/manual/ja/function.htmlspecialchars.php)との違い

変換を行う対象の範囲が異なる。
変換対象は get_html_translation_table() で確認できる。
「"」、「&」、「<」、「>」は共通して変換を行う。

```php:長いので出力は略
print_r(get_html_translation_table(HTML_ENTITIES));
print_r(get_html_translation_table(HTML_SPECIALCHARS));
```


# 8章 情報の保存：データベース

## [PDO::exec](https://www.php.net/manual/ja/pdo.exec.php)

### [PDO::query ](https://www.php.net/manual/ja/pdo.query.php)との違い
PDO::exec は SELECT からの結果を返さない。戻り値は更新、削除された行数。SELECT する場合は query() を使用する。
PDO::query は結果セットを PDOStatement オブジェクトとして返す。

## [PDOStatement](https://www.php.net/manual/ja/class.pdostatement.php)
[PDO::prepare](https://www.php.net/manual/ja/pdo.prepare.php)で準備したプリペアドステートメントを表す。ステートメント実行後は結果セットを表す。

### [PDOStatement::execute](https://www.php.net/manual/ja/pdostatement.execute.php)
PDO::prepare で準備したプリペアドステートメントを実行する。
戻り値は TRUE または FALSE。
実行したその結果は PDOStatement オブジェクトが表す。


# 11章 他のWebサイトやサービスとのやり取り

## [ストリーム](https://www.php.net/manual/ja/book.stream.php)

[別記事](https://qiita.com/desho/items/14361eb8594faf661210)にまとめました。

## [curl_exec()](https://www.php.net/manual/ja/function.curl-exec.php)
戻り値は TRUE or FALSE。
CURLOPT_RETURNTRANSFER を設定してる場合は文字列を返す。

## [curl_getinfo()](https://www.php.net/manual/ja/function.curl-getinfo.php)
```php:
$c = curl_init('https://qiita.com/desho/items/90ae697783ce5c0dcefa');
$info1 = curl_getinfo($c);  // この状態では ['url'] の情報程度しか入っていない。

curl_exec($c);
$info2 = curl_getinfo($c);  // ここではたくさんの情報が入る。
$info3 = curl_getinfo($c);
var_dump($info2 == $info3); // bool(true) 2度実行しても同じ配列。

curl_close($c);
$info4 = curl_getinfo($c);  // 警告が出る。
```

# さいごに
やっぱり理解できるようになると面白いですね。
フレームワークも実際に使ってみて理解を深めていきたいです。