PHP 8.4.1 Released!

新機能

object 型

object 型が新たに導入されました。 任意のオブジェクトに対する (反変) パラメータの型付けや (共変) 戻り値の型付けで使えます。

<?php

function test(object $obj) : object
{
return new
SplQueue();
}

test(new stdClass());

名前指定による拡張モジュールのロード

読み込む共有モジュールを指定する際に、拡張子 (Unix なら .so、Windows なら .dll など) を指定する必要がなくなりました。php.ini ファイルでの指定だけでなく dl() 関数による指定でも同様です。

抽象メソッドのオーバーライド

ある抽象クラスが別の抽象クラスを継承しているときに、 継承元クラスの抽象メソッドをオーバーライドできるようになりました。

<?php

abstract class A
{
abstract function
test(string $s);
}
abstract class
B extends A
{
// オーバーライドしましたが、パラメータの反変性や戻り値の共変性は維持しています。
abstract function test($s) : int;
}

Sodium がコアモジュールに

モダンな暗号ライブラリである Sodium が PHP コアモジュールに含まれるようになりました。

関数のリファレンスは Sodium を参照ください。

Argon2 によるパスワードハッシュ

パスワードハッシュ API に Argon2 が追加されました。次の定数が公開されています。

PDO の拡張文字列型

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

これらの定数を使うには、 PDO::PARAM_STR とビット OR で連結します。

<?php

$db
->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

PDO のデバッグ情報にプリペアのエミュレートの内容を追加

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

LDAP における拡張オペレーションのサポート

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

ソケット 拡張モジュールでのアドレス情報の対応

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

パラメータの型の拡大変換

メソッドをオーバーライドしたりインターフェイスを実装したりする際に、 元のパラメータの型指定を省略できるようになりました。 それでもリスコフの置換原則には違反していません。 パラメータの型は反変だからです。

<?php

interface A
{
public function
Test(array $input);
}

class
B implements A
{
public function
Test($input){} // $input の型指定を省略
}

名前空間のグループ指定における最後のカンマの許可

PHP 7.0 で導入されたグループ指定構文で、最後にカンマを付けられるようになりました。

<?php

use Foo\Bar\{
Foo,
Bar,
Baz,
};

Windows での proc_nice() のサポート

proc_nice() 関数が Windows でも使えるようになりました。

pack()unpack() でのエンディアンのサポート

pack()unpack() が、 リトルエンディアンとビッグエンディアンの両方の float や double に対応するようになりました。

EXIF 拡張モジュールの機能追加

EXIF 拡張モジュールがより多くのフォーマットに対応するようになりました。 exif_read_data() 関数で画像をパースするときに、 今までよりも多くの独自タグが適切に変換されるようになります。 新たにサポートするようになったフォーマットは以下のとおりです。

  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

また、exif_read_data()exif_thumbnail() の第一引数にストリームを渡せるようになりました。

PCRE の新機能

  • J 修飾子で PCRE_DUPNAMES を設定できるようになりました。

SQLite3 での BLOB の書き込み

SQLite3::openBlob() が、BLOB フィールドを書き込みモードでオープンできるようになりました。 これまでは読み込みモードにしか対応していませんでした。

Oracle OCI8 Transparent Application Failover コールバック

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

ZIP 拡張モジュールの機能追加

暗号化されたアーカイブの読み書きができるようになりました (libzip 1.2.0 以降が必要です)。

ZipArchive クラスが Countable インターフェイスを実装するようになりました。

zip:// ストリームのコンテキストオプションに 'password' を使えるようになりました。

add a note

User Contributed Notes 2 notes

up
3
antonfedonyuk at gmail dot com
3 years ago
Note: "omitted" = "removed":
<?php
declare(strict_types=1);

interface
ITest
{
public function
run(array $input);
}

class
Test implements ITest
{
public function
run($input) {
return
$input;
}
}

echo (new
Test())->run('foo'); // display foo, no error
?>
up
-3
info at ensostudio dot ru
4 years ago
Note: you cant change parameter type for abstract method defined in interface.
<?php
abstract class AbstractAssocArray imlements ArrayAccess
{
abstract public function
offsetSet($offset, $value): void;
...
}
abstract class
AbstractAssocArray2 extends AbstractAssocArray
{
abstract public function
offsetSet(string $offset, $value): void;
}
class
AssocArray extends AbstractAssocArray2
{
public function
offsetSet(string $offset, $value): void
{
$this->{$offset} = $value;
}
}
?>
It's throw fatal error: Declaration of AbstractAssocArray::offsetSet(string $offset, $value): void must be compatible with AbstractAssocArrayAccess::offsetSet($offset, $value).
To Top