1

(良いチャレンジがあれば、この質問に投票してください。)

親愛なるstackoverflowの仲間。フック/拡張機能の優れた方法を提供したいと考えています。

クラスまたは関数の外部で変数参照にアクセスする際に問題があります。

問題点:

  1. ローカル変数をグローバル変数に変えたくありません。それらがローカルである場合は、ローカルのままにする必要があります。
  2. フック開発者がアクセスしたい変数がわからないため、選択した変数参照をフックに渡すことができません。
  3. フックは、それ自体の外側にネストされたグローバルにしかアクセスできないため、親のローカル スコープでフックを呼び出す価値はありません。

静的ダミーフックの例 (ダイナミクスなし):

<?php
  class hook {
    function before_process() {
      global $couldbeanything;
      $couldbeanything = 'hello dummy';
    }
  }
?>

グローバル スコープで動作します。

<?php
  $couldbeanything = 'hello world';
  $hook = new hook;      
  $hook->before_process();
  echo $couldbeanything;
?>

関数内では機能しません (ローカル スコープ):

<?php
  function foobar() {
    $couldbeanything = 'hello world';
    $hook = new hook;      
    $hook->before_process();
    echo $couldbeanything;
  }
  foobar();
?>

フック内で実際に次のようなものが必要です(そのようなものがあった場合):

parent $couldbeanything;

また

outer $couldbeanything;

私が思いつく唯一の解決策は、PunBB が使用する eval(php_code_from_an_xml_doc) と同じものです。デメリットもあります。アクセスしたい外部参照を指定しないと、誤って変数を同じ名前で上書きしてしまう可能性があります。また、評価される XML 形式の PHP コードは、デバッグするのが面倒です。

ここで eval() よりも優れたソリューションを持っている最も賢い人は誰ですか。

おそらく、これらはアイデアのためのツールです: get_defined_vars、extract、pass-by-reference、call_user_func

4

2 に答える 2

0

ここで誰がこれよりも優れた解決策を思いつくことができますか? 参照は使用しませんが、変数の複製を使用します。しかし、それは十分に近く、ネストされた変数スコープ内のフックに eval() を使用する必要がなくなります。

<?php
  class hook {
    function before_process($args) {
      extract($args);

      $couldbeanything = 'good bye world';

      return compact('couldbeanything');
    }
  }

  function foobar() {
    $couldbeanything = 'hello world';

    $hook = new hook;
    extract($hook->before_process(get_defined_vars()), EXTR_OVERWRITE);

    echo $couldbeanything;
  }
  foobar();
?>

フック クラスと、foobar() 内でフックを実行する方法を参照してください。

于 2013-07-14T00:14:11.703 に答える