値をJSON形式にして返す関数が json_encode です。
第2引数にエンコードのオプションを指定できます。
結論
定数と整数,どちらで指定しても同じです。
以下が対応表になります。参考
JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256
JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3
JSON_ERROR_SYNTAX => 4
JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1
JSON_BIGINT_AS_STRING => 2
つまり以下の2つは全く同じです。
$arr = ['a' => "<p>hello</p>"];
echo json_encode($arr, JSON_HEX_TAG); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}
echo json_encode($arr, 1); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}
解説
公式ドキュメントでは以下のように定義されています。
json_encode (mixed $value, int $flags = 0, int $depth = 512) : string|false
オプション引数を指定しない場合
$arr = ['a' => 1, 'b' => 'hello'];
echo json_encode($arr); // {"a":1,"b":"hello"}
php-src を追ってみる
この部分で定数が定義されています。
/* json_encode() options */
#define PHP_JSON_HEX_TAG (1<<0)
#define PHP_JSON_HEX_AMP (1<<1)
#define PHP_JSON_HEX_APOS (1<<2)
#define PHP_JSON_HEX_QUOT (1<<3)
#define PHP_JSON_FORCE_OBJECT (1<<4)
#define PHP_JSON_NUMERIC_CHECK (1<<5)
#define PHP_JSON_UNESCAPED_SLASHES (1<<6)
#define PHP_JSON_PRETTY_PRINT (1<<7)
#define PHP_JSON_UNESCAPED_UNICODE (1<<8)
#define PHP_JSON_PARTIAL_OUTPUT_ON_ERROR (1<<9)
#define PHP_JSON_PRESERVE_ZERO_FRACTION (1<<10)
#define PHP_JSON_UNESCAPED_LINE_TERMINATORS (1<<11)
/* json_decode() and json_encode() common options */
#define PHP_JSON_INVALID_UTF8_IGNORE (1<<20)
#define PHP_JSON_INVALID_UTF8_SUBSTITUTE (1<<21)
#define PHP_JSON_THROW_ON_ERROR (1<<22)
1つ見てみましょう。
#define PHP_JSON_UNESCAPED_UNICODE (1<<8)
PHP_JSON_UNESCAPED_UNICODE という名前の定数を,256 という値で定義しています。
1<<8 というのはシフト演算です。1を8ビットだけ左にシフトするという意味です。要は,1を左に8桁シフトしているだけです。
10進数の 256 は,2進数だと 100000000 です。末尾に0が8個ついていますね。
ちなみに,json_encode の実装は この部分です。
最後に
今回は知らないと困るような内容ではないですが,気になったので調べてみました。
何か間違いなどあればご指摘いただければ幸いです。