PHPで関数の引数を名前で渡す

コードをリファクタリングするとき、メソッドの呼び出しについて小さなアイデアが1つありました。 関数に名前で引数を渡す必要がある場合があります。 たとえば、リストを目的の順序で転送することが不可能な(または不便な)場合。 このような場合は、テンプレートエンジンからの動的ブロックの呼び出しになります。テンプレートには{{mymodule action = foo second = 124322fourth = 'catalog' first = 'name' third = 'foo'}}があり、コードには次の関数があります。 ($最初、$ 2番目、$ 3番目、$ 4番目) 。 同様のアプローチがMagentoシステムで使用され、レイアウトからブロックを呼び出します。 または、何らかの連想配列のフィルターに基づいてメソッドにデータを渡す必要があります。 PHP4で可能な解決策は、引数リスト全体を配列に入れることでした。 PHPバージョン5にはReflection APIがあり、これを使用してこれを行うことができます。 Perl、Python(、...)ができるのに、なぜPHPでは不可能なのでしょうか?:)

UPD :pastebinコードが詰まっています。これがこのヘルパーメソッドです( $ object-> __ named( 'methodNameHere'、array( 'arg3' => 'three'、 'arg1' => 'one'))の形式の呼び出し)
/**
* Pass method arguments by name
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __named($method, array $args = array())
{
$reflection = new ReflectionMethod($ this , $method);

$pass = array();
foreach ($reflection->getParameters() as $param)
{
/* @var $param ReflectionParameter */
if (isset($args[$param->getName()]))
{
$pass[] = $args[$param->getName()];
}
else
{
$pass[] = $param->getDefaultValue();
}
}

return $reflection->invokeArgs($ this , $pass);
}


* This source code was highlighted with Source Code Highlighter .


Source: https://habr.com/ru/post/J95335/


All Articles