2012-02-25 24 views
11

Bunun için bir şey bulamıyorum ve bir işlev veya işlev başvurusunu bir dizi öğesi için bir değer olarak saklamanın mümkün olup olmadığını merak ediyordum. ÖrneğinDizi değeri olarak işlev

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

Teşekkürler!

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

yout manual yılında daha fazla örnek kontrol edebilirsiniz: Eğer böyle bir şey yapmak, böylece

+0

Olası bir kopyası [Bir PHP dizisinde bir işlev depolayabilir misiniz?] (Http://stackoverflow.com/questions/1499862/can-you-store-a-function-in-a-php-array) – nawfal

+0

'x()', bir işleve veya bir işleve bir başvuru değil, bir işlev çağrısıdır; Yani, işlev şu anda yürütülür ve döndürdüğü değer, 'someFunc' anahtarında dizinizde saklanır. Daha fazla bilgi için (sorularınızın cevabı dahil) [işlevler] (http://php.net/manual/en/language.functions.php) hakkındaki PHP belgelerini okuyun. – axiac

cevap

13

yapabilirsiniz "referans" herhangi bir işlev bunu olabilir. Bir işlev referansı "bellekte adres" veya bir şey anlamında bir referans değildir. Bu sadece işlevin adı.

<?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

Tamam, teşekkürler! Sonuç olarak, sanırım bir işaretçi yaratmak için bir araç arıyorum. Bir işlevi çoğaltmak istemiyorum, ancak işaretçinin başvurduğu değeri değiştirebilmem ve okuyabileceğim bir işaretçi istiyorum. – user784446

+0

Lanet, call_user_func'in PHP'nin fonksiyon-metod kütüphanesinin gerçek bir üyesi olduğunu fark etti! Teşekkürler! – user784446

+0

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_FUNCTION 7 satırda –

5

PHP değişken işlevler kavramını desteklemektedir. PHP'nin call_user_func numaralı telefonuna göz atın.

+1

Teşekkürler, bunu bir çözüm olarak yapmayı düşünüyordum. Ancak, dokümanlar ayrıca bir öğenin değerinin herhangi bir türde olabileceğini de belirtir, bu nedenle neden işlevler kullanılamaz? "Element" => object() işlevini kullanabilirim ama bununla ne yapılabileceğini bilmiyorum. – user784446

5

. Aşağıdaki örneği düşünün. Eğer bir döngü ile bunu yapabilir bir dizideki tüm fonksiyonlarını yürütmek istiyorsanız

iki işlevi artık

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

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


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

düşünün.

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

artı dizisi, herhangi bir veri türü tutun işlev çağrısı, iç içe diziler, nesne, dize, tamsayı vb vb

+0

Sadece bu yöntemlerin aşırı karmaşık hale gelmesini istemediğinizde, uzun bir anahtar deyimini değiştirmenin güzel bir yol olduğunu eklemek istiyorum. –

4

Evet, yapabilirsiniz:

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

Bu, elbette, PHP PHP sürümü 5.3.0 ile geldi anonymous function desteği, gerektirir. Bu sizi oldukça okunamaz bir kodla bırakacaktır.

+0

Bu benim için işe yaramıyor, UNEXPECTED T_FUNCTION hatası döndürüyor. – user784446

+0

Hangi PHP sürümünü kullanıyorsunuz? PHP 5.3.6 çalıştıran benim laptop üzerinde çalışıyor. Eğer 5.2 kullanıyorsanız, bu kesinlikle yukarıdaki cevabımda belirtildiği gibi çalışmayacaktır. – Treffynnon

+0

Ah, tamam. Muhtemelen bu yüzden. Ben PHPDesigner2008 kullanıyorum, bu yüzden hata bildirim kütüphanesi muhtemelen modası geçmiş. – user784446

İlgili konular