PHP 7の統一変数構文(Uniform Variable Syntax)を徹底解説!基本から実例まで
PHP 7の統一変数構文(Uniform Variable Syntax)とは?
PHP 5以前の古いバージョンでは、変数の評価方法に一貫性がなく、混乱を招くケースがありました。代表例が ${$first['name']} のような記述です。この構文は直感的に理解しづらく、「一貫性のない構文」とされてきました。
こうした問題を解消するために、PHP 7では統一変数構文(Uniform Variable Syntax)と呼ばれる新しい構文が導入されました。
統一変数構文では、変数は左から右へと評価されます。この構文を使う際には、式を波括弧(中括弧)で囲む必要があります。以下がその例です。
echo ${$first['name']};
統一変数構文によって演算子の新しい組み合わせが可能になった一方で、古い評価順序に依存していた一部の式では後方互換性が損なわれる場合がある点には注意が必要です。
基本的な使用例
<?php
$x = (function() {
return 20 - 10;
})
();
echo "$x\n";
?>
出力結果
10
補足: 上記のプログラムでは、定義された関数式がその場で即座に呼び出されます(即時実行)。括弧で囲んだ関数式に続けて () を付けるだけで、無名関数を直接実行できるのがポイントです。
既存構文の新しい組み合わせ
統一変数構文は、これまでの構文要素を新しい形で組み合わせることを可能にしました。たとえば、配列要素を callable として直接呼び出すこともできます。
$foo['bar']();
また、関数が返した文字列内の特定の文字をデリファレンス(参照解除)したり、配列の要素からオブジェクトのプロパティへ直接アクセスしたりすることも可能です。
[$obj, $obj1][0]->pro;
さらに、PHP 7ではネストしたスコープ定義演算子(ダブルコロン ::)もサポートされています。
$foo['bar']::$baz;
ネストしたメソッド・関数呼び出し
メソッドや関数の戻り値に対して、さらに別の呼び出しを連鎖させる記述ができます。これは任意の callable(呼び出し可能なもの)にも適用でき、括弧を重ねることで実現します。
foo()(); // 関数callableの戻り値を呼び出す
$foo->bar()(); // インスタンスメソッドの戻り値を呼び出す
Foo::bar()(); // 静的メソッドの戻り値を呼び出す
$foo()(); // 変数が持つcallableの戻り値を呼び出す
任意の式のデリファレンス(参照解除)
PHP 7では、括弧で囲まれた有効な式であれば、どのような式でもデリファレンスできるようになりました。
(exp)['foo']; // 配列キーへのアクセス
(exp)->foo; // プロパティへのアクセス
(exp)->foo(); // メソッドの呼び出しなど
実際の動作を確認するサンプルコード
ここでは、関数の戻り値を連鎖的に呼び出す例を見てみましょう。
<?php
function emp() {
echo "This is emp() \n";
};
function dept() {
echo "This is dept() \n";
return 'emp';
};
function sub() {
echo "This is sub()\n";
return 'dept';
};
sub();
echo "----------------\n";
sub()();
echo "----------------\n";
sub()()();
?>
出力結果
This is sub()
-------------
This is sub()
This is dept()
-------------
This is sub()
This is dept()
This is emp()
この出力から分かるように、sub() を単独で呼び出した場合は最初の関数のみが実行されます。しかし sub()() とすると戻り値の関数が続けて実行され、sub()()() では3つの関数が連鎖的に呼び出されます。これこそが、統一変数構文による柔軟で一貫した評価の実例です。
まとめ
PHP 7の統一変数構文は、従来の不規則で分かりにくかった変数評価のルールを整理し、左から右への一貫した評価を実現しました。ネストした関数呼び出しや任意の式のデリファレンスなど、より表現力豊かなコードが書ける一方、古いコードとの互換性に影響する場面もあるため、PHP 7へ移行する際には既存コードの見直しをおすすめします。
-
PHP変数「11:00 AM」をMySQLの時間形式に変換する方法
PHPの「11:00 AM」をMySQLの時間形式に変換する方法 MySQLのTIME型やDATETIME型は、時刻を24時間表記の「HH:MM:SS」形式で管理します。そのため、「11:00 AM」のようにAM/PMを含む文字列をデータベースに保存する場合は、事前に形式を変換しておく必要があります。本記事では、PHP標準のDateTimeクラスを使った変換方法を、サンプルコードと実行結果付きで解説します。 変換の基本の流れ DateTime::createFromFormat() … 入力文字列をDateTimeオブジェクトとして解析する format() … 解析結果を「H:i:s」(2
-
PHPのextract()関数とは?使い方とパラメータを徹底解説
extract()関数とはPHPのextract()関数は、配列のキーと値を現在のシンボルテーブルに変数としてインポートする関数です。連想配列の各要素が「キー名=変数名、値=変数の値」として展開され、戻り値としては正常に抽出された変数の個数が返されます。構文extract(arr, rules, prefix)パラメータarr − 変数として展開したい対象の配列を指定します。rules − 無効な変数名や既存変数との衝突(コンフリクト)が発生した場合の扱い方を指定します。指定できる値は以下の通りです。EXTR_OVERWRITE − デフォルト値。同名の変数が既に存在する場合、既存の変数を上書