PHPマニュアルを読んで見た

http://php.net/manual/ja/index.php

PHPは割と翻訳もいろんな人が頑張っていて、日本語のマニュアルも充実しているので
最近触る機会を得たこともあり、マニュアルを一通り読んで自身が気になったところを
書き残して置きます。

## マニュアルの構成

+ はじめに
+ インストールと設定
+ 言語リファレンス
+ セキュリティ
+ 機能
+ 関数リファレンス
+ PHP のコア: ハッカーの手引き
+ FAQ — FAQ: よくある質問
+ 付録

この中で、他の言語では余り見ない項目はセキュリティですね。

この辺は、IPAの[安全なウェブサイトの作り方](https://www.ipa.go.jp/security/vuln/websecurity.html)
や[徳丸本](http://amzn.to/2nL5kZJ)に詳しいのですが、PHPでのセキュリティ周りはよく悪く言われているのを耳にするので
マニュアルの方にも書かれているんですかね。

## 気になった項目

### [FastCGI Process Manager (FPM)](http://php.net/manual/ja/install.fpm.php)

PHPのFastCGI 実装の一つだそうです。気になった機能は「opcode キャッシュが壊れた場合の緊急再起動」ですかね。どうやって検知してるんだろう。あとは「"slowlog" - 実行時間が非常に長いスクリプトの記録 」これは便利だと思いました。標準でこれがついてるのは助かります。

### [phpize で共有 PECL 拡張モジュールをコンパイルする方法](http://php.net/manual/ja/install.pecl.phpize.php)

phpizeというコマンドを知りました。peclできない環境とかで直接コンパイルするためのコマンドですね。試しにhelpを見てみようかと試してみたんですが、簡素すぎてびっくりしました。

```
Usage: /usr/local/bin/phpize [--clean|--help|--version|-v]
```

### [php-config](http://php.net/manual/ja/install.pecl.php-config.php)

これは、「インストールされている PHP の設定情報を取得」するためのスクリプトです。拡張モジュールをコンパイルするときに使用されるものみたいです。

### [PECL 拡張モジュールを PHP に静的に組み込む](http://php.net/manual/ja/install.pecl.static.php)

Cとかで書いた拡張モジュールをうれしいケースとかでしょうか。PHPをビルドし直す必要性があります。


### [.user.ini ファイル](http://php.net/manual/ja/configuration.file.per-user.php)

5.3.0以降ではディレクトリ単位でINIファイルをサポートするようになっているそうです。知らずにプロジェクト引き継いだ場合に頭抱えそうですね。

### [リソース](http://php.net/manual/ja/language.types.resource.php)

「外部リソースへのリファレンスを保持」している変数。いわゆるファイルハンドルとかそういう類いのもののようです。

### クラスのオートローディング

 spl_autoload_register()という関数を使用してオートローダーを実装できるという話みたいです。

### [スコープ定義演算子 (::)](http://php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)

またの名が「Paamayim Nekudotayim」という風につけられていて、しかも理由が特にない点が一番面白かったです。

### [PHP タグ](http://php.net/manual/ja/language.basic-syntax.phptags.php)

+ いわゆる<?phpのこと
  + おすすめではない
    + php.ini で short_open_tag を有効
    + --enable-short-tags オプションつきで PHP を configure した場合でないと使えない
  + 末尾の終了タグは書かないのが推奨
    + 終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるから

### [定数](http://php.net/manual/ja/language.constants.php)

+ defineで定義される変更出来ない値
  + 数値で始まる物は有効では無いらしいが、コンパイルエラーになるのだろうか

```php
define("FOO",     "something");
```


### [無名関数](http://php.net/manual/ja/functions.anonymous.php)

+ 変数を親のスコープから引き継ぐ場合にuseを使う必要性がある

```php
$example = function () use ($message) {
    var_dump($message);
};
```

### [トレイト](http://php.net/manual/ja/language.oop5.traits.php)

+ PHP 5.4.0 以降で導入
+ いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにするもの
+ トレイト自身のインスタンスを作成することはできない

```php
<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
```

### [マジックメソッド](http://php.net/manual/ja/language.oop5.magic.php)

+ PHP クラスにおける特殊関数の名前

### [遅延静的束縛 (Late Static Bindings)](http://php.net/manual/ja/language.oop5.late-static-bindings.php)

+ 静的継承のコンテキストで呼び出し元のクラスを参照できるようになる
  + selfとsaticの違いに注意
+ 実行時に最初にコールされたクラスを参照するようにしています


### [ジェネレータとは](http://php.net/manual/ja/language.generators.overview.php)

+ シンプルな イテレータを簡単に実装できる
+ [yield キーワード](http://php.net/manual/ja/language.generators.syntax.php#control-structures.yield)を使って実装する
+ 返されるオブジェクトはGenerator のオブジェクト

### [サポートするプロトコル/ラッパー](http://php.net/manual/ja/wrappers.php)

+ 組み込みで多くのラッパーがある
+ [stream_wrapper_register](http://php.net/manual/ja/function.stream-wrapper-register.php)関数でラッパーを作成出来る


### [リモートファイルの使用](http://php.net/manual/ja/features.remote-files.php)

+ php.iniでallow_url_fopenを有効にした場合だけ使える
  + ぱっと見危ない機能なのでデフォルトでOFFになってるんですね
+ ファイル名をパラメータとする関数の多くで HTTP および FTP のURL を使用することができます

### [コマンドラインオプション](http://php.net/manual/ja/features.commandline.options.php)

+ phpはコマンドラインから実行出来る

気になったのは以下のオプション

+ a オプションで対話的に実行出来る
+ e デバッガプロファイルらの拡張情報を出力
+ i phpinfoを実行して結果を出力する
+ m phpに組み込まれたZendモジュールを表示
+ r コマンドラインのみでPHPが実行出来る(いわゆるワンライナー)
+ B 標準入力を処理する前に実行するPHPコードを指定
+ R それぞれの入力行にたいして実行するPHPコードを指定
+ F すべての入力行に対して実行するPHPコードを指定
+ E 入力を処理した後に実行するPHPコードを指定
+ rf 指定した関数あるいはクラスメソッドに対して情報を表示
+ rc 指定したクラスの情報を表示
+ re 指定した拡張モジュールについての情報を表示

### [MCVE (Monetra) Payment ](http://php.net/manual/ja/book.mcve.php)

+ Linux/Unix/MacOSX/Windows 上で クレジットカード/デビットカード/ギフトカード を直接処理することが可能となる
+ 標準でこんな物がついていることが驚きです

### [PHP および DTrace の使用](http://php.net/manual/ja/features.dtrace.dtrace.php)

+ [dtrace](http://dtrace.org/blogs/about/)がつかえます

### [PHP のコア: ハッカーの手引き](http://php.net/manual/ja/internals2.php)

+ PHP内部構造に対しての手引き書
+ ビルドシステム,ドライバ等色々細かく書いてある
+ これは別途ちゃんと読みたい

### [付録](http://php.net/manual/ja/debugger.php)

+ [phpdbg](http://phpdbg.com/docs)が5.6以降ついてるんですね。使ってみたい