PHP 7.4.x で推奨されなくなる機能

PHPコア

明示的に括弧で囲わずに三項演算子をネストする

三項演算子をネストする場合、演算の順番を示すために明示的に括弧で囲わなければならなくなりました。以前は、括弧を使わなかった場合、左結合の演算がほとんどの場合期待した動作になりませんでした。

<?php
1
? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>

2番目のオペランドをネストさせる場合は、括弧は必須では ありません。 なぜなら、これについては曖昧さがなく、結合法則に影響がないからです。

1 ? 2 ? 3 : 4 : 5 // ok

波括弧を使った、配列や文字列のオフセットへのアクセス

波括弧を使って配列や文字列のオフセットにアクセスする文法は推奨されません。$var{$idx} でなはく $var[$idx] を使って下さい。

(real) によるキャストと is_real() 関数

(real) によるキャストは推奨されません。 (float) を代わりに使って下さい。

is_real() 関数も同様に推奨されません。 is_float() 関数を使って下さい。

$this が使われている場合に、$this のバインドを解除する

$this を使っている static でないクロージャの $this のバインドを解除することは推奨されません。

親クラスがない場合における parent キーワードの利用

親クラスがないクラス内で parent を使うのは推奨されませんし、将来的にはコンパイル時にエラーが発生することになるでしょう。 現状では、この推奨されないエラーは、実行時に親クラスに対してアクセスされた場合に生成されます。

php.ini における allow_url_include オプション

allow_url_include iniディレクティブは推奨されません。これを有効にすると、起動時に推奨されない警告が生成されます。

基数を変更する関数における不正な文字

base_convert(), bindec(), octdec() および hexdec() 関数に不正な文字を渡すと、推奨されない警告が生成されるようになりました。 あたかも不正な文字が存在しないかのように結果は計算されます。空白文字が前後にあったり、(基数によっては) 0x をプレフィックスとして指定することも可能です。

オブジェクトに対する array_key_exists() 関数の使用

オブジェクトに対する array_key_exists() 関数の使用は、推奨されません。代わりに、isset() または property_exists() を使って下さい。

マジッククォート関数

get_magic_quotes_gpc()get_magic_quotes_runtime() 関数は推奨されません。これらの関数は常に false を返します。

hebrevc() 関数

hebrevc() 関数は推奨されません。 nl2br(hebrev($str)) で置き換えられますが、Unicode RTL のサポートを使う方が好ましいです。

convert_cyr_string() 関数

convert_cyr_string() 関数は推奨されません。 mb_convert_string(), iconv() または UConverter のいずれかで置き換えることができます。

money_format() 関数

money_format() 関数は推奨されません。 intl の NumberFormatter 機能に置き換えられました。

ezmlm_hash() 関数

ezmlm_hash() 関数の使用は推奨されません。

restore_include_path() 関数

restore_include_path() 関数の使用は推奨されません。 ini_restore('include_path') に置き換えることができます。

Implode 関数の、歴史的なパラメータ順序

implode() 関数に逆の順番でパラメータを渡すのは推奨されなくなりました。implode($parts, $glue) ではなく、 implode($glue, $parts) を使ってください。

COM

大文字小文字を区別せず、定数を登録することで型のライブラリをインポートすることは推奨されません。

Filter

FILTER_SANITIZE_MAGIC_QUOTES は推奨されません。 FILTER_SANITIZE_ADD_SLASHES を代わりに使って下さい。

マルチバイト文字列

mb_ereg_replace() に文字列でないパターンを渡すことは推奨されません。現状は、文字列でないパターンは ASCII コードポイントと解釈されます。PHP 8 では、パターンは文字列として解釈されるようになります。

mb_strrpos() 関数に、3番目のパラメーターとしてエンコーディングを渡すのは推奨されません。代わりに 0から始まるオフセットを渡すか、4番目のパラメーターとしてエンコーディングを渡すようにします。

LDAP

ldap_control_paged_result_response()ldap_control_paged_result() 関数は推奨されません。 ページングの制御は、ldap_search() を代わりに使うことで行なえます。

Reflection

ReflectionType::__toString() を呼び出すと、推奨されない警告が生成されるようになりました。このメソッドは ReflectionNamedType::getName() を使うことが好ましいために、PHP 7.1 から推奨されていませんでしたが、技術的な理由によって、推奨されない警告をこれまで発生させてきませんでした。

Reflection クラスの全ての export() メソッドは推奨されなくなりました。次のようにして、Reflection オブジェクトを生成し、string に変換するようにして下さい:

<?php
// ReflectionClass::export(Foo::class, false) is:
echo new ReflectionClass(Foo::class), "\n";

// $str = ReflectionClass::export(Foo::class, true) is:
$str = (string) new ReflectionClass(Foo::class);
?>

Socket

glibc で推奨されなくなったため、socket_addrinfo_lookup() 関数の AI_IDN_ALLOW_UNASSIGNEDAI_IDN_USE_STD3_ASCII_RULES フラグの使用は推奨されません。

add a note add a note

User Contributed Notes 2 notes

up
11
Ahmad Asjad
4 years ago
(\?[^php]).*(\:).*(\?).*(\:[^=])
Above regex can help others to find the nested ternary operator
up
-23
Techlemur
4 years ago
^((?!\().*)(\?[^php]).*(\:)([\s\v]+)(?!\().*[^\/](\?)([\s\v\h]*).*(\:[^=])
Regex to find deprecated nested ternaries
To Top