<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration70.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'migration70.new-features.php',
    1 => '新機能',
    2 => '新機能',
  ),
  'up' => 
  array (
    0 => 'migration70.php',
    1 => 'PHP 5.6.x から PHP 7.0.x への移行',
  ),
  'prev' => 
  array (
    0 => 'migration70.incompatible.php',
    1 => '下位互換性のない変更点',
  ),
  'next' => 
  array (
    0 => 'migration70.deprecated.php',
    1 => 'PHP 7.0.x で推奨されなくなる機能',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'appendices/migration70/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration70.new-features" class="sect1">
 <h2 class="title">新機能</h2>

 <div class="sect2" id="migration70.new-features.scalar-type-declarations">
  <h3 class="title">スカラー型宣言</h3>

  <p class="para">
   スカラー
   <a href="language.types.declarations.php" class="link">型宣言</a>
   には二つの方式があります。デフォルトの自動変換(coercive) モードと、
   厳密に判断する strict モードです。
   パラメータとして、
   文字列 (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>)、整数 (<code class="literal">int</code>)、浮動小数点数
   (<span class="type"><a href="language.types.float.php" class="type float">float</a></span>)、boolean (<code class="literal">bool</code>)
   といった型をいずれかの方式で強制できるようになりました。
   これらは、PHP 5 で導入された型宣言 (クラス名やインターフェイス、配列そして <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>)
   を強化するものです。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// デフォルトのモード<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sumOfInts</span><span style="color: #007700">(</span><span style="color: #0000BB">int </span><span style="color: #007700">...</span><span style="color: #0000BB">$ints</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$ints</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sumOfInts</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">'3'</span><span style="color: #007700">, </span><span style="color: #0000BB">4.1</span><span style="color: #007700">));</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(9)
</pre></div>
   </div>
  </div>

  <p class="para">
   strict モードを有効にするには、ファイルの先頭に <a href="control-structures.declare.php" class="link"><code class="literal">declare</code></a> ディレクティブを置く必要があります。
   つまり、スカラー型を厳密に扱うかどうかは、ファイル単位で定めるということです。
   このディレクティブは、パラメータの型宣言だけでなく、関数の戻り値の型
   (<a href="language.types.declarations.php" class="link">戻り値の型宣言</a>を参照ください)
   や PHP の標準関数、そして拡張モジュールの関数にも影響を及ぼします。
  </p>

  <p class="para">
   スカラー型宣言に関するドキュメントやサンプルについては、
   <a href="language.types.declarations.php" class="link">型宣言</a>
   を参照ください。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.return-type-declarations">
  <h3 class="title">戻り値の型宣言</h3>

  <p class="para">
   PHP 7 では、
   <a href="language.types.declarations.php" class="link">戻り値の型宣言</a>
   もできるようになりました。
   <a href="language.types.declarations.php" class="link">引数の型宣言</a>
   と同様に、戻り値の型宣言では、関数が戻す値がどの型になるかを宣言します。
   戻り値の型宣言で使える
   <a href="language.types.declarations.php" class="link">型</a>
   は、引数の型宣言で使えるものと同じです。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">arraysSum</span><span style="color: #007700">(array ...</span><span style="color: #0000BB">$arrays</span><span style="color: #007700">): array<br />{<br />    return </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(function(array </span><span style="color: #0000BB">$array</span><span style="color: #007700">): </span><span style="color: #0000BB">int </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br />    }, </span><span style="color: #0000BB">$arrays</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">arraysSum</span><span style="color: #007700">([</span><span style="color: #0000BB">1</span><span style="color: #007700">,</span><span style="color: #0000BB">2</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">], [</span><span style="color: #0000BB">4</span><span style="color: #007700">,</span><span style="color: #0000BB">5</span><span style="color: #007700">,</span><span style="color: #0000BB">6</span><span style="color: #007700">], [</span><span style="color: #0000BB">7</span><span style="color: #007700">,</span><span style="color: #0000BB">8</span><span style="color: #007700">,</span><span style="color: #0000BB">9</span><span style="color: #007700">]));</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Array
(
    [0] =&gt; 6
    [1] =&gt; 15
    [2] =&gt; 24
)
</pre></div>
   </div>
  </div>

  <p class="para">
   詳細なドキュメントやサンプルについては、
   <a href="language.types.declarations.php" class="link">戻り値の型宣言</a>.
   を参照ください。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.null-coalesce-op">
  <h3 class="title">Null 合体演算子</h3>

  <p class="para">
   null 合体演算子 (<code class="literal">??</code>) がシンタックスシュガーとして追加されました。
   三項演算子と <span class="function"><a href="function.isset.php" class="function">isset()</a></span> を組み合わせる
   よくありがちなパターンを、より簡単に書くためのものです。
   この演算子は、もし第一オペランドが非 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> の値であればそれを返し、
   そうでない場合は第二オペランドを返します。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// $_GET['user'] を取得します。もし存在しない場合は<br />// 'nobody' を用います。<br /></span><span style="color: #0000BB">$username </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">] ?? </span><span style="color: #DD0000">'nobody'</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// 上のコードは、次のコードと同じ意味です。<br /></span><span style="color: #0000BB">$username </span><span style="color: #007700">= isset(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">]) ? </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">] : </span><span style="color: #DD0000">'nobody'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 合体演算子を連結することもできます。次のように書くと、<br />// $_GET['user']、$_POST['user'] そして 'nobody'<br />// の順に調べて、非 &amp;null; が定義されている最初の値を返します。<br /></span><span style="color: #0000BB">$username </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">] ?? </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">] ?? </span><span style="color: #DD0000">'nobody'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  
 </div>

 <div class="sect2" id="migration70.new-features.spaceship-op">
  <h3 class="title">宇宙船演算子</h3>
  <p class="para">
   宇宙船演算子は、二つの式を比較するために使うものです。
   <var class="varname">$a</var> が <var class="varname">$b</var> より大きい場合は 1、
   <var class="varname">$a</var> と <var class="varname">$b</var> が等しい場合は 0、
   <var class="varname">$a</var> が <var class="varname">$b</var> より小さい場合は -1 をそれぞれ返します。
   比較の際には、
   <a href="types.comparisons.php" class="link">PHP 型の比較表</a>
   のルールを用います。
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 整数値<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// 浮動小数点数値<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br />// 文字列<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"b" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  
 </div>

 <div class="sect2" id="migration70.new-features.define-array">
  <h3 class="title"><span class="function"><a href="function.define.php" class="function">define()</a></span> を用いた配列定数の定義</h3>

  <p class="para">
   <span class="function"><a href="function.define.php" class="function">define()</a></span> で配列の定数を定義できるようになりました。
   PHP 5.6 までのバージョンでは、配列の定数は <a href="language.constants.syntax.php" class="link"><code class="literal">const</code></a> でしか定義できませんでした。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">'ANIMALS'</span><span style="color: #007700">, [<br />    </span><span style="color: #DD0000">'dog'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'cat'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'bird'<br /></span><span style="color: #007700">]);<br /><br />echo </span><span style="color: #0000BB">ANIMALS</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]; </span><span style="color: #FF8000">// "cat" と出力します<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.anonymous-classes">
  <h3 class="title">無名クラス</h3>

  <p class="para">
   無名クラスをサポートするようになりました。<code class="literal">new
   class</code> を使って利用します。
   その場限りの使い捨てのオブジェクトなどで、完全なクラス定義のかわりとして使えます。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">string $msg</span><span style="color: #007700">);<br />}<br /><br />class </span><span style="color: #0000BB">Application </span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$logger</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">getLogger</span><span style="color: #007700">(): </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />         return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">logger</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">setLogger</span><span style="color: #007700">(</span><span style="color: #0000BB">Logger $logger</span><span style="color: #007700">) {<br />         </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">logger </span><span style="color: #007700">= </span><span style="color: #0000BB">$logger</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$app </span><span style="color: #007700">= new </span><span style="color: #0000BB">Application</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$app</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setLogger</span><span style="color: #007700">(new class implements </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">string $msg</span><span style="color: #007700">) {<br />        echo </span><span style="color: #0000BB">$msg</span><span style="color: #007700">;<br />    }<br />});<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$app</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getLogger</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
object(class@anonymous)#2 (0) {
}
</pre></div>
   </div>
  </div>

  <p class="para">
   詳細なドキュメントは
   <a href="language.oop5.anonymous.php" class="link">無名クラス</a>
   を参照ください。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.unicode-codepoint-escape-syntax">
  <h3 class="title">Unicode コードポイントエスケープ構文</h3>

  <p class="para">
   Unicode のコードポイントを十六進形式で受け取って、
   それを UTF-8 で (ダブルクォートで囲まれた文字列あるいはヒアドキュメントとして) 出力します。
   妥当な形式のコードポイントならあらゆるものが使えます。先頭のゼロは省略してもかまいません。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\u{aa}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"\u{0000aa}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"\u{9999}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">\u{01f418}<br /></span><span style="color: #007700">EOT;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
a
a (先頭のゼロを省略せずに書いても、前の行と同じ結果になります)
香
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.closure-call-method">
  <h3 class="title"><span class="methodname"><a href="closure.call.php" class="methodname">Closure::call()</a></span></h3>

  <p class="para">
   <span class="methodname"><a href="closure.call.php" class="methodname">Closure::call()</a></span>
   は、オブジェクトのスコープをクロージャに一時的に束縛して実行するための、
   より高性能で簡潔な方法です。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{private </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;}<br /><br /></span><span style="color: #FF8000">// 以前のバージョンのコード<br /></span><span style="color: #0000BB">$getX </span><span style="color: #007700">= function() {return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x</span><span style="color: #007700">;};<br /></span><span style="color: #0000BB">$getXCB </span><span style="color: #007700">= </span><span style="color: #0000BB">$getX</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bindTo</span><span style="color: #007700">(new </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">); </span><span style="color: #FF8000">// 中間クロージャが必要<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$getXCB</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// PHP 7 以降でのコード<br /></span><span style="color: #0000BB">$getX </span><span style="color: #007700">= function() {return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x</span><span style="color: #007700">;};<br />echo </span><span style="color: #0000BB">$getX</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">call</span><span style="color: #007700">(new </span><span style="color: #0000BB">A</span><span style="color: #007700">);</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
1
</pre></div>
   </div>
  </div>
 </div>
 <div class="sect2" id="migration70.new-features.filtered-unserialize">
  <h3 class="title"><span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> のフィルタリング</h3>

  <p class="para">
   この仕組みは、信頼できないデータからオブジェクトを復元する際に、
   よりセキュリティを高められるようにするために用意されたものです。
   アンシリアライズ可能なクラスの一覧をホワイトリストとして定義することで、
   コードインジェクション攻撃を防ぎます。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// オブジェクトはすべて、__PHP_Incomplete_Class のオブジェクトに変換します<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">// MyClassとMyClass2以外のすべてのオブジェクトを、__PHP_Incomplete_Class のオブジェクトに変換します<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">"MyClass"</span><span style="color: #007700">, </span><span style="color: #DD0000">"MyClass2"</span><span style="color: #007700">]]);<br /><br /></span><span style="color: #FF8000">// デフォルト (第二引数を省略した場合) の挙動は以下のようになり、すべてのオブジェクトをそのまま復元します<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">]);</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.intlchar">
  <h3 class="title"><span class="classname"><a href="class.intlchar.php" class="classname">IntlChar</a></span></h3>

  <p class="para">
   ICU のさらなる機能を利用するために、新しく <span class="classname"><a href="class.intlchar.php" class="classname">IntlChar</a></span>
   クラスが追加されました。このクラスには数々の static メソッドと定数が定義されており、
   これらを使って Unicode の文字を操作できます。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'%x'</span><span style="color: #007700">, </span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">CODEPOINT_MAX</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">charName</span><span style="color: #007700">(</span><span style="color: #DD0000">'@'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">ispunct</span><span style="color: #007700">(</span><span style="color: #DD0000">'!'</span><span style="color: #007700">));</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
10ffff
COMMERCIAL AT
bool(true)
</pre></div>
   </div>
  </div>

  <p class="para">
   このクラスを使うには、<a href="book.intl.php" class="link">Intl</a> 拡張モジュールをインストールしなければいけません。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.expectations">
  <h3 class="title">Expectation</h3>

  <p class="para">
   Expectations は、かつての
   <span class="function"><a href="function.assert.php" class="function">assert()</a></span> 関数を、下位互換性を保ったまま拡張したものです。
   これを用いると、コストをかけずに実運用コードの中にアサーションを組み込めます。
   そして、アサーションが失敗した際に自作の例外をスローできるようになります。
  </p>

  <p class="para">
   これまでの API も下位互換性を保つために維持されていますが、
   <span class="function"><a href="function.assert.php" class="function">assert()</a></span> は言語構造となりました。
   最初のパラメータには、単に評価対象の文字列や <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>
   値を指定するだけではなく、式を渡せます。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'assert.exception'</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />class </span><span style="color: #0000BB">CustomError </span><span style="color: #007700">extends </span><span style="color: #0000BB">AssertionError </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">assert</span><span style="color: #007700">(</span><span style="color: #0000BB">false</span><span style="color: #007700">, new </span><span style="color: #0000BB">CustomError</span><span style="color: #007700">(</span><span style="color: #DD0000">'Some error message'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught CustomError: Some error message
</pre></div>
   </div>
  </div>

  <p class="para">
   開発環境および運用環境での設定方法などの詳細については、
   言語構造 <span class="function"><a href="function.assert.php" class="function">assert()</a></span> のマニュアルを参照ください。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.group-use-declarations">
  <h3 class="title"><code class="literal">use</code> 宣言のグループ化</h3>

  <p class="para">
   複数のクラスや関数そして定数を同じ <a href="language.namespaces.definition.php" class="link"><code class="literal">namespace</code></a> からインポートする際に、
   単一の <a href="language.namespaces.importing.php" class="link"><code class="literal">use</code></a> 文にまとめられるようになりました。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 以前のバージョンのコード<br /></span><span style="color: #007700">use </span><span style="color: #0000BB">some\namespace\ClassA</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">some\namespace\ClassB</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">some\namespace\ClassC </span><span style="color: #007700">as </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /><br />use function </span><span style="color: #0000BB">some\namespace\fn_a</span><span style="color: #007700">;<br />use function </span><span style="color: #0000BB">some\namespace\fn_b</span><span style="color: #007700">;<br />use function </span><span style="color: #0000BB">some\namespace\fn_c</span><span style="color: #007700">;<br /><br />use const </span><span style="color: #0000BB">some\namespace\ConstA</span><span style="color: #007700">;<br />use const </span><span style="color: #0000BB">some\namespace\ConstB</span><span style="color: #007700">;<br />use const </span><span style="color: #0000BB">some\namespace\ConstC</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// PHP 7 以降のコード<br /></span><span style="color: #007700">use </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">ClassA</span><span style="color: #007700">, </span><span style="color: #0000BB">ClassB</span><span style="color: #007700">, </span><span style="color: #0000BB">ClassC </span><span style="color: #007700">as </span><span style="color: #0000BB">C</span><span style="color: #007700">};<br />use function </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">fn_a</span><span style="color: #007700">, </span><span style="color: #0000BB">fn_b</span><span style="color: #007700">, </span><span style="color: #0000BB">fn_c</span><span style="color: #007700">};<br />use const </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">ConstA</span><span style="color: #007700">, </span><span style="color: #0000BB">ConstB</span><span style="color: #007700">, </span><span style="color: #0000BB">ConstC</span><span style="color: #007700">};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.generator-return-expressions">
  <h3 class="title">ジェネレータでの return</h3>

  <p class="para">
   PHP 5.5 で導入されたジェネレータの機能拡張です。
   ジェネレータの内部で <code class="literal">return</code> 文が使えるようになりました。
   これを使えば、ジェネレータが最終的に返す式を指定できます (参照を返すことはできません)。
   この値を取得するには、新しいメソッド
   <code class="literal">Generator::getReturn()</code> を用います。
   このメソッドを使うのは、ジェネレータが値の生成を終えた後の一度だけになるでしょう。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$gen </span><span style="color: #007700">= (function() {<br />    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />    return </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />})();<br /><br />foreach (</span><span style="color: #0000BB">$gen </span><span style="color: #007700">as </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">$gen</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getReturn</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
2
3
</pre></div>
   </div>
  </div>

  <p class="para">
   ジェネレータの最終値を明示的に返せる機能は、あれば便利なものです。
   ジェネレータを実行したクライアント側のコードが、
   ジェネレータが最後に返す値 (何らかのコルーチンの計算結果) を特別扱いできるようになるからです。
   「取得した値が最後の値かどうかをまず調べて、最後であれば特別扱いする」
   という処理をクライアント側で書くよりは、ずっとシンプルになります。
  </p>
 </div>
 <div class="sect2" id="migration70.new-features.generator-delegation">
  <h3 class="title">ジェネレータの委譲</h3>

  <p class="para">
   ジェネレータを、別のジェネレータや
   <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> オブジェクトそして配列に委譲できるようになりました。
   外側のジェネレータに決まり文句を書いたりする必要はなく、単に <a href="language.generators.syntax.php#control-structures.yield.from" class="link"><code class="literal">yield from</code></a> 構文を使うだけです。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">gen</span><span style="color: #007700">()<br />{<br />    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    yield from </span><span style="color: #0000BB">gen2</span><span style="color: #007700">();<br />}<br /><br />function </span><span style="color: #0000BB">gen2</span><span style="color: #007700">()<br />{<br />    yield </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br />}<br /><br />foreach (</span><span style="color: #0000BB">gen</span><span style="color: #007700">() as </span><span style="color: #0000BB">$val</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
2
3
4
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.intdiv">
  <h3 class="title"><span class="function"><a href="function.intdiv.php" class="function">intdiv()</a></span> による整数の除算</h3>

  <p class="para">
   新しい <span class="function"><a href="function.intdiv.php" class="function">intdiv()</a></span> 関数は、
   オペランドに対して整数の除算を行い、その結果を返します。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">intdiv</span><span style="color: #007700">(</span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(3)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.session-start-options">
  <h3 class="title">セッションのオプション</h3>

  <p class="para">
   <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> にオプションの配列を渡せるようになりました。
   これは、php.ini などで設定した
   <a href="session.configuration.php" class="link">session 設定ディレクティブ</a>
   を上書きします。
  </p>

  <p class="para">
   新たな設定オプション
   <a href="session.configuration.php#ini.session.lazy-write" class="link">session.lazy_write</a>
   をサポートするようになりました。これはデフォルトで有効になっており、
   セッションのデータが書き換えられたときにだけセッションファイルを上書きします。
   また、<code class="literal">read_and_close</code> も追加されました。
   このオプションは <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> だけに渡せるもので、
   セッションデータを読み込んだら何も変更せずその場でクローズするよう指示します。
  </p>

  <p class="para">
   たとえば、
   <a href="session.configuration.php#ini.session.cache-limiter" class="link">session.cache_limiter</a>
   を <code class="literal">private</code> にして、読み込んだセッションをすぐにクローズさせるには次のようにします。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">([<br />    </span><span style="color: #DD0000">'cache_limiter' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'private'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'read_and_close' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">,<br />]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.preg-repace-callback-array-function">
  <h3 class="title"><span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span></h3>

  <p class="para">
   新しい <span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span> 関数は、
   <span class="function"><a href="function.preg-replace-callback.php" class="function">preg_replace_callback()</a></span> 関数を使ったコードをよりすっきりと書けるようにするものです。
   これまでのバージョンの PHP では、正規表現ごとにコールバックを実行したければ、
   コールバック関数が分岐だらけになってしまっていました。
  </p>

  <p class="para">
   PHP 7 以降では、個々の正規表現に対するコールバックを連想配列で登録できるようになりました。
   連想配列のキーが正規表現で、その値がコールバックとなります。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.csprng-functions">
  <h3 class="title">CSPRNG 関数</h3>

  <p class="para">
   暗号学的にセキュアな整数値および文字列を生成する、
   プラットフォームに依存しない二つの新しい関数が追加されました。
   <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> と <span class="function"><a href="function.random-int.php" class="function">random_int()</a></span> です。
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.list-arrayaccess">
  <h3 class="title">
   <span class="function"><a href="function.list.php" class="function">list()</a></span> が常に、
   <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span> を実装したオブジェクトをアンパックできるように
  </h3>

  <p class="para">
   これまでのバージョンでは、<span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span>
   を実装したオブジェクトに対して <span class="function"><a href="function.list.php" class="function">list()</a></span> が正常に機能しないことがありました。
   PHP 7 ではこの問題が修正されました。
  </p>
 </div>
 
 <div class="sect2" id="migration70.new-features.others">
  <h3 class="title">その他の機能</h3>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     クローンしたクラスのメンバーにアクセスできるようになりました。
     <code class="literal">(clone $foo)-&gt;bar()</code> のようにできるということです。
    </span>
   </li>
  </ul>
 </div>
</div><?php manual_footer($setup); ?>