1. ホーム
  2. php

[解決済み] phpでevalが悪になるのはどんなとき?

2023-04-24 11:11:33

質問

私がPHPで開発している間、常に eval() を使うのは悪いことだといつも聞いています。

次のコードを考えると、2番目の(そしてよりエレガントな)オプションを使うのが理にかなっていると思いませんか?もしそうでなければ、なぜですか?

// $type is the result of an SQL statement, e.g.
// SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string.

$type = "enum('a','b','c')";

// option one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// option two
eval('$result = '.preg_replace('#^enum#','array', $type).';');

どのように解決するのですか?

eval()を純粋な悪と呼ぶことには慎重でなければなりませんね。 動的な評価は強力なツールであり、時には命の恩人になることができます。eval()を使えば、PHPの欠点(下記参照)を回避することができます。

eval()の主な問題点は以下の通りです。

  • 安全でない入力の可能性がある。 信頼できないパラメータを渡すことは、失敗することになります。パラメータ(またはその一部)が完全に信頼されていることを確認するのは、しばしば些細なことではありません。
  • だまし討ち。 eval()を使うとコードが巧妙になり、従ってフォローするのが難しくなります。Brian Kernighan "の言葉を引用します。 デバッグは、そもそもコードを書くことの2倍大変です。したがって、コードをできるだけ巧妙に書くと、定義上、デバッグするのに十分な賢さがないことになります。 "。

eval()を実際に使用した場合の主な問題点は1つだけです。

  • 十分な考慮なしに使用する経験の浅い開発者。

経験則として、私はこれに従う傾向があります。

  1. eval()が唯一/正しい解決策であることがあります。
  2. ほとんどの場合、他のものを試すべきです。
  3. 確信が持てない場合は、2.に進みます。
  4. Else, 非常に、非常に注意してください。