2012-02-25 14 views
11

これは何も見つかりませんでしたし、関数や関数のリファレンスを配列要素の値として格納することが可能かどうか疑問に思っていました。例えば、配列の値としての機能

array("someFunc" => &x(), "anotherFunc" => $this->anotherFunc()) 

ありがとう!

+0

[PHP配列に関数を格納できますか?](http://stackoverflow.com/questions/1499862/can-you-store-a-function-in-a-php-array) – nawfal

+0

'x()'は関数または関数への参照ではなく、関数呼び出しです。つまり、関数が現在実行され、その値がキー 'someFunc'の配列に格納されます。詳細は(あなたの質問への答えを含む)[functions](http://php.net/manual/en/language.functions.php)に関するPHPのドキュメントを読んでください。 – axiac

答えて

13

することができます「基準」は、任意の機能をすることができます。関数参照は "メモリ内のアドレス"または何かの意味での参照ではありません。それは単なる関数の名前です。

<?php 

$functions = array(
    'regular' => 'strlen', 
    'class_function' => array('ClassName', 'functionName'), 
    'object_method' => array($object, 'methodName'), 
    'closure' => function($foo) { 
    return $foo; 
    }, 
); 

// while this works 
$functions['regular'](); 
// this doesn't 
$functions['class_function'](); 

// to make this work across the board, you'll need either 
call_user_func($functions['object_method'], $arg1, $arg2, $arg3); 
// or 
call_user_func_array($functions['object_method'], array($arg1, $arg2, $arg3)); 
+0

さて、ありがとう!最終的には、私はポインタを作成する手段を探していると思います。私は関数を複製したくないのですが、ポインタが参照する値を変更して読み込むことができるようにポインタを必要としています。 – user784446

+0

くそー、call_user_funcがPHPの関数メソッドライブラリの実際のメンバーであることが分かりました!ありがとう! – user784446

+0

構文解析エラー:構文エラー、予期しない行7のT_FUNCTION –

5

あなたはこのような何かを行うことができますので、PHPは、変数関数の概念をサポートしています。

function foo() { echo "bar"; } 
$array = array('fun' => 'foo'); 
$array['fun'](); 

Youtのはmanualでより多くの例を確認することができます。

+1

ありがとうございました。これを解決策として考えていました。しかし、ドキュメントでは、要素の値はどのような型でもよいと述べているので、なぜ関数を使用できないのでしょうか?私は "element" => object()を使うことができますが、これで何ができるのか分かりません。 – user784446

5

PHPのcall_user_funcを参照してください。以下の例を考えてみましょう。あなたがループでそれを行うことができますシーケンス内のすべての機能を実行したい場合は

は2つの機能になりました

function a($param) 
{ 
    return $param; 
} 

function b($param) 
{ 
    return $param; 
} 


$array = array('a' => 'first function param', 'b' => 'second function param'); 

を検討してください。

foreach($array as $functionName => $param) { 
    call_user_func($functioName, $param); 
} 

プラスアレイは、任意のデータ型を保持する関数呼び出し、ネストされた配列、オブジェクト、文字列、整数など等

+0

これは、あなたのメソッドが過度に複雑にならないようにするために、長いswitch文を置き換えるための素晴らしい方法だと付け加えたいだけです。 –

4

はい、次のことができます。

$array = array(
    'func' => function($var) { return $var * 2; }, 
); 
var_dump($array['func'](2)); 

これはない、もちろん、PHPのバージョン5.3.0以降で到着したPHP anonymous functionサポートを、必要としています。しかし、これは非常に読めないコードであなたを残すだろう。

+0

それは私のために動作しません、それは不明なT_FUNCTIONエラーを返します。 – user784446

+0

使用しているPHPのバージョンは? PHP 5.3.6を実行しているラップトップで正常に動作します。あなたは5.2を使用している場合、これは間違いなく上の私の答えで述べたように動作しません。 – Treffynnon

+0

ああ、大丈夫です。それはおそらく理由でしょう。私はPHPDesigner2008を使用しているので、エラー通知ライブラリはおそらく時代遅れです。 – user784446

関連する問題