2016-08-18 9 views
1

私のPHPプロジェクトでは、いくつかのケースではtry-catchブロックの下で呼び出したい場合があり、場合によってはtry-catchブロックの下には呼びたくない関数もあります。 そして、私はパラメータとしていくつかの関数を取得し、それを呼び出し、例外の場合にfalseを返す関数を書いてみたいと思います。phpが関数のパラメータとして機能する

おおよそのコードで、 'someFunction'のパラメータ数が異なっています。

function tryTo($someFunctionName) { 
    try { 
     return someFunctionName(); 
    } catch (Exception $error) { 
     return false; 
    } 

どのように整理するのですか?

+1

ドル記号がない場合を除き、このコードの問題点は何ですか? – trincot

+0

もちろん、呼び出す関数に引数を渡すことも検討する必要があります。 –

+0

はい、try-catchブロック内の関数をパラメータで呼び出す必要があります。 –

答えて

3

あなたは、彼らが変数によって表され、関数の引数として渡すことができるようClosuresとして、あなたの本来の機能を定義する必要があります。

function myFunc ($arg) { 
    echo "called myFunc with '$arg' as argument"; 
} 

// create a Closure for it 
$myFunc = function ($arg) { myFunc($arg); }; 

function tryTo($someFunctionName, $arg) { 
    try { 
     return $someFunctionName($arg); 
    } catch (Exception $error) { 
     return false; 
    } 
} 

// call tryTo passing the Closure and the argument 
echo tryTo($myFunc, "test"); 

あなたもそれ複数の引数をサポートするためのケーキの一部になり spread operatorを使用することができますPHP 5.6のよう:

は、ここでのコード例です。 1つのtryIt関数はパラメータの数が異なる機能のためにホストすることができますこの方法:

function tryTo($someFunctionName, ...$args) { 
    try { 
     return $someFunctionName(...$args); 
    } catch (Exception $error) { 
     return false; 
    } 
} 
-1
<?php 
function tryTo($someFunctionName) { 
    try { 
    return $someFunctionName(); 
} catch (Exception $error) { 
    return false; 
} 

// call tryTo function by passing function name 
tryTo(functionName); 
?> 
+0

OPはなぜ「このコードを使用する」べきですか? **良い答え**は、何が行われたのか、そしてなぜそれがそのように行われたのかについての説明をいつも持っています。この質問を見つけて回答を読んでいるかもしれないので、OPのためだけでなく将来の訪問者のために 。 – RiggsFolly

+0

パラメータで「someFunction」を呼び出す場合はどうすればよいですか? –

+0

コードのみの回答は投稿しないでください。常に説明を追加してください。 – DanFromGermany

0

PHPは、彼らが機能したかのようにあなたは多くのことを呼び出すことができます - これは含まれています:文字列として

  • 関数名を(例えば["myFunc", ["arg1", "arg2"]]ための)第二の要素として第1要素と引数の配列として機能名を含むアレイ
  • アレイ
  • (例えば"myFunc"用)containinこれらのすべてがあってもよい(例えば[new MyClass(), ["arg1", "arg2"]]ための)第二の要素として第1要素と引数の配列としてGオブジェクト
  • __invoke()マジック方法を
  • クロージャ/匿名関数

を実装するクラスのインスタンスcallableタイプのヒントで示されます。そのように、のようなあなたの関数を実装:

tryTo(callable $callable) { 
    try { 
     $callable(); 
    catch(\Exception $ex) { 
     return false; 
    } 
} 

あなたは PHPを呼び出し可能と考えて何のためにtryTo()を使用して、関数を呼び出すために使用することができます渡すどんなことを強制することが可能になります。

ので、次は動作します:

tryTo('myFunc'); // Equivalent to myFunc(); 
tryTo('MyClass::myFunc'); // Equivalent to MyClass::myFunc(); 
tryTo(['myFunc', ['myArg', 'myOtherArg']]; // Equivalent to myFunc('myArg', 'myOtherArg'); 
tryTo([new MyClass(), 'myFunc']); // Equivalent to (new MyClass())->myFunc(); 
tryTo(function() { echo 'test'; }); // executes whatever closure you pass 

をあなたはより多くの情報のためhereを見ることができます。私は真剣にそのような関数のユースケースに疑問を呈しています - 何かが間違っていなければ例外は起こりません。そして、そのような関数を使って静かな失敗を開きます。少なくとも、発生した例外をログに記録して、何かが間違っていることを確認する必要がありますが、私の意見では、どこにあっても適切な例外を処理する必要があります。しかし、これはまったく異なる議論であり、あなたの質問に答えられるものは何もありません。

+0

私の場合、私は例外を投げて、後にそれらを処理しています。 –

関連する問題