PHPリフレクション機能

書かれたものはすべて、イデオロギーに忠実であると主張せず、コントローラーの実例ではなく、1分の1を無意識にコピーすることは推奨されません。



Symfony2で覗いた関数の引数に、URLに直接渡される必要なパラメーターを書くというアイデア。 ルートを識別するためにPHPdocコメントが使用されました。



たとえば、次のようなコントローラーを確認します。

class Controller { /** *   * @a /^[0-9]+$/i * @b /^[0-9a-z]+$/i */ function testAction ( $a, $b = 'something' ) { echo 'a: '.$a.', b: '.$b; } }
      
      









警告にもかかわらず、1 in 1の例を使用する場合は、注意してください。

-Reflection APIが遅い

-難読化の不可能性

-アーキテクチャの非自明性とイデオロギーの歪み

-チームまたはサードパーティの開発者によるサポート/開発で起こりうる問題。





したがって、タスク:変数「a」が渡されない場合、または「余分な」変数が渡される場合、エラーが生成されます。変数「b」が指定されない場合、デフォルト値が置き換えられます。 両方の変数は、PHPDocで規定されている正規表現に対してチェックされます。



その結果、検証機能は次のようになりました。

 function CheckURLValid ( $class, $method, $values_arr = array() ) { $class = new ReflectionClass( $class ); $method = $class->getMethod( $method ); $param = $method->getParameters(); $doc = $method->getDocComment(); // PHPdoc preg_match_all( '/@([a-z0-9_-]+)([^\n]+)/is', $doc, $arr ); $reg_arr = array_combine($arr[1], $arr[2]); //    $params_arr = array(); foreach ( $param as $p ) { $key = $p->getName(); $value = isset ( $values_arr[$key] ) ? $values_arr[$key] : false; $regular = isset ( $reg_arr[$key] ) ? trim($reg_arr[$key]) : false; $default = $p->isDefaultValueAvailable() ? $p->getDefaultValue() : NULL; //   -  if ( isset ( $values_arr[$key] ) ) { if ( $regular && !preg_match( $regular, $values_arr[$key] ) ) throw new Exception( ' "'.$key.'"  !' ); //       } elseif ( !$p->isOptional() ) throw new Exception( '    !' ); //     $params_arr[$key] = $value ? $value : $default; } //    if ( count(array_diff_key( $values_arr, $params_arr )) ) throw new Exception ( '  !' ); return $params_arr; }
      
      







使用例:

 try { $arr = CheckURLValid( 'Controller', 'testAction', $_GET ); call_user_func_array( array('Controller', 'testAction'), $arr ); } catch ( Exception $e ) { echo $e->getMessage(); }
      
      





タイプのさまざまなバリエーションを駆動できます。

/test.php

/test.php?a=abc

/test.php?a=12

/test.php?a=12&b=another

/test.php?a=12&c=13



1つのファイル選択できます



All Articles