<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://wiki.php.net/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://wiki.php.net/feed.php">
        <title>PHP Wiki</title>
        <description></description>
        <link>https://wiki.php.net/</link>
        <image rdf:resource="https://wiki.php.net/_media/wiki/dokuwiki.svg" />
       <dc:date>2026-10-31T21:14:41+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/openssl_get_channel_binding?rev=1793357013&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc?rev=1793353700&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/password_bcrypt_wrap?rev=1793303548&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/time_instant_class?rev=1793277967&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/scope?rev=1793192802&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/array_partition?rev=1793118132&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/reldateformatter?rev=1793117250&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/min_supported_versions_php_8_6?rev=1793117178&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/query_params?rev=1793027127&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/rfc/context-managers-v2?rev=1792865755&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Asurface3d.png&amp;ns=rfc&amp;rev=1784468890&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Ascaled_on_load_rotate.png&amp;ns=rfc&amp;rev=1784270844&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Awatermarked.png&amp;ns=rfc&amp;rev=1784260645&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Ascale_entropy_visual_check.png&amp;ns=rfc&amp;rev=1783998723&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Atextcurve.png&amp;ns=rfc&amp;rev=1783692533&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Agradient_art.png&amp;ns=rfc&amp;rev=1783319544&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Atiger.png&amp;ns=rfc&amp;rev=1783319523&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Agradient_operators.png&amp;ns=rfc&amp;rev=1783319496&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Atrue_async%3Acoroutine-lifecycle.svg&amp;ns=rfc%3Atrue_async&amp;rev=1744788286&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="https://wiki.php.net/?image=rfc%3Atrue_async%3Asupervisor.svg&amp;ns=rfc%3Atrue_async&amp;rev=1742114339&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://wiki.php.net/_media/wiki/dokuwiki.svg">
        <title>PHP Wiki</title>
        <link>https://wiki.php.net/</link>
        <url>https://wiki.php.net/_media/wiki/dokuwiki.svg</url>
    </image>
    <item rdf:about="https://wiki.php.net/rfc/openssl_get_channel_binding?rev=1793357013&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-30T10:43:33+00:00</dc:date>
        <dc:creator>sjoerd (sjoerd@undisclosed.example.com)</dc:creator>
        <title>openssl_get_channel_binding</title>
        <link>https://wiki.php.net/rfc/openssl_get_channel_binding?rev=1793357013&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/30 10:36&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 68:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 68:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Return value ====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Return value ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;The function returns the raw, binary channel binding data as a non-null &amp;#039;&amp;#039;string&amp;#039;&amp;#039;. Callers that need the SASL &amp;#039;&amp;#039;cb&amp;#039;&amp;#039; property must base64-encode it. It never returns &amp;#039;&amp;#039;null&amp;#039;&amp;#039;: when the requested type is not applicable to the connection, it throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;. This happens for &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3, where that binding type is not defined, and for &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;used&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;such as&amp;#160;&lt;/strong&gt;in a&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;TLS-&lt;/strong&gt;PSK handshake.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;The function returns the raw, binary channel binding data as a non-null &amp;#039;&amp;#039;string&amp;#039;&amp;#039;. Callers that need the SASL &amp;#039;&amp;#039;cb&amp;#039;&amp;#039; property must base64-encode it. It never returns &amp;#039;&amp;#039;null&amp;#039;&amp;#039;: when the requested type is not applicable to the connection, it throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;. This happens for &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3, where that binding type is not defined, and for &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;available&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;for example&amp;#160;&lt;/strong&gt;in a PSK handshake&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;without a certificate&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Changes from the original pull request ====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Changes from the original pull request ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 78:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 78:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;^ Type ^ Standard ^ Value and applicability ^&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;^ Type ^ Standard ^ Value and applicability ^&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc5929#section-3|RFC 5929 section 3]] | The Finished message content of the relevant handshake. Defined for TLS 1.2 and earlier, but not for TLS 1.3. Throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; on TLS 1.3. |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc5929#section-3|RFC 5929 section 3]] | The Finished message content of the relevant handshake. Defined for TLS 1.2 and earlier, but not for TLS 1.3. Throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; on TLS 1.3. |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;| &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc5929#section-4.1|RFC 5929 section 4.1]] | A digest of the server certificate as it appears in the Certificate message. Requires a certificate&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;in the handshake&lt;/strong&gt;. Throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;used&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;such as&amp;#160;&lt;/strong&gt;in a&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;TLS-&lt;/strong&gt;PSK handshake. |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;| &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc5929#section-4.1|RFC 5929 section 4.1]] | A digest of the server certificate as it appears in the Certificate message. Requires a certificate. Throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;available&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;for example&amp;#160;&lt;/strong&gt;in a PSK handshake&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;without a certificate&lt;/strong&gt;. |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc9266#section-4|RFC 9266 section 4]], [[https://www.rfc-editor.org/rfc/rfc5705|RFC 5705]] | 32 octets from the TLS exporter, using the label &amp;#039;&amp;#039;EXPORTER-Channel-Binding&amp;#039;&amp;#039; and an empty context. Defined for TLS 1.3 and also available on earlier TLS versions when the exporter is available. |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; | [[https://www.rfc-editor.org/rfc/rfc9266#section-4|RFC 9266 section 4]], [[https://www.rfc-editor.org/rfc/rfc5705|RFC 5705]] | 32 octets from the TLS exporter, using the label &amp;#039;&amp;#039;EXPORTER-Channel-Binding&amp;#039;&amp;#039; and an empty context. Defined for TLS 1.3 and also available on earlier TLS versions when the exporter is available. |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 93:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 93:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The digest algorithm is taken from the certificate&amp;#039;s own signature algorithm. If that algorithm is MD5 or SHA-1, or cannot be determined, SHA-256 is used instead, as required by RFC 5929 section 4.1. For a SHA-256-signed certificate the result is identical to &amp;#039;&amp;#039;openssl_x509_fingerprint($cert, &amp;quot;sha256&amp;quot;, true)&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The digest algorithm is taken from the certificate&amp;#039;s own signature algorithm. If that algorithm is MD5 or SHA-1, or cannot be determined, SHA-256 is used instead, as required by RFC 5929 section 4.1. For a SHA-256-signed certificate the result is identical to &amp;#039;&amp;#039;openssl_x509_fingerprint($cert, &amp;quot;sha256&amp;quot;, true)&amp;#039;&amp;#039;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;On the client side the peer certificate is used. On the server side the local certificate is used.&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;This binding type is not applicable when the handshake does not use a&amp;#160;&lt;/strong&gt;certificate,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;such as any TLS-&lt;/strong&gt;PSK handshake&lt;strong class=&quot;diff-mark&quot;&gt;, even if&amp;#160;&lt;/strong&gt;a certificate&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;happens to be configured on the connection. In that case&amp;#160;&lt;/strong&gt;the function throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;On the client side the peer certificate is used. On the server side the local certificate is used.&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;If no&amp;#160;&lt;/strong&gt;certificate&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;is available&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;for example in a&amp;#160;&lt;/strong&gt;PSK handshake&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;without&amp;#160;&lt;/strong&gt;a certificate&lt;strong class=&quot;diff-mark&quot;&gt;,&amp;#160;&lt;/strong&gt;the function throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;. Otherwise the binding is computed from the available certificate&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== tls-exporter ====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== tls-exporter ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 105:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 105:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;$channel_binding_type&amp;#039;&amp;#039; is not an &amp;#039;&amp;#039;Openssl\ChannelBindingType&amp;#039;&amp;#039; | &amp;#039;&amp;#039;TypeError&amp;#039;&amp;#039;. A string such as &amp;#039;&amp;#039;&amp;quot;tls-unique&amp;quot;&amp;#039;&amp;#039; is not accepted. |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;$channel_binding_type&amp;#039;&amp;#039; is not an &amp;#039;&amp;#039;Openssl\ChannelBindingType&amp;#039;&amp;#039; | &amp;#039;&amp;#039;TypeError&amp;#039;&amp;#039;. A string such as &amp;#039;&amp;#039;&amp;quot;tls-unique&amp;quot;&amp;#039;&amp;#039; is not accepted. |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;$stream&amp;#039;&amp;#039; is a stream, but it has no active OpenSSL TLS transport (no crypto enabled, or the handshake has not completed) | &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; with the message &amp;#039;&amp;#039;Stream does not have transport encryption enabled&amp;#039;&amp;#039; |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| &amp;#039;&amp;#039;$stream&amp;#039;&amp;#039; is a stream, but it has no active OpenSSL TLS transport (no crypto enabled, or the handshake has not completed) | &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; with the message &amp;#039;&amp;#039;Stream does not have transport encryption enabled&amp;#039;&amp;#039; |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;| The requested type is not applicable to the connection | &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;. This happens for &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3 and for &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;used&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;such as&amp;#160;&lt;/strong&gt;in a&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;TLS-&lt;/strong&gt;PSK handshake. |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;| The requested type is not applicable to the connection | &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039;. This happens for &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3 and for &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; when no certificate is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;available&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;for example&amp;#160;&lt;/strong&gt;in a PSK handshake&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;without a certificate&lt;/strong&gt;. |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| An OpenSSL call fails while computing the value | &amp;#039;&amp;#039;Openssl\OpensslException&amp;#039;&amp;#039; with the message &amp;#039;&amp;#039;Failed to get channel binding data: &amp;lt;OpenSSL error&amp;gt;&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;Failed to get channel binding data&amp;#039;&amp;#039; if OpenSSL provides no error detail |&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;| An OpenSSL call fails while computing the value | &amp;#039;&amp;#039;Openssl\OpensslException&amp;#039;&amp;#039; with the message &amp;#039;&amp;#039;Failed to get channel binding data: &amp;lt;OpenSSL error&amp;gt;&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;Failed to get channel binding data&amp;#039;&amp;#039; if OpenSSL provides no error detail |&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 215:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 215:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;Channel binding data is not a secret: RFC 5929 section 10 explicitly allows authentication mechanisms to disclose it. The value is nevertheless security-relevant, because it is what prevents a relay attack. Applications must use the same type that the negotiated SASL mechanism expects. An &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; means that no binding is available for that type; applications must not swallow it and continue authentication without a binding, and must not treat an unsupported binding as an authenticated connection.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;Channel binding data is not a secret: RFC 5929 section 10 explicitly allows authentication mechanisms to disclose it. The value is nevertheless security-relevant, because it is what prevents a relay attack. Applications must use the same type that the negotiated SASL mechanism expects. An &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; means that no binding is available for that type; applications must not swallow it and continue authentication without a binding, and must not treat an unsupported binding as an authenticated connection.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; is the appropriate choice for TLS 1.3. &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; is only meaningful for TLS 1.2 and earlier. &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; is useful when the application needs a value that does not change after renegotiation and when&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;the handshake uses&amp;#160;&lt;/strong&gt;a server certificate.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; is the appropriate choice for TLS 1.3. &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; is only meaningful for TLS 1.2 and earlier. &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; is useful when the application needs a value that does not change after renegotiation and when a server certificate&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;is available&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Backward Incompatible Changes =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Backward Incompatible Changes =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 266:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 266:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;The implementation is [[https://github.com/php/php-src/pull/24035|pull request #24035]]. It contains PHPT tests for TLS 1.2 and TLS 1.3, including checks that the client and server derive the same &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; and &amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; values, and checks of &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; against the certificate fingerprint. A TLS-PSK test verifies that &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; when&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;the handshake uses&amp;#160;&lt;/strong&gt;no certificate. The tests also cover the error conditions, including &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; for a stream without transport encryption and the exception hierarchy. The implementation and tests match the API described in this RFC.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;The implementation is [[https://github.com/php/php-src/pull/24035|pull request #24035]]. It contains PHPT tests for TLS 1.2 and TLS 1.3, including checks that the client and server derive the same &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; and &amp;#039;&amp;#039;tls-exporter&amp;#039;&amp;#039; values, and checks of &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; against the certificate fingerprint. A TLS-PSK test verifies that &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; throws &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; when no certificate&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;is available&lt;/strong&gt;. The tests also cover the error conditions, including &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; for a stream without transport encryption and the exception hierarchy. The implementation and tests match the API described in this RFC.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The implementation has also been tested manually against Prosody and PostgreSQL.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The implementation has also been tested manually against Prosody and PostgreSQL.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 299:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 299:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Integer constants.** Global constants such as &amp;#039;&amp;#039;OPENSSL_CHANNEL_BINDING_TLS_UNIQUE&amp;#039;&amp;#039; would be less discoverable and would not give the parameter a precise type.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Integer constants.** Global constants such as &amp;#039;&amp;#039;OPENSSL_CHANNEL_BINDING_TLS_UNIQUE&amp;#039;&amp;#039; would be less discoverable and would not give the parameter a precise type.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Accepting a stream context.** The original issue suggested accepting either a stream or a stream context. A context can create multiple connections, so it does not identify one channel. The function therefore requires a connected stream.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Accepting a stream context.** The original issue suggested accepting either a stream or a stream context. A context can create multiple connections, so it does not identify one channel. The function therefore requires a connected stream.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * **Returning &amp;#039;&amp;#039;null&amp;#039;&amp;#039; for an inapplicable type.** It would force every call site to check for &amp;#039;&amp;#039;null&amp;#039;&amp;#039; and would make a successful return ambiguous. &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3 and &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;in a handshake&amp;#160;&lt;/strong&gt;without a certificate are protocol-level incompatibilities, not silent successes. The dedicated &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; lets callers explicitly choose another type.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * **Returning &amp;#039;&amp;#039;null&amp;#039;&amp;#039; for an inapplicable type.** It would force every call site to check for &amp;#039;&amp;#039;null&amp;#039;&amp;#039; and would make a successful return ambiguous. &amp;#039;&amp;#039;tls-unique&amp;#039;&amp;#039; over TLS 1.3 and &amp;#039;&amp;#039;tls-server-end-point&amp;#039;&amp;#039; without a certificate are protocol-level incompatibilities, not silent successes. The dedicated &amp;#039;&amp;#039;Openssl\UnsupportedChannelBindingException&amp;#039;&amp;#039; lets callers explicitly choose another type.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Adding an &amp;#039;&amp;#039;Openssl\OpensslError&amp;#039;&amp;#039; class.** No such class exists today. A stream without crypto enabled is an invalid argument value, so the standard &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; is sufficient. Introducing a new &amp;#039;&amp;#039;Error&amp;#039;&amp;#039; hierarchy is a broader API decision that should not be part of this RFC.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Adding an &amp;#039;&amp;#039;Openssl\OpensslError&amp;#039;&amp;#039; class.** No such class exists today. A stream without crypto enabled is an invalid argument value, so the standard &amp;#039;&amp;#039;ValueError&amp;#039;&amp;#039; is sufficient. Introducing a new &amp;#039;&amp;#039;Error&amp;#039;&amp;#039; hierarchy is a broader API decision that should not be part of this RFC.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Supporting &amp;#039;&amp;#039;tls-unique-for-telnet&amp;#039;&amp;#039;.** It is registered by IANA but is specific to Telnet and is not used by SASL.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * **Supporting &amp;#039;&amp;#039;tls-unique-for-telnet&amp;#039;&amp;#039;.** It is registered by IANA but is specific to Telnet and is not used by SASL.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc?rev=1793353700&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-30T09:48:20+00:00</dc:date>
        <dc:creator>sjoerd (sjoerd@undisclosed.example.com)</dc:creator>
        <title>rfc</title>
        <link>https://wiki.php.net/rfc?rev=1793353700&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/29 20:09&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 21:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 21:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:password_bcrypt_wrap|Add PASSWORD_BCRYPT_WRAP]] (Created 2026-10-29, Discussion started 2026-10-29)&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:password_bcrypt_wrap|Add PASSWORD_BCRYPT_WRAP]] (Created 2026-10-29, Discussion started 2026-10-29)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * [[rfc:openssl_get_channel_binding|openssl_get_channel_binding()]] (Created 2026-10-23, Discussion started 2026-10-27)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:scope|Scope]] (Created 2026-10-23, Discussion started 2026-10-26)&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:scope|Scope]] (Created 2026-10-23, Discussion started 2026-10-26)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:array_partition|array_partition()]] (Created 2026-10-25, Discussion started 2026-10-25)&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * [[rfc:array_partition|array_partition()]] (Created 2026-10-25, Discussion started 2026-10-25)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/password_bcrypt_wrap?rev=1793303548&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-29T19:52:28+00:00</dc:date>
        <dc:creator>narf (narf@undisclosed.example.com)</dc:creator>
        <title>password_bcrypt_wrap - Created page</title>
        <link>https://wiki.php.net/rfc/password_bcrypt_wrap?rev=1793303548&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/29 20:19&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 94:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 94:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - Generate 16 bytes of random salt.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - Generate 16 bytes of random salt.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; - Prehash input password with chosen algorithm, and salt prepended by &amp;#039;&amp;#039;bcrypt-wrap:&lt;strong class=&quot;diff-mark&quot;&gt;&amp;lt;version&amp;gt;&lt;/strong&gt;:&amp;#039;&amp;#039; (&lt;strong class=&quot;diff-mark&quot;&gt;first version is&amp;#160;&lt;/strong&gt;0).&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; - Prehash input password with chosen algorithm, and salt prepended by &amp;#039;&amp;#039;bcrypt-wrap:&lt;strong class=&quot;diff-mark&quot;&gt;0&lt;/strong&gt;:&amp;#039;&amp;#039; (&lt;strong class=&quot;diff-mark&quot;&gt;where&amp;#160;&lt;/strong&gt;0&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;is current version&lt;/strong&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - B64-encode prehash.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - B64-encode prehash.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - Bcrypt-Base64-encode the salt.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; - Bcrypt-Base64-encode the salt.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/time_instant_class?rev=1793277967&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-29T12:46:07+00:00</dc:date>
        <dc:creator>timwolla (timwolla@undisclosed.example.com)</dc:creator>
        <title>time_instant_class - Specify the 32-bit limit in `until()`&#039;s docblock.</title>
        <link>https://wiki.php.net/rfc/time_instant_class?rev=1793277967&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/29 12:46&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 271:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 271:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The exact representable range is unspecified and will be left to implementation constraints. It will be capable of at least representing all instants that &amp;lt;php&amp;gt;DateTimeImmutable&amp;lt;/php&amp;gt; is capable of representing. This also means that the time between two instants will be able to exceed the range of &amp;lt;php&amp;gt;Time\Duration&amp;lt;/php&amp;gt;. Future PHP versions may increase the supported range, but may not decrease it.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The exact representable range is unspecified and will be left to implementation constraints. It will be capable of at least representing all instants that &amp;lt;php&amp;gt;DateTimeImmutable&amp;lt;/php&amp;gt; is capable of representing. This also means that the time between two instants will be able to exceed the range of &amp;lt;php&amp;gt;Time\Duration&amp;lt;/php&amp;gt;. Future PHP versions may increase the supported range, but may not decrease it.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;The ISO-8601 parser (&amp;lt;php&amp;gt;fromIso8601DateTimeString()&amp;lt;/php&amp;gt;) is strict: It will only accept well-formed inputs, but may not support all legal formats. Specifying&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;an UTC&amp;#160;&lt;/strong&gt;offset is required, PHP’s default timezone will not be used, since this would effectively invent information out of thin air. It naturally will support all possible return values of &amp;lt;php&amp;gt;toIso8601DateTimeString()&amp;lt;/php&amp;gt;. Support for additional formats may be added in future PHP versions by a simple pull request.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;The ISO-8601 parser (&amp;lt;php&amp;gt;fromIso8601DateTimeString()&amp;lt;/php&amp;gt;) is strict: It will only accept well-formed inputs, but may not support all legal formats. Specifying&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;a zone&amp;#160;&lt;/strong&gt;offset is required, PHP’s default timezone will not be used, since this would effectively invent information out of thin air. It naturally will support all possible return values of &amp;lt;php&amp;gt;toIso8601DateTimeString()&amp;lt;/php&amp;gt;. Support for additional formats may be added in future PHP versions by a simple pull request.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;lt;php&amp;gt;fromUnixTimestampMilliseconds()&amp;lt;/php&amp;gt; constructor and &amp;lt;php&amp;gt;toUnixTimestampMilliseconds()&amp;lt;/php&amp;gt; getter are provided for interoperability with programming languages using Unix timestamps with millisecond precision, in particular JavaScript.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;lt;php&amp;gt;fromUnixTimestampMilliseconds()&amp;lt;/php&amp;gt; constructor and &amp;lt;php&amp;gt;toUnixTimestampMilliseconds()&amp;lt;/php&amp;gt; getter are provided for interoperability with programming languages using Unix timestamps with millisecond precision, in particular JavaScript.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 443:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 443:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Changelog =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Changelog =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * 2026-10-29: Clarify (in prose) that the ISO-8601 constructor requires&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;an&amp;#160;&lt;/strong&gt;offset, not a timezone.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * 2026-10-29: Clarify (in prose) that the ISO-8601 constructor requires&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;a zone&amp;#160;&lt;/strong&gt;offset, not a timezone.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 2026-10-29: Add exposing the nominal SystemClock resolution to future scope.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 2026-10-29: Add exposing the nominal SystemClock resolution to future scope.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 2026-10-07: Make SystemClock a singleton.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 2026-10-07: Make SystemClock a singleton.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/scope?rev=1793192802&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-28T13:06:42+00:00</dc:date>
        <dc:creator>frodeborli (frodeborli@undisclosed.example.com)</dc:creator>
        <title>scope - Changed implementation cost analysis for core</title>
        <link>https://wiki.php.net/rfc/scope?rev=1793192802&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/27 11:51&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 1:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;====== PHP RFC: Scope ======&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;====== PHP RFC: Scope ======&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * Version: 0.9.&lt;strong class=&quot;diff-mark&quot;&gt;3&lt;/strong&gt; &lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * Version: 0.9.&lt;strong class=&quot;diff-mark&quot;&gt;4&lt;/strong&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * Date: 2026-10-&lt;strong class=&quot;diff-mark&quot;&gt;27&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * Date: 2026-10-&lt;strong class=&quot;diff-mark&quot;&gt;28&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Author: Frode Børli, &amp;lt;frode@ennerd.com&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Author: Frode Børli, &amp;lt;frode@ennerd.com&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Status: Under Discussion&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Status: Under Discussion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 275:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 275:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;**References and globals.** &amp;#039;&amp;#039;%%$GLOBALS[&amp;#039;_GET&amp;#039;]%%&amp;#039;&amp;#039; and &amp;#039;&amp;#039;%%global $_GET%%&amp;#039;&amp;#039; refer to the current scope&amp;#039;s value. A reference taken before switching scopes, such as &amp;#039;&amp;#039;%%$g = &amp;amp;$_GET%%&amp;#039;&amp;#039;, continues to refer to the earlier array. Switching scopes changes the global binding, not existing references.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;**References and globals.** &amp;#039;&amp;#039;%%$GLOBALS[&amp;#039;_GET&amp;#039;]%%&amp;#039;&amp;#039; and &amp;#039;&amp;#039;%%global $_GET%%&amp;#039;&amp;#039; refer to the current scope&amp;#039;s value. A reference taken before switching scopes, such as &amp;#039;&amp;#039;%%$g = &amp;amp;$_GET%%&amp;#039;&amp;#039;, continues to refer to the earlier array. Switching scopes changes the global binding, not existing references.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;**Implementation.**&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;The&amp;#160;&lt;/strong&gt;engine&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;can swap&amp;#160;&lt;/strong&gt;six &amp;#039;&amp;#039;%%zval%%&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;entries&amp;#160;&lt;/strong&gt;in the global symbol table&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;on each scope switch, saving the old&amp;#160;&lt;/strong&gt;entries&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;in&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;outgoing scope&amp;#160;&lt;/strong&gt;and&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;loading those of&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;incoming&amp;#160;&lt;/strong&gt;scope&lt;strong class=&quot;diff-mark&quot;&gt;. Arrays&amp;#160;&lt;/strong&gt;are&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;not&amp;#160;&lt;/strong&gt;copied. Reads and writes retain their current cost. The extension&amp;#039;s tests cover &amp;#039;&amp;#039;%%PG(http_globals)%%&amp;#039;&amp;#039;, the lazily created auto-globals, &amp;#039;&amp;#039;%%unset($_GET)%%&amp;#039;&amp;#039; and &amp;#039;&amp;#039;%%global $_GET%%&amp;#039;&amp;#039;; the php-src implementation must pass the same tests. Under ZTS, each thread has its own symbol table and root scope. Whether a save handler locks is declared by a new field of &amp;#039;&amp;#039;%%ps_module%%&amp;#039;&amp;#039;: the files handler sets it, and modules such as the PECL redis and memcached handlers can set it from their own locking settings. A user handler built on &amp;#039;&amp;#039;%%SessionHandler%%&amp;#039;&amp;#039; locks when the handler it wraps does; other user handlers are taken not to lock.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;**Implementation.**&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;In the&amp;#160;&lt;/strong&gt;engine&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;each scope holds its own&amp;#160;&lt;/strong&gt;six &amp;#039;&amp;#039;%%zval%%&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;s, and the current scope is a pointer&amp;#160;&lt;/strong&gt;in the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;executor globals. The&amp;#160;&lt;/strong&gt;global symbol table&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;s&amp;#160;&lt;/strong&gt;entries&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;for&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;six,&amp;#160;&lt;/strong&gt;and&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;&amp;#039;%%PG(http_globals)%%&amp;#039;&amp;#039;, resolve through&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;current&amp;#160;&lt;/strong&gt;scope&lt;strong class=&quot;diff-mark&quot;&gt;, so a scope switch changes where these values&amp;#160;&lt;/strong&gt;are&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;read from: nothing is moved,&amp;#160;&lt;/strong&gt;copied&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;or compared, and a switch costs a few pointer stores, the same whatever the scopes hold&lt;/strong&gt;. Reads and writes retain their current cost&lt;strong class=&quot;diff-mark&quot;&gt;, plus one pointer load. ext/session reaches its state (&amp;#039;&amp;#039;%%$_SESSION%%&amp;#039;&amp;#039;, the id, the status, the save handler and its data) through the current scope the same way. The extension cannot change where the engine reads these values, so it moves them between the symbol table and the scopes at every switch instead; its measurements below are an upper bound for the engine&lt;/strong&gt;. The extension&amp;#039;s tests cover &amp;#039;&amp;#039;%%PG(http_globals)%%&amp;#039;&amp;#039;, the lazily created auto-globals, &amp;#039;&amp;#039;%%unset($_GET)%%&amp;#039;&amp;#039; and &amp;#039;&amp;#039;%%global $_GET%%&amp;#039;&amp;#039;; the php-src implementation must pass the same tests. Under ZTS, each thread has its own symbol table and root scope. Whether a save handler locks is declared by a new field of &amp;#039;&amp;#039;%%ps_module%%&amp;#039;&amp;#039;: the files handler sets it, and modules such as the PECL redis and memcached handlers can set it from their own locking settings. A user handler built on &amp;#039;&amp;#039;%%SessionHandler%%&amp;#039;&amp;#039; locks when the handler it wraps does; other user handlers are taken not to lock.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;**Why include them now?** These are the request values that long-running servers already need to isolate. Moving them first tests the scope-switching mechanism against existing PHP behavior. The same approach can later apply to other engine state. Vote A covers request input and sessions together.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;**Why include them now?** These are the request values that long-running servers already need to isolate. Moving them first tests the scope-switching mechanism against existing PHP behavior. The same approach can later apply to other engine state. Vote A covers request input and sessions together.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 437:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 437:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;An extension implementing this RFC, including both secondary votes, is released for PHP 8.2 to 8.5 as &amp;#039;&amp;#039;%%fiber-interop/ext-scope%%&amp;#039;&amp;#039; 0.&lt;strong class=&quot;diff-mark&quot;&gt;4&lt;/strong&gt;.&lt;strong class=&quot;diff-mark&quot;&gt;4&amp;#160;&lt;/strong&gt;(https://github.com/fiber-interop/ext-scope, &amp;#039;&amp;#039;%%pie install fiber-interop/ext-scope%%&amp;#039;&amp;#039;), with phpt tests for each rule in this text. A userland polyfill with the same class and tests is &amp;#039;&amp;#039;%%fiber-interop/scope%%&amp;#039;&amp;#039; 0.4.0. A pull request against php-src master will accompany the RFC before the vote.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;An extension implementing this RFC, including both secondary votes, is released for PHP 8.2 to 8.5 as &amp;#039;&amp;#039;%%fiber-interop/ext-scope%%&amp;#039;&amp;#039; 0.&lt;strong class=&quot;diff-mark&quot;&gt;5&lt;/strong&gt;.&lt;strong class=&quot;diff-mark&quot;&gt;0&amp;#160;&lt;/strong&gt;(https://github.com/fiber-interop/ext-scope, &amp;#039;&amp;#039;%%pie install fiber-interop/ext-scope%%&amp;#039;&amp;#039;), with phpt tests for each rule in this text. A userland polyfill with the same class and tests is &amp;#039;&amp;#039;%%fiber-interop/scope%%&amp;#039;&amp;#039; 0.4.0. A pull request against php-src master will accompany the RFC before the vote.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 464:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 464:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The last row is a generator created in one scope and stepped from another, so every step switches the six superglobals, the session, and the locale and timezone in and back out. It is the cost of interleaving operations, paid only when the current scope changes.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The last row is a generator created in one scope and stepped from another, so every step switches the six superglobals, the session, and the locale and timezone in and back out. It is the cost of interleaving operations, paid only when the current scope changes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;These figures measure the extension&amp;#039;s&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;hash-table-based&amp;#160;&lt;/strong&gt;approach, not the proposed php-src implementation. In core, each fiber and generator&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;can hold&amp;#160;&lt;/strong&gt;a scope pointer directly. The php-src patch will include its own measurements.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;These figures measure the extension&amp;#039;s approach, not the proposed php-src implementation&lt;strong class=&quot;diff-mark&quot;&gt;. The extension keeps each fiber&amp;#039;s scope in a hash table and, at every change of scope, moves the six superglobals and copies ext/session&amp;#039;s, the locale&amp;#039;s and the timezone&amp;#039;s state between the live globals and the scopes&lt;/strong&gt;. In core, each fiber and generator&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;holds&amp;#160;&lt;/strong&gt;a scope pointer directly&lt;strong class=&quot;diff-mark&quot;&gt;, and the per-scope state is reached through the current scope (see vote A&amp;#039;s implementation note), so a switch is a few pointer stores and costs the same whatever the scopes hold&lt;/strong&gt;. The php-src patch will include its own measurements.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Threads ====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Threads ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 473:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 473:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Scope multiplexes one thread&amp;#039;s state between operations; threads multiplex one process&amp;#039;s state between executors. A server may use both: worker threads, each serving several requests as scopes.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Scope multiplexes one thread&amp;#039;s state between operations; threads multiplex one process&amp;#039;s state between executors. A server may use both: worker threads, each serving several requests as scopes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * For extension authors, per-scope state is the module-globals pattern with a shorter lifetime: declared the same way, constructed when a scope first touches it, destroyed when the scope is released. The follow-up RFC describes it in that vocabulary.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * For extension authors, per-scope state is the module-globals pattern with a shorter lifetime: declared the same way, constructed when a scope first touches it, destroyed when the scope is released. The follow-up RFC describes it in that vocabulary.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * Cost: state converted to follow the scope is&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;swapped on switch, not&amp;#160;&lt;/strong&gt;reached through&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;an indirection&lt;/strong&gt;, so access costs&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;what it costs&amp;#160;&lt;/strong&gt;today on both builds and a switch costs a&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;bounded number of word moves proportional to&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;converted state&lt;/strong&gt;. State&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;that hands out pointers into itself cannot&amp;#160;&lt;/strong&gt;be&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;moved&amp;#160;&lt;/strong&gt;by value&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;and is reached indirectly&lt;/strong&gt;; the follow-up RFC lists&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;such cases&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * Cost: state converted to follow the scope is reached through&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;the current scope&lt;/strong&gt;, so access costs&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;one pointer load more than&amp;#160;&lt;/strong&gt;today on both builds&lt;strong class=&quot;diff-mark&quot;&gt;,&amp;#160;&lt;/strong&gt;and a switch costs a&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;few pointer stores whatever&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;scopes hold&lt;/strong&gt;. State&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;small enough to&amp;#160;&lt;/strong&gt;be&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;swapped&amp;#160;&lt;/strong&gt;by value&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;at no measurable cost, such as the default timezone, may be swapped instead&lt;/strong&gt;; the follow-up RFC lists&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;the choice for each kind of state&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Scope adds no concurrency. State that follows the scope is never visible to another operation, so code that was correct under one request per process stays correct for that state. State kept shared on purpose stays shared, as it is across requests in any long-running process today.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Scope adds no concurrency. State that follows the scope is never visible to another operation, so code that was correct under one request per process stays correct for that state. State kept shared on purpose stays shared, as it is across requests in any long-running process today.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 495:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 495:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 0.9.2 (2026-10-27): Introduction rewritten; no change to the proposal.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 0.9.2 (2026-10-27): Introduction rewritten; no change to the proposal.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 0.9.3 (2026-10-27): vote A: &amp;#039;&amp;#039;%%session_start()%%&amp;#039;&amp;#039; throws a &amp;#039;&amp;#039;%%RuntimeException%%&amp;#039;&amp;#039; instead of blocking the process when a locking save handler&amp;#039;s session id is active in another scope of the process (ext-scope 0.4.4); listed under Open Issues.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * 0.9.3 (2026-10-27): vote A: &amp;#039;&amp;#039;%%session_start()%%&amp;#039;&amp;#039; throws a &amp;#039;&amp;#039;%%RuntimeException%%&amp;#039;&amp;#039; instead of blocking the process when a locking save handler&amp;#039;s session id is active in another scope of the process (ext-scope 0.4.4); listed under Open Issues.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * 0.9.4 (2026-10-28): implementation: in the engine, per-scope state is reached through the current scope, so a switch costs a few pointer stores whatever the scopes hold, and an access one pointer load more (Threads, &amp;quot;Cost&amp;quot;); the extension moves the state at each switch instead (ext-scope 0.5.0).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/array_partition?rev=1793118132&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-27T16:22:12+00:00</dc:date>
        <dc:creator>ayoubezzini (ayoubezzini@undisclosed.example.com)</dc:creator>
        <title>array_partition - Document reference handling, add it as an open issue</title>
        <link>https://wiki.php.net/rfc/array_partition?rev=1793118132&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/27 10:31&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 62:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 62:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;The only observable difference is that the native function keeps by-reference elements of the input as references, like &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;The only observable difference is that the native function keeps by-reference elements of the input as references, like &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;(see &amp;quot;By-reference elements&amp;quot; below and &amp;quot;Open Issues&amp;quot;)&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The callback is called once for each element, in array order, and receives the value and the key, like &amp;#039;&amp;#039;array_find()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_find_key()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_any()&amp;#039;&amp;#039; and &amp;#039;&amp;#039;array_all()&amp;#039;&amp;#039;. The function returns a list of exactly two arrays:&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The callback is called once for each element, in array order, and receives the value and the key, like &amp;#039;&amp;#039;array_find()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_find_key()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_any()&amp;#039;&amp;#039; and &amp;#039;&amp;#039;array_all()&amp;#039;&amp;#039;. The function returns a list of exactly two arrays:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 92:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 92:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * The return value of the callback is interpreted with the usual boolean conversion, as in &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * The return value of the callback is interpreted with the usual boolean conversion, as in &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * &amp;#039;&amp;#039;array_partition($a, $cb)[0]&amp;#039;&amp;#039; is identical (&amp;#039;&amp;#039;===&amp;#039;&amp;#039;) to &amp;#039;&amp;#039;array_filter($a, $cb, ARRAY_FILTER_USE_BOTH)&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;array_partition($a, $cb)[1]&amp;#039;&amp;#039; is identical to &amp;#039;&amp;#039;array_diff_key($a, array_partition($a, $cb)[0])&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * &amp;#039;&amp;#039;array_partition($a, $cb)[0]&amp;#039;&amp;#039; is identical (&amp;#039;&amp;#039;===&amp;#039;&amp;#039;) to &amp;#039;&amp;#039;array_filter($a, $cb, ARRAY_FILTER_USE_BOTH)&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;array_partition($a, $cb)[1]&amp;#039;&amp;#039; is identical to &amp;#039;&amp;#039;array_diff_key($a, array_partition($a, $cb)[0])&amp;#039;&amp;#039;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * An empty input returns&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;&amp;#039;%%&lt;/strong&gt;[[], []]&lt;strong class=&quot;diff-mark&quot;&gt;%%&amp;#039;&amp;#039;&lt;/strong&gt;, so the result can always be destructured into two variables.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * An empty input returns&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;lt;php&amp;gt;&lt;/strong&gt;[[], []]&lt;strong class=&quot;diff-mark&quot;&gt;&amp;lt;/php&amp;gt;&lt;/strong&gt;, so the result can always be destructured into two variables.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * If the callback throws, the exception is propagated, no further elements are visited and no partial result is returned.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * If the callback throws, the exception is propagated, no further elements are visited and no partial result is returned.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; *&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;By-reference elements of&amp;#160;&lt;/strong&gt;the input&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;are handled&amp;#160;&lt;/strong&gt;in the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;same way&amp;#160;&lt;/strong&gt;as&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;in&amp;#160;&lt;/strong&gt;&amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; *&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;Elements that are references in&amp;#160;&lt;/strong&gt;the input&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;stay references&amp;#160;&lt;/strong&gt;in the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;result,&amp;#160;&lt;/strong&gt;as&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;with&amp;#160;&lt;/strong&gt;&amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;. See &amp;quot;By-reference elements&amp;quot; below&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * There is no &amp;#039;&amp;#039;$mode&amp;#039;&amp;#039; parameter. The callback always receives both the value and the key, following &amp;#039;&amp;#039;array_find()&amp;#039;&amp;#039; rather than &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;. A callback that accepts only the value works unchanged, because userland functions ignore extra arguments.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * There is no &amp;#039;&amp;#039;$mode&amp;#039;&amp;#039; parameter. The callback always receives both the value and the key, following &amp;#039;&amp;#039;array_find()&amp;#039;&amp;#039; rather than &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;. A callback that accepts only the value works unchanged, because userland functions ignore extra arguments.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 107:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 107:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;array_partition([&amp;#039;x&amp;#039;], is_string(?));&amp;#160; // works, partial function application (PHP 8.6+)&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;array_partition([&amp;#039;x&amp;#039;], is_string(?));&amp;#160; // works, partial function application (PHP 8.6+)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;==== By-reference elements ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;An element that is a reference in the input, and is still referenced elsewhere, is a reference in the result too. Writing to it through the result changes the input, and the other way round:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$input = [1, 2, 3];&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$ref = &amp;amp;$input[0];&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;[$matching, $rest] = array_partition($input, fn($v) =&amp;gt; $v === 1);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$matching[0] = &amp;#039;changed&amp;#039;;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;var_dump($input[0]); // string(7) &amp;quot;changed&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$ref = &amp;#039;again&amp;#039;;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;var_dump($matching[0]); // string(5) &amp;quot;again&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;A reference that is no longer shared, for example after &amp;#039;&amp;#039;unset($ref)&amp;#039;&amp;#039;, is copied as a plain value:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$input = [1, 2, 3];&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$ref = &amp;amp;$input[0];&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;unset($ref);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;[$matching, $rest] = array_partition($input, fn($v) =&amp;gt; $v === 1);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$matching[0] = &amp;#039;changed&amp;#039;;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;var_dump($input[0]); // int(1)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;This is the same behaviour as &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_diff_key()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_slice()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_values()&amp;#039;&amp;#039; and &amp;#039;&amp;#039;array_chunk()&amp;#039;&amp;#039;. Whether &amp;#039;&amp;#039;array_partition()&amp;#039;&amp;#039; should keep it is listed under &amp;quot;Open Issues&amp;quot;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Why the matching elements come first ====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;==== Why the matching elements come first ====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 195:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 227:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Open Issues =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Open Issues =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;None at this time&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#160; * **Reference handling.** The proposed implementation keeps references, as described in &amp;quot;By-reference elements&amp;quot;. This matches the array functions that return part of their input (&amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_diff_key()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_slice()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_values()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;array_chunk()&amp;#039;&amp;#039;), and means that replacing the &amp;#039;&amp;#039;array_filter()&amp;#039;&amp;#039; + &amp;#039;&amp;#039;array_diff_key()&amp;#039;&amp;#039; idiom with &amp;#039;&amp;#039;array_partition()&amp;#039;&amp;#039; does not change behaviour. On the other hand, the behaviour cannot be reproduced exactly in userland, and writing to a result element can modify the input. &amp;#039;&amp;#039;array_find()&amp;#039;&amp;#039; drops references, but it returns a single value rather than an array. Dropping references instead would be a one-line change in the implementation. Feedback on which behaviour is preferred is welcome&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Future Scope =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Future Scope =====&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/reldateformatter?rev=1793117250&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-27T16:07:30+00:00</dc:date>
        <dc:creator>weilindu (weilindu@undisclosed.example.com)</dc:creator>
        <title>reldateformatter - Add voting and implementation links</title>
        <link>https://wiki.php.net/rfc/reldateformatter?rev=1793117250&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/22 01:45&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 6:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 6:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Implementation: https://github.com/php/php-src/pull/23514&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Implementation: https://github.com/php/php-src/pull/23514&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Discussion thread: https://externals.io/message/132187&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; * Discussion thread: https://externals.io/message/132187&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; * Voting thread:&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;TBD&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; * Voting thread:&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;https://externals.io/message/132830&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Introduction =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Introduction =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 436:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 436:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Patches and Tests =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;TBD&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;Implementation: https://github&lt;/strong&gt;.&lt;strong class=&quot;diff-mark&quot;&gt;com/php/php-src/pull/23514&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/min_supported_versions_php_8_6?rev=1793117178&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-27T16:06:18+00:00</dc:date>
        <dc:creator>timwolla (timwolla@undisclosed.example.com)</dc:creator>
        <title>min_supported_versions_php_8_6 - Add one implementation link</title>
        <link>https://wiki.php.net/rfc/min_supported_versions_php_8_6?rev=1793117178&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/07/30 15:59&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 84:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 84:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Implementation =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;N&lt;/strong&gt;/&lt;strong class=&quot;diff-mark&quot;&gt;A&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#160; * autoconf 2.71: https:&lt;/strong&gt;/&lt;strong class=&quot;diff-mark&quot;&gt;/github.com/php/php-src/commit/b092f3fff1fe6c53cdc684ea59fed77a3c8b4564&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== References =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== References =====&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/query_params?rev=1793027127&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-26T15:05:27+00:00</dc:date>
        <dc:creator>kocsismate (kocsismate@undisclosed.example.com)</dc:creator>
        <title>query_params</title>
        <link>https://wiki.php.net/rfc/query_params?rev=1793027127&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/26 12:42&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 146:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 146:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; #[\NoDiscard]&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; #[\NoDiscard]&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; public function&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;sort&lt;/strong&gt;(): static {}&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; public function&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;sortByBytes(): static {} &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;  &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; #[\NoDiscard] &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; public function sortByUtf16&lt;/strong&gt;(): static {}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; /**&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; /**&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 260:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 263:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;When encountering malformed percent-encoded sequences, such as &amp;#039;&amp;#039;%&amp;#039;&amp;#039;, &amp;#039;&amp;#039;%2&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;%GG&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Uri\QueryParams::parseRfc1866()&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Uri\QueryParams::parseRfc3986()&amp;#039;&amp;#039; throw an &amp;#039;&amp;#039;Uri\InvalidQueryParamsException&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;. This behavior is a design decision on PHP&amp;#039;s side, as there&amp;#039;s no relevant mandate either in RFC 1866 or in RFC 3986&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;When encountering malformed percent-encoded sequences, such as &amp;#039;&amp;#039;%&amp;#039;&amp;#039;, &amp;#039;&amp;#039;%2&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;%GG&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Uri\QueryParams::parseRfc1866()&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Uri\QueryParams::parseRfc3986()&amp;#039;&amp;#039; throw an &amp;#039;&amp;#039;Uri\InvalidQueryParamsException&amp;#039;&amp;#039;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;foo=%&amp;amp;bar=%2&amp;amp;baz=%GG&amp;quot;);&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;foo=%&amp;amp;bar=%2&amp;amp;baz=%GG&amp;quot;);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;var_dump($params-&amp;gt;getFirst(&amp;quot;foo&amp;quot;));&amp;#160; &amp;#160; &amp;#160; &amp;#160;&amp;#160;&lt;/strong&gt;//&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;string(1) &amp;quot;%&amp;quot; &lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;//&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;Throws Uri\InvalidQueryParamsException&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;var_dump($params-&amp;gt;getFirst(&amp;quot;bar&amp;quot;));&amp;#160; &amp;#160; &amp;#160; &amp;#160; // string(2) &amp;quot;%2&amp;quot; &lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;var_dump($params-&amp;gt;getFirst(&amp;quot;baz&amp;quot;));&amp;#160; &amp;#160; &amp;#160; &amp;#160; // string(3) &amp;quot;%GG&amp;quot; &lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt; &lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;echo $params-&amp;gt;toRfc3986String();&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;// foo=%25&amp;amp;bar=%252&amp;amp;baz=%25GG&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;On the other hand, WHATWG URL has detailed requirements for handling malformed percent-encoded sequences that &amp;#039;&amp;#039;Uri\QueryParams::parseWhatWgUrlSearchParams()&amp;#039;&amp;#039; respects: these sequences are&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;also&amp;#160;&lt;/strong&gt;preserved during parsing.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;On the other hand, WHATWG URL has detailed requirements for handling malformed percent-encoded sequences that &amp;#039;&amp;#039;Uri\QueryParams::parseWhatWgUrlSearchParams()&amp;#039;&amp;#039; respects: these sequences are preserved during parsing.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 311:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 310:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;This replacement loses the original invalid bytes: recomposing the query string encodes the replacement character rather than recovering the original &amp;#039;&amp;#039;%FF&amp;#039;&amp;#039;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;This replacement loses the original invalid bytes: recomposing the query string encodes the replacement character rather than recovering the original &amp;#039;&amp;#039;%FF&amp;#039;&amp;#039;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;According to WHATWG URL&amp;#039;s [[https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams|new URLSearchParams(init)]] algorithm, exactly one leading &amp;quot;?&amp;quot; character is removed during the &amp;#039;&amp;#039;QueryParams::parseWhatWgUrlSearchParams()&amp;#039;&amp;#039; call&lt;strong class=&quot;diff-mark&quot;&gt;. In contrast to this behavior, the leading &amp;quot;?&amp;quot; becomes part of the first query parameter name for RFC 1866 and RFC 3986 query params&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;According to WHATWG URL&amp;#039;s [[https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams|new URLSearchParams(init)]] algorithm, exactly one leading &amp;quot;?&amp;quot; character is removed during the &amp;#039;&amp;#039;QueryParams::parseWhatWgUrlSearchParams()&amp;#039;&amp;#039; call.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;?abc=foo&amp;quot;);&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;// $params internally contains the [&amp;quot;?abc&amp;quot; =&amp;gt; &amp;quot;foo&amp;quot;] key-value pair&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseWhatWgUrlSearchParams(&amp;quot;?abc=foo&amp;quot;);&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseWhatWgUrlSearchParams(&amp;quot;?abc=foo&amp;quot;);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;// $params internally contains the [&amp;quot;abc&amp;quot; =&amp;gt; &amp;quot;foo&amp;quot;] key-value pair&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;// $params internally contains the [&amp;quot;abc&amp;quot; =&amp;gt; &amp;quot;foo&amp;quot;] key-value pair&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 627:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 624:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;Finally, &amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;sort&lt;/strong&gt;()&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;sorts&amp;#160;&lt;/strong&gt;the query parameter list by parameter name in ascending lexicographical order, comparing byte values. The comparison is case-sensitive and locale-independent&lt;strong class=&quot;diff-mark&quot;&gt;:&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;Finally, &amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;Uri\QueryParams::sortByBytes&lt;/strong&gt;()&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;and &amp;#039;&amp;#039;Uri\QueryParams:: sortByUtf16()&amp;#039;&amp;#039; sort&amp;#160;&lt;/strong&gt;the query parameter list by parameter name in ascending lexicographical order, comparing byte values. The comparison is case-sensitive and locale-independent&lt;strong class=&quot;diff-mark&quot;&gt;.&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;foo=bar&amp;amp;baz=qux&amp;amp;baz=quux&amp;quot;);&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;foo=bar&amp;amp;baz=qux&amp;amp;baz=quux&amp;quot;);&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;$params = $params-&amp;gt;&lt;strong class=&quot;diff-mark&quot;&gt;sort&lt;/strong&gt;();&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$params = $params-&amp;gt;&lt;strong class=&quot;diff-mark&quot;&gt;sortByBytes&lt;/strong&gt;();&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;echo $params-&amp;gt;toRfc3986String();&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;// baz=qux&amp;amp;baz=quux&amp;amp;foo=bar&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;echo $params-&amp;gt;toRfc3986String();&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;// baz=qux&amp;amp;baz=quux&amp;amp;foo=bar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;/code&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;Parameters with&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;same name&amp;#160;&lt;/strong&gt;(&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;baz&lt;/strong&gt;&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;in the above example&lt;/strong&gt;)&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;keep their original order rather than being ordered&amp;#160;&lt;/strong&gt;by&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;value&lt;/strong&gt;.&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;This is necessary because parameters with the same name usually refer to lists,&amp;#160;&lt;/strong&gt;and&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;modifying the order of list items would definitely change the original meaning&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;The difference between&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;two implementations is the &amp;#039;Uri\QueryParams::sortByBytes&lt;/strong&gt;(&lt;strong class=&quot;diff-mark&quot;&gt;)&lt;/strong&gt;&amp;#039;&amp;#039;&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;compares bytes to bytes, while&amp;#160;&lt;/strong&gt;&amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;Uri\QueryParams:: sortByUtf16(&lt;/strong&gt;)&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;&amp;#039; uses UTF-16-based comparison, as specified&amp;#160;&lt;/strong&gt;by&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;WHATWG URL&lt;/strong&gt;.&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;UTF-8&amp;#160;&lt;/strong&gt;and&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;UTF-16 comparison does not always match, as called out by WHATWG (https://infra&lt;/strong&gt;.&lt;strong class=&quot;diff-mark&quot;&gt;spec.whatwg.org/#example-code-unit-less-than):&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;This differs from WHATWG URL&amp;#039;s &amp;#039;&amp;#039;URLSearchParams::sort&lt;/strong&gt;()&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;&amp;#039;&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;which compares UTF-16&amp;#160;&lt;/strong&gt;code units.&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;Consequently&lt;/strong&gt;, the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;two methods can produce different orders for non-ASCII names&lt;/strong&gt;.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;lt;blockquote&amp;gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;For example, the code point U+FF5E FULLWIDTH TILDE&amp;#160;&lt;/strong&gt;(&lt;strong class=&quot;diff-mark&quot;&gt;～) is obviously less than the code point U+1F600 (😀&lt;/strong&gt;),&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;but the tilde is composed of a single code unit 0xFF5E, while the smiley is composed of two&amp;#160;&lt;/strong&gt;code units&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;0xD83D and 0XDE00, so the smiley is code unit less than the tilde&lt;/strong&gt;.&lt;strong class=&quot;diff-mark&quot;&gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;lt;/blockquote&amp;gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;&lt;strong class=&quot;diff-mark&quot;&gt;Parameters with the same name (&amp;#039;&amp;#039;baz&amp;#039;&amp;#039; in the above example) keep their original order rather than being ordered by value. This is necessary because parameters with the same name usually refer to lists&lt;/strong&gt;,&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;and modifying&amp;#160;&lt;/strong&gt;the&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;order of list items would definitely change the original meaning&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;The main purpose of&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;&amp;#039;&amp;#039;&lt;/strong&gt;sort&lt;strong class=&quot;diff-mark&quot;&gt;()&amp;#039;&amp;#039;&amp;#160;&lt;/strong&gt;is to provide a consistent order of the key-value pairs (e.g. to increase cache hits), therefore more advanced features such as sorting in descending order, or user-provided comparison methods are not proposed.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;The main purpose of&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;the&amp;#160;&lt;/strong&gt;sort&amp;#160;&lt;strong class=&quot;diff-mark&quot;&gt;methods&amp;#160;&lt;/strong&gt;is to provide a consistent order of the key-value pairs (e.g. to increase cache hits), therefore more advanced features such as sorting in descending order, or user-provided comparison methods are not proposed.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;=== Supported types ===&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;=== Supported types ===&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 878:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 879:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&amp;lt;code php&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&amp;quot;a[b][c]=1&amp;quot;&lt;strong class=&quot;diff-mark&quot;&gt;);&lt;/strong&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;$params = Uri\QueryParams::parseRfc3986(&lt;strong class=&quot;diff-mark&quot;&gt;&amp;quot;a%5Bb%5D%5Bc%5D=1&amp;quot;); // Percent-encoded form of&amp;#160;&lt;/strong&gt;&amp;quot;a[b][c]=1&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$array = $params-&amp;gt;toArray(maxNestingLevel: 2);&amp;#160; &amp;#160; &amp;#160; &amp;#160; // [&amp;quot;a&amp;quot; =&amp;gt; [&amp;quot;b&amp;quot; =&amp;gt; [&amp;quot;c&amp;quot; =&amp;gt; &amp;quot;1&amp;quot;]]]&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;$array = $params-&amp;gt;toArray(maxNestingLevel: 2);&amp;#160; &amp;#160; &amp;#160; &amp;#160; // [&amp;quot;a&amp;quot; =&amp;gt; [&amp;quot;b&amp;quot; =&amp;gt; [&amp;quot;c&amp;quot; =&amp;gt; &amp;quot;1&amp;quot;]]]&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 901:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 902:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; class is &amp;#039;&amp;#039;final&amp;#039;&amp;#039; [[https://wiki.php.net/rfc/url_parsing_api#why_should_the_uri_rfc3986_uri_and_the_uri_whatwg_url_classes_be_final|for the same reason]] as all the other URI classes are final: mainly, in order to make followup changes possible without breaking backward compatibility.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; class is &amp;#039;&amp;#039;final&amp;#039;&amp;#039; [[https://wiki.php.net/rfc/url_parsing_api#why_should_the_uri_rfc3986_uri_and_the_uri_whatwg_url_classes_be_final|for the same reason]] as all the other URI classes are final: mainly, in order to make followup changes possible without breaking backward compatibility.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;Additionally, &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; is a &amp;#039;&amp;#039;readonly&amp;#039;&amp;#039; class, meaning that instances are immutable value objects: modification methods such as &amp;#039;&amp;#039;append()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;set()&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;delete()&amp;#039;&amp;#039; return a new &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; instance rather than mutating the existing one. This design is consistent with the immutable value-object semantics of &amp;#039;&amp;#039;Uri\Rfc3986\Uri&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Uri\WhatWg\Url&amp;#039;&amp;#039;, prevents different layers of an application from accidentally observing each other&amp;#039;s modifications when sharing a reference to the same instance, and makes modification explicit at the call site. Modification methods whose name doesn&amp;#039;t start with a &amp;quot;with&amp;quot; prefix are marked with &amp;#039;&amp;#039;#[\NoDiscard]&amp;#039;&amp;#039; to warn end users not to forget to use the result. These methods (&amp;#039;&amp;#039;append()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;set()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;delete()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;deleteValue()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;sort&lt;/strong&gt;()&amp;#039;&amp;#039;) are &amp;quot;withers&amp;quot; in fact, but using the usual prefix would have made the method names sound clunky (e.g. &amp;#039;&amp;#039;withAppend()&amp;#039;&amp;#039; or &amp;#039;&amp;#039;withAppendedParam()&amp;#039;&amp;#039;).&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;+&lt;/td&gt;&lt;td class=&quot;diff-addedline&quot;&gt;Additionally, &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; is a &amp;#039;&amp;#039;readonly&amp;#039;&amp;#039; class, meaning that instances are immutable value objects: modification methods such as &amp;#039;&amp;#039;append()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;set()&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;delete()&amp;#039;&amp;#039; return a new &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; instance rather than mutating the existing one. This design is consistent with the immutable value-object semantics of &amp;#039;&amp;#039;Uri\Rfc3986\Uri&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Uri\WhatWg\Url&amp;#039;&amp;#039;, prevents different layers of an application from accidentally observing each other&amp;#039;s modifications when sharing a reference to the same instance, and makes modification explicit at the call site. Modification methods whose name doesn&amp;#039;t start with a &amp;quot;with&amp;quot; prefix are marked with &amp;#039;&amp;#039;#[\NoDiscard]&amp;#039;&amp;#039; to warn end users not to forget to use the result. These methods (&amp;#039;&amp;#039;append()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;set()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;delete()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;deleteValue()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;strong class=&quot;diff-mark&quot;&gt;sortByBytes()&amp;#039;&amp;#039;, &amp;#039;&amp;#039;sortByUtf16&lt;/strong&gt;()&amp;#039;&amp;#039;) are &amp;quot;withers&amp;quot; in fact, but using the usual prefix would have made the method names sound clunky (e.g. &amp;#039;&amp;#039;withAppend()&amp;#039;&amp;#039; or &amp;#039;&amp;#039;withAppendedParam()&amp;#039;&amp;#039;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; class implements the &amp;#039;&amp;#039;IteratorAggregate&amp;#039;&amp;#039; and the &amp;#039;&amp;#039;Countable&amp;#039;&amp;#039; interfaces. Implementing &amp;#039;&amp;#039;IteratorAggregate&amp;#039;&amp;#039; seems straightforward at the first sight (query parameter names could be returned as iterator keys, while query parameter values could be returned as iterator values), unfortunately, it&amp;#039;s more tricky than that due to query components that share the same name, e.g.: &amp;#039;&amp;#039;param=foo&amp;amp;param=bar&amp;amp;param=baz&amp;#039;&amp;#039;. In this case, the same key (&amp;#039;&amp;#039;param&amp;#039;&amp;#039;) would be repeated 3 times - which would actually be very unwieldy behavior.&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;The &amp;#039;&amp;#039;QueryParams&amp;#039;&amp;#039; class implements the &amp;#039;&amp;#039;IteratorAggregate&amp;#039;&amp;#039; and the &amp;#039;&amp;#039;Countable&amp;#039;&amp;#039; interfaces. Implementing &amp;#039;&amp;#039;IteratorAggregate&amp;#039;&amp;#039; seems straightforward at the first sight (query parameter names could be returned as iterator keys, while query parameter values could be returned as iterator values), unfortunately, it&amp;#039;s more tricky than that due to query components that share the same name, e.g.: &amp;#039;&amp;#039;param=foo&amp;amp;param=bar&amp;amp;param=baz&amp;#039;&amp;#039;. In this case, the same key (&amp;#039;&amp;#039;param&amp;#039;&amp;#039;) would be repeated 3 times - which would actually be very unwieldy behavior.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/rfc/context-managers-v2?rev=1792865755&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-10-24T18:15:55+00:00</dc:date>
        <dc:creator>lbarnaud (lbarnaud@undisclosed.example.com)</dc:creator>
        <title>context-managers-v2</title>
        <link>https://wiki.php.net/rfc/context-managers-v2?rev=1792865755&amp;do=diff</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;2026/10/24 19:43&lt;/th&gt;&lt;th colspan=&quot;2&quot; width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 567:&lt;/td&gt;
&lt;td class=&quot;diff-blockheader&quot; colspan=&quot;2&quot;&gt;Line 567:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Voting Choices =====&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;===== Voting Choices =====&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;Pick a title that reflects the concrete choice people will vote on.&amp;#160;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;Please consult [[https://github.com/php/policies/blob/main/feature-proposals.rst#voting-phase|the php/policies repository]] for the current voting guidelines.&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;-&lt;/td&gt;&lt;td class=&quot;diff-deletedline&quot;&gt;----&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;Primary Vote requiring a 2/3 majority to accept the RFC:&lt;/td&gt;&lt;td class=&quot;diff-lineheader&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&quot;diff-context&quot;&gt;Primary Vote requiring a 2/3 majority to accept the RFC:&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Asurface3d.png&amp;ns=rfc&amp;rev=1784468890&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-19T13:48:10+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>surface3d.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Asurface3d.png&amp;ns=rfc&amp;rev=1784468890&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Ascaled_on_load_rotate.png&amp;ns=rfc&amp;rev=1784270844&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-17T06:47:24+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>scaled_on_load_rotate.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Ascaled_on_load_rotate.png&amp;ns=rfc&amp;rev=1784270844&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Awatermarked.png&amp;ns=rfc&amp;rev=1784260645&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-17T03:57:25+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>watermarked.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Awatermarked.png&amp;ns=rfc&amp;rev=1784260645&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Ascale_entropy_visual_check.png&amp;ns=rfc&amp;rev=1783998723&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-14T03:12:03+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>scale_entropy_visual_check.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Ascale_entropy_visual_check.png&amp;ns=rfc&amp;rev=1783998723&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Atextcurve.png&amp;ns=rfc&amp;rev=1783692533&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-10T14:08:53+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>textcurve.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Atextcurve.png&amp;ns=rfc&amp;rev=1783692533&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;1783692513&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Agradient_art.png&amp;ns=rfc&amp;rev=1783319544&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-06T06:32:24+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>gradient_art.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Agradient_art.png&amp;ns=rfc&amp;rev=1783319544&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Atiger.png&amp;ns=rfc&amp;rev=1783319523&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-06T06:32:03+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>tiger.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Atiger.png&amp;ns=rfc&amp;rev=1783319523&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Agradient_operators.png&amp;ns=rfc&amp;rev=1783319496&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2026-07-06T06:31:36+00:00</dc:date>
        <dc:creator>pajoye (pajoye@undisclosed.example.com)</dc:creator>
        <title>gradient_operators.png - created</title>
        <link>https://wiki.php.net/?image=rfc%3Agradient_operators.png&amp;ns=rfc&amp;rev=1783319496&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Atrue_async%3Acoroutine-lifecycle.svg&amp;ns=rfc%3Atrue_async&amp;rev=1744788286&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2025-04-16T07:24:46+00:00</dc:date>
        <dc:creator>edmond (edmond@undisclosed.example.com)</dc:creator>
        <title>coroutine-lifecycle.svg - created</title>
        <link>https://wiki.php.net/?image=rfc%3Atrue_async%3Acoroutine-lifecycle.svg&amp;ns=rfc%3Atrue_async&amp;rev=1744788286&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
    <item rdf:about="https://wiki.php.net/?image=rfc%3Atrue_async%3Asupervisor.svg&amp;ns=rfc%3Atrue_async&amp;rev=1742114339&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2025-03-16T08:38:59+00:00</dc:date>
        <dc:creator>edmond (edmond@undisclosed.example.com)</dc:creator>
        <title>supervisor.svg - created</title>
        <link>https://wiki.php.net/?image=rfc%3Atrue_async%3Asupervisor.svg&amp;ns=rfc%3Atrue_async&amp;rev=1742114339&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;table&gt;&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;&lt;/th&gt;&lt;th width=&quot;50%&quot;&gt;current&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
    </item>
</rdf:RDF>
