<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration80.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'en',
  ),
  'this' => 
  array (
    0 => 'migration80.other-changes.php',
    1 => 'Other Changes',
    2 => 'Other Changes',
  ),
  'up' => 
  array (
    0 => 'migration80.php',
    1 => 'Migrating from PHP 7.4.x to PHP 8.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration80.deprecated.php',
    1 => 'Deprecated Features',
  ),
  'next' => 
  array (
    0 => 'migration74.php',
    1 => 'Migrating from PHP 7.3.x to PHP 7.4.x',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    'path' => 'appendices/migration80/other-changes.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration80.other-changes" class="sect1">
 <h2 class="title">Other Changes</h2>

 <div class="sect2" id="migration80.other-changes.sapi">
  <h3 class="title">Changes in SAPI Modules</h3>

  <div class="sect3" id="migration80.other-changes.sapi.apache2handler">
   <h4 class="title">Apache2Handler</h4>

   <p class="para">
    The PHP module has been renamed from <code class="literal">php7_module</code> to
    <code class="literal">php_module</code>.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration80.other-changes.functions">
  <h3 class="title">Changed Functions</h3>

  <div class="sect3" id="migration80.other-changes.functions.reflection">
   <h4 class="title">Reflection</h4>

   <p class="para">
    <span class="methodname"><a href="reflectionclass.getconstants.php" class="methodname">ReflectionClass::getConstants()</a></span> and
    <span class="methodname"><a href="reflectionclass.getreflectionconstants.php" class="methodname">ReflectionClass::getReflectionConstants()</a></span> results can be now filtered via
    a new parameter <code class="parameter">filter</code>. Three new constants were added to be used with it:
   </p>
   <p class="para">
    <ul class="simplelist">
     <li><strong><code><a href="class.reflectionclassconstant.php#reflectionclassconstant.constants.is-public">ReflectionClassConstant::IS_PUBLIC</a></code></strong></li>
     <li><strong><code><a href="class.reflectionclassconstant.php#reflectionclassconstant.constants.is-protected">ReflectionClassConstant::IS_PROTECTED</a></code></strong></li>
     <li><strong><code><a href="class.reflectionclassconstant.php#reflectionclassconstant.constants.is-private">ReflectionClassConstant::IS_PRIVATE</a></code></strong></li>
    </ul>
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.functions.standard">
   <h4 class="title">Standard</h4>

   <p class="para">
    The math functions <span class="function"><a href="function.abs.php" class="function">abs()</a></span>, <span class="function"><a href="function.ceil.php" class="function">ceil()</a></span>,
    <span class="function"><a href="function.floor.php" class="function">floor()</a></span> and <span class="function"><a href="function.round.php" class="function">round()</a></span> now properly heed
    <a href="language.types.declarations.php#language.types.declarations.strict" class="link">the <code class="literal">strict_types</code> directive</a>.
    Previously, they coerced the first argument even in strict type mode.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.functions.zip">
   <h4 class="title">Zip</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      The <span class="methodname"><a href="ziparchive.addglob.php" class="methodname">ZipArchive::addGlob()</a></span> and
      <span class="methodname"><a href="ziparchive.addpattern.php" class="methodname">ZipArchive::addPattern()</a></span> methods accept more values in the
      <code class="parameter">options</code> array argument:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li><code class="literal">flags</code></li>
       <li><code class="literal">comp_method</code></li>
       <li><code class="literal">comp_flags</code></li>
       <li><code class="literal">env_method</code></li>
       <li><code class="literal">enc_password</code></li>
      </ul>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="methodname"><a href="ziparchive.addemptydir.php" class="methodname">ZipArchive::addEmptyDir()</a></span>, <span class="methodname"><a href="ziparchive.addfile.php" class="methodname">ZipArchive::addFile()</a></span>
      and <span class="methodname"><a href="ziparchive.addfromstring.php" class="methodname">ZipArchive::addFromString()</a></span>
      methods have a new <code class="parameter">flags</code> argument. This allows managing name encoding
      (<strong><code><a href="zip.constants.php#ziparchive.constants.fl-enc-guess">ZipArchive::FL_ENC_<span class="replaceable">*</span></a></code></strong>) and entry replacement
      (<strong><code><a href="zip.constants.php#ziparchive.constants.fl-overwrite">ZipArchive::FL_OVERWRITE</a></code></strong>).
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="methodname"><a href="ziparchive.extractto.php" class="methodname">ZipArchive::extractTo()</a></span> now restores the file modification time.
     </p>
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="migration80.other-changes.extensions">
  <h3 class="title">Other Changes to Extensions</h3>

  <div class="sect3" id="migration80.other-changes.extensions.curl">
   <h4 class="title">CURL</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      The CURL extension now requires at least libcurl 7.29.0.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      The deprecated parameter <code class="parameter">version</code> of <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> has
      been removed.
     </p>
    </li>
   </ul>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.date">
   <h4 class="title">Date and Time</h4>

   <p class="para">
    <span class="classname"><a href="class.dateperiod.php" class="classname">DatePeriod</a></span> now implements <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span>
    (instead of <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>).
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.dom">
   <h4 class="title">DOM</h4>

   <p class="para">
    <span class="classname"><a href="class.domnamednodemap.php" class="classname">DOMNamedNodeMap</a></span> and <span class="classname"><a href="class.domnodelist.php" class="classname">DOMNodeList</a></span> now implement
    <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> (instead of
    <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>).
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.intl">
   <h4 class="title">Intl</h4>

   <p class="para">
    <span class="classname"><a href="class.intlbreakiterator.php" class="classname">IntlBreakIterator</a></span> and <span class="classname"><a href="class.resourcebundle.php" class="classname">ResourceBundle</a></span> now implement
    <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> (instead of <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>).
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.enchant">
   <h4 class="title">Enchant</h4>

   <p class="para">
    The enchant extension now uses libenchant-2 by default when available. libenchant version 1 is
    still supported but is deprecated and could be removed in the future.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.gd">
   <h4 class="title">GD</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      The <code class="parameter">num_points</code> parameter of <span class="function"><a href="function.imagepolygon.php" class="function">imagepolygon()</a></span>,
      <span class="function"><a href="function.imageopenpolygon.php" class="function">imageopenpolygon()</a></span> and <span class="function"><a href="function.imagefilledpolygon.php" class="function">imagefilledpolygon()</a></span> is now
      optional, i.e. these functions may be called with either 3 or 4 arguments. If the argument is
      omitted, it is calculated as <code class="code">count($points)/2</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      The function <span class="function"><a href="function.imagegetinterpolation.php" class="function">imagegetinterpolation()</a></span> to get the current interpolation method
      has been added.
     </p>
    </li>
   </ul>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.json">
   <h4 class="title">JSON</h4>

   <p class="para">
    The JSON extension cannot be disabled anymore and is always an integral part of any PHP build,
    similar to the date extension.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="para">
    The Unicode data tables have been updated to version 13.0.0.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.pdo">
   <h4 class="title">PDO</h4>

   <p class="para">
    <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span> now implements
    <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> (instead of
    <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>).
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.libxml">
   <h4 class="title">LibXML</h4>

   <p class="para">
    The minimum required libxml version is now 2.9.0. This means that external entity loading is now
    guaranteed to be disabled by default, and no extra steps need to be taken to protect against XXE
    attacks.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.mysqli">
   <h4 class="title">MySQLi / PDO MySQL</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      When mysqlnd is not used (which is the default and recommended option), the minimum supported
      libmysqlclient version is now 5.5.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="classname"><a href="class.mysqli-result.php" class="classname">mysqli_result</a></span> now implements
      <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> (instead of
      <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>).
     </p>
    </li>
   </ul>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.pgsql">
   <h4 class="title">PGSQL / PDO PGSQL</h4>

   <p class="para">
    The PGSQL and PDO PGSQL extensions now require at least libpq 9.1.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.readline">
   <h4 class="title">Readline</h4>

   <p class="para">
    Calling <span class="function"><a href="function.readline-completion-function.php" class="function">readline_completion_function()</a></span> before the interactive prompt starts
    (e.g. in <a href="ini.core.php#ini.auto-prepend-file" class="link">auto_prepend_file</a>) will now override the
    default interactive prompt completion function. Previously,
    <span class="function"><a href="function.readline-completion-function.php" class="function">readline_completion_function()</a></span> only worked when called after starting the
    interactive prompt.
   </p>
  </div>

  <div class="sect3" id="migration80.other-changes.extensions.simplexml">
   <h4 class="title">SimpleXML</h4>

   <p class="para">
    <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> now implements
    <span class="interfacename"><a href="class.recursiveiterator.php" class="interfacename">RecursiveIterator</a></span> and absorbed the functionality of
    <span class="classname"><a href="class.simplexmliterator.php" class="classname">SimpleXMLIterator</a></span>. <span class="classname"><a href="class.simplexmliterator.php" class="classname">SimpleXMLIterator</a></span> is an empty
    extension of <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span>.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration80.other-changes.ini">
  <h3 class="title">Changes to INI File Handling</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     com.dotnet_version
     is a new INI directive to choose the version of the .NET framework to use for
     <span class="classname"><a href="class.dotnet.php" class="classname">dotnet</a></span> objects.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     zend.exception_string_param_max_len
     is a new INI directive to set the maximum string length in an argument of a stringified
     stack strace.
    </p>
   </li>
   </ul>
 </div>

 <div class="sect2" id="migration80.other-changes.ebcdic">
  <h3 class="title">EBCDIC</h3>

  <p class="para">
   EBCDIC targets are no longer supported, though it&#039;s unlikely that they were still working in the
   first place.
  </p>
 </div>

 <div class="sect2" id="migration80.other-changes.performance">
  <h3 class="title">Performance</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     A Just-In-Time (JIT) compiler has been added to the opcache extension.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.array-slice.php" class="function">array_slice()</a></span> on an array without gaps will no longer scan the whole array
     to find the start offset. This may significantly reduce the runtime of the function with large
     offsets and small lengths.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.strtolower.php" class="function">strtolower()</a></span> now uses a SIMD implementation when using the
     <code class="literal">&quot;C&quot;</code> <strong><code><a href="string.constants.php#constant.lc-ctype">LC_CTYPE</a></code></strong> locale (which is the default).
    </p>
   </li>
  </ul>
 </div>

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