かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP 定数を文字列展開させたい。

久々に PHP 書いてます。
なんも覚えてねぇ…

PHP は定数は文字列展開できない。

PHP " (ダブルコーテーション) な文字列なら下記のように変数を文字列展開できるかと思います。

<?php
$table = 'users';
$sql = "INSERT INTO {$table} (id, name, ...)";
// => "INSERT INTO users (id, name …)";

定数は展開されない…

<?php
define('TABLE', 'users');
$sql = "INSERT INTO {TABLE} (id, name, ...)";
// => "INSERT INTO {TABLE} (id, name …)";

そういう仕様らしい…
不便… ʕ;ᴥ;ʔ

<?php
$sql = 'INSERT INTO ' . TABLE . ' (id, name, ...)';

でも良いのですが、定数の前後にスペース忘れたりしそうだったのでなんとか文字列展開させたい…

PHP は文字列展開のブランケット内で関数を呼ぶことはできない

それなら文字列返すだけの関数作れば良いのでは?と思ったがダメだった

<?php
define('TABLE', 'users');
function S_($str) { return $str; }
$sql = "INSERT INTO {S_(TABLE)} (id, name, ...)";
// => "INSERT INTO {S_(TABLE)} (id, name, ...)"

(´◦ω◦`):

どんなスカラー変数、配列の要素あるいはオブジェクトのプロパティの文字列表現であっても この構文で含めることができます。 文字列の外側に置く場合と同様に式を書き、これを { と } の間に含めてください。'{' はエスケープすることができないため、 この構文は $ が { のすぐ後に続く場合にのみ認識されます (リテラル "{$" を指定するには、"{\$" を使用してください)。
cf. 複雑な (波括弧) 構文

変数で関数を呼び出すのはOK

$ から始まるもの、つまり変数しか認識できないっぽいので、関数を呼び出す変数を作成すればOKっぽい

<?php
define('TABLE', 'users');
$_ = function($str) { return $str; };
$sql = "INSERT INTO {$_(TABLE)} (id, name, ...)";
// => "INSERT INTO users (id, name, ...)"

₍ ᐢ. ̫ .ᐢ ₎ 👌 デキタ

ただし変数なのでスコープに注意する必要がある。

上記のように同じスコープにベタが書きすることってほぼ無いと思うのでちょっと面倒くさい。

<?php // helper.php
$_ = function($str) { return $str; };
<?php // main.php
require_once __DIR__ . '/helper.php';
function create_user($data) {
  global $_; // スコープ外なので global 変数として使えるようにする
  $sql = "INSERT INTO {$_(TABLE)} (id, name, ...)";
}

めんどい…
もっと良き方法あれば教えて下さい!


[参考]

四畳半タイムマシンブルース

四畳半タイムマシンブルース