<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration72.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'migration72.new-features.php',
    1 => '新機能',
    2 => '新機能',
  ),
  'up' => 
  array (
    0 => 'migration72.php',
    1 => 'PHP 7.1.x から PHP 7.2.x への移行',
  ),
  'prev' => 
  array (
    0 => 'migration72.php',
    1 => 'PHP 7.1.x から PHP 7.2.x への移行',
  ),
  'next' => 
  array (
    0 => 'migration72.new-functions.php',
    1 => '新しい関数',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'appendices/migration72/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

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

 <div class="sect2" id="migration72.new-features.object-type">
  <h3 class="title">object 型</h3>

  <p class="para">
   <span class="type"><a href="language.types.object.php" class="type object">object</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 /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">object $obj</span><span style="color: #007700">) : </span><span style="color: #0000BB">object<br /></span><span style="color: #007700">{<br />    return new </span><span style="color: #0000BB">SplQueue</span><span style="color: #007700">();<br />}<br /><br /></span><span style="color: #0000BB">test</span><span style="color: #007700">(new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">());</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration72.new-features.ext-loading-by-name">
  <h3 class="title">名前指定による拡張モジュールのロード</h3>

  <p class="para">
   読み込む共有モジュールを指定する際に、拡張子
   (Unix なら <code class="literal">.so</code>、Windows なら <code class="literal">.dll</code> など)
   を指定する必要がなくなりました。php.ini ファイルでの指定だけでなく
   <span class="function"><a href="function.dl.php" class="function">dl()</a></span> 関数による指定でも同様です。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.abstract-method-overriding">
  <h3 class="title">抽象メソッドのオーバーライド</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: #007700">abstract class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    abstract function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">string $s</span><span style="color: #007700">);<br />}<br />abstract class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// オーバーライドしましたが、パラメータの反変性や戻り値の共変性は維持しています。<br />    </span><span style="color: #007700">abstract function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$s</span><span style="color: #007700">) : </span><span style="color: #0000BB">int</span><span style="color: #007700">;<br />}</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration72.new-features.sodium">
  <h3 class="title"><a href="book.sodium.php" class="link">Sodium</a> がコアモジュールに</h3>

  <p class="para">
   モダンな暗号ライブラリである Sodium が PHP コアモジュールに含まれるようになりました。
  </p>
  <p class="para">
   関数のリファレンスは <a href="book.sodium.php" class="link">Sodium</a> を参照ください。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.pws-hashing-with-argon2">
  <h3 class="title">Argon2 によるパスワードハッシュ</h3>

  <p class="para">
   <a href="book.password.php" class="link">パスワードハッシュ API</a>
   に Argon2 が追加されました。次の定数が公開されています。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="password.constants.php#constant.password-argon2-default-memory-cost">PASSWORD_ARGON2_DEFAULT_MEMORY_COST</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="password.constants.php#constant.password-argon2-default-time-cost">PASSWORD_ARGON2_DEFAULT_TIME_COST</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="password.constants.php#constant.password-argon2-default-threads">PASSWORD_ARGON2_DEFAULT_THREADS</a></code></strong>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration72.new-features.pdo-extended-str-types">
  <h3 class="title"><a href="book.pdo.php" class="link">PDO</a> の拡張文字列型</h3>

  <p class="para">
   PDO の文字列型が拡張され、
   プリペアをエミュレートする際に NCHAR 型をサポートするようになりました。
   以下の定数が追加されています。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="pdo.constants.php#pdo.constants.param-str-natl">PDO::PARAM_STR_NATL</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="pdo.constants.php#pdo.constants.param-str-char">PDO::PARAM_STR_CHAR</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="pdo.constants.php#pdo.constants.attr-default-str-param">PDO::ATTR_DEFAULT_STR_PARAM</a></code></strong>
    </span>
   </li>
  </ul>

  <p class="para">
   これらの定数を使うには、
   <strong><code><a href="pdo.constants.php#pdo.constants.param-str">PDO::PARAM_STR</a></code></strong> とビット <code class="literal">OR</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 />$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">quote</span><span style="color: #007700">(</span><span style="color: #DD0000">'über'</span><span style="color: #007700">, </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">PARAM_STR </span><span style="color: #007700">| </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">PARAM_STR_NATL</span><span style="color: #007700">);</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration72.new-features.additional-emulated-prepares-debugging-info">
  <h3 class="title"><a href="book.pdo.php" class="link">PDO</a> のデバッグ情報にプリペアのエミュレートの内容を追加</h3>

  <p class="para">
   <span class="function"><a href="pdostatement.debugdumpparams.php" class="function">PDOStatement::debugDumpParams()</a></span> メソッドが改良されて、
   データベースに送信される SQL を表示できるようになりました。
   これは、プレースホルダの内容をバインド変数の値で置き換えた後の生のクエリです。
   この機能は、プリペア機能のエミュレートをデバッグしやすくするために用意されました
   (そのため、プリペア機能のエミュレートが有効になっているときしか使えません)。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.extended-ops-in-ldap">
  <h3 class="title"><a href="book.ldap.php" class="link">LDAP</a> における拡張オペレーションのサポート</h3>

  <p class="para">
   LDAP 拡張モジュールが EXOP をサポートするようになりました。
   以下の関数や定数が追加されています。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.ldap-parse-exop.php" class="function">ldap_parse_exop()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.ldap-exop.php" class="function">ldap_exop()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.ldap-exop-passwd.php" class="function">ldap_exop_passwd()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.ldap-exop-whoami.php" class="function">ldap_exop_whoami()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="ldap.constants.php#constant.ldap-exop-start-tls">LDAP_EXOP_START_TLS</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="ldap.constants.php#constant.ldap-exop-modify-passwd">LDAP_EXOP_MODIFY_PASSWD</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="ldap.constants.php#constant.ldap-exop-refresh">LDAP_EXOP_REFRESH</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="ldap.constants.php#constant.ldap-exop-who-am-i">LDAP_EXOP_WHO_AM_I</a></code></strong>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <strong><code><a href="ldap.constants.php#constant.ldap-exop-turn">LDAP_EXOP_TURN</a></code></strong>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration72.new-features.addr-info-in-sockets">
  <h3 class="title"><a href="book.sockets.php" class="link">ソケット</a> 拡張モジュールでのアドレス情報の対応</h3>

  <p class="para">
   ソケット拡張モジュールが、アドレス情報のルックアップや
   接続、バインド、explainに対応するようになりました。
   新しく追加されたのは、以下の四つの関数です。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.socket-addrinfo-connect.php" class="function">socket_addrinfo_connect()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.socket-addrinfo-bind.php" class="function">socket_addrinfo_bind()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.socket-addrinfo-explain.php" class="function">socket_addrinfo_explain()</a></span>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration72.new-features.param-type-widening">
  <h3 class="title">パラメータの型の拡大変換</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: #007700">interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">Test</span><span style="color: #007700">(array </span><span style="color: #0000BB">$input</span><span style="color: #007700">);<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">implements </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">Test</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">){} </span><span style="color: #FF8000">// $input の型指定を省略<br /></span><span style="color: #007700">}</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration72.new-features.trailing-comma-in-grouped-namespaces">
  <h3 class="title">名前空間のグループ指定における最後のカンマの許可</h3>

  <p class="para">
   PHP 7.0 で導入されたグループ指定構文で、最後にカンマを付けられるようになりました。
  </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">use </span><span style="color: #0000BB">Foo\Bar</span><span style="color: #007700">\{<br />    </span><span style="color: #0000BB">Foo</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">Bar</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">Baz</span><span style="color: #007700">,<br />};</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration72.new-features.proc_nice-windows-support">
  <h3 class="title">Windows での <span class="function"><a href="function.proc-nice.php" class="function">proc_nice()</a></span> のサポート</h3>

  <p class="para">
   <span class="function"><a href="function.proc-nice.php" class="function">proc_nice()</a></span> 関数が Windows でも使えるようになりました。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.pack-unpack-endian-support">
  <h3 class="title"><span class="function"><a href="function.pack.php" class="function">pack()</a></span> と <span class="function"><a href="function.unpack.php" class="function">unpack()</a></span> でのエンディアンのサポート</h3>

  <p class="para">
   <span class="function"><a href="function.pack.php" class="function">pack()</a></span> と <span class="function"><a href="function.unpack.php" class="function">unpack()</a></span> が、
   リトルエンディアンとビッグエンディアンの両方の float や double に対応するようになりました。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.exif-features">
  <h3 class="title"><a href="book.exif.php" class="link">EXIF</a> 拡張モジュールの機能追加</h3>

  <p class="para">
   EXIF 拡張モジュールがより多くのフォーマットに対応するようになりました。
   <span class="function"><a href="function.exif-read-data.php" class="function">exif_read_data()</a></span> 関数で画像をパースするときに、
   今までよりも多くの独自タグが適切に変換されるようになります。
   新たにサポートするようになったフォーマットは以下のとおりです。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Samsung
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     DJI
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Panasonic
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Sony
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Pentax
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Minolta
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Sigma/Foveon
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     AGFA
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Kyocera
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Ricoh
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Epson
    </span>
   </li>
  </ul>

  <p class="para">
   また、<span class="function"><a href="function.exif-read-data.php" class="function">exif_read_data()</a></span> と <span class="function"><a href="function.exif-thumbnail.php" class="function">exif_thumbnail()</a></span>
   の第一引数にストリームを渡せるようになりました。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.pcre">
  <h3 class="title"><a href="book.pcre.php" class="link">PCRE</a> の新機能</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="literal">J</code> 修飾子で PCRE_DUPNAMES を設定できるようになりました。
    </span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration72.new-features.sqlite3">
  <h3 class="title"><a href="book.sqlite3.php" class="link">SQLite3</a> での BLOB の書き込み</h3>

  <p class="para">
   <span class="methodname"><a href="sqlite3.openblob.php" class="methodname">SQLite3::openBlob()</a></span> が、BLOB
   フィールドを書き込みモードでオープンできるようになりました。
   これまでは読み込みモードにしか対応していませんでした。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.oci8">
  <h3 class="title"><a href="book.oci8.php" class="link">Oracle OCI8</a> Transparent Application Failover コールバック</h3>

  <p class="para">
   <a href="oci8.taf.php" class="link">Oracle Database Transparent Application Failover (TAF) コールバック</a>
   のサポートが追加されました。
   TAF を使うと、データベースとの接続が切れたときに、
   提議済みのデータベースに自動的に再接続できます。
   TAF コールバックを使うと、
   フェイルオーバー時の再接続を PHP アプリケーションから監視したり制御したりできるようになります。
  </p>
 </div>

 <div class="sect2" id="migration72.new-features.zip">
  <h3 class="title"><a href="book.oci8.php" class="link">ZIP</a> 拡張モジュールの機能追加</h3>

  <p class="para">
   暗号化されたアーカイブの読み書きができるようになりました
   (libzip 1.2.0 以降が必要です)。
  </p>
  <p class="para">
   <span class="classname"><a href="class.ziparchive.php" class="classname">ZipArchive</a></span> クラスが <span class="interfacename"><a href="class.countable.php" class="interfacename">Countable</a></span>
   インターフェイスを実装するようになりました。
  </p>
  <p class="para">
   <code class="literal">zip://</code> ストリームのコンテキストオプションに
   <code class="literal">&#039;password&#039;</code> を使えるようになりました。
  </p>
 </div>

</div><?php manual_footer($setup); ?>