php is_function () bir değişkenin bir işlev olup olmadığını belirlemek için


89

Php'de , create_function ile yapabileceğinizden daha kolay işleyen bir değişkeni tanımlamanıza izin veren anonim işlevler hakkında okumaktan oldukça heyecanlandım . Şimdi bir değişken geçiren bir fonksiyonum olup olmadığını merak ediyorum, bunun bir fonksiyon olup olmadığını belirlemek için onu nasıl kontrol edebilirim? Henüz bir is_function () işlevi yok ve bir işlev olan bir değişkenin var_dump'ını yaptığımda:

$func = function(){
    echo 'asdf';
};
var_dump($func);

Bunu anlıyorum:

object(Closure)#8 (0) { } 

Bunun bir işlev olup olmadığını nasıl kontrol edeceğiniz konusunda herhangi bir fikriniz var mı?

Yanıtlar:


142

is_callableBelirli bir değişkenin bir işlev olup olmadığını belirlemek için kullanın . Örneğin:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
is_callable (), anonim bir işlev, dizge olarak bir işlev adı veya geçerli bir PHP geri arama dizisi geçiriyor olsanız da harika çalışacaktır. Yalnızca anonim işlevleri özellikle kontrol etmek istiyorsanız, Gumbo'nun söylediği gibi bir şey isteyebilirsiniz: parametrenin bir nesne olduğundan emin olun ve bunun bir Closure örneği olduğundan emin olun.
Lane

2
Ya bir callack mi yoksa bir ip mi olduğunu kontrol etmek ve onlar için farklı şeyler yapmak istersem? Bir dize değerinin yanlışlıkla geri arama olarak alınmasını istemiyorum.
Gherman

3
@Alman Sadece önce is_string ($ func) olup olmadığını kontrol edin, ardından is_callable ($ func) ile ikinci kontrol edin
Heroselohim

4
Yukarıdaki kod parçacığı başımı belaya soktu. "Tarih" etiketli bir dizge tasarladım ve daha sonra kapanış olarak ele alındı ​​ve çalıştırıldı. Doğru yol, if (($ değişken Kapanış örneği) && is_callable ($ değişken)) {...}
Basil Musa

1
Neden AND kapatma örneği çağrılabilir. Kapatma ne zaman çağrılamaz? Bir zaman olsaydı şaşırmazdım, ama neden iki kontrole ihtiyacımız olduğunu merak ediyorum.
Joel M

34

function_existsVerilen ada sahip bir işlev olup olmadığını kontrol etmek için kullanabilirsiniz . Bunu anonim işlevlerle birleştirmek için şunu deneyin:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

Bunun için teşekkürler! Uygulamam, kullanıcıların kendi hashing işlevlerini belirtmelerine veya alternatif olarak hash () için bir argüman sağlamalarına izin veriyor. Ancak bazı geçerli karma algoritmalar aynı zamanda PHP yerleşikleridir ve bu nedenle çağrılabilir (örneğin 'md5', 'sha1'). is_object()ve instanceof Closurebunu kontrol etmenin çok daha sağlam bir yolu!
njbair

İs_string ve function_exists çağrılarını kaldırın ve bu, lambda işlevlerini algılamak için kullanmak istediğiniz işlevdir. Teşekkür ederim!
jack

30

Yalnızca bir değişkenin anonim bir işlev olup olmadığını ve çağrılabilir bir dizge veya dizi olup olmadığını kontrol etmek istiyorsanız, kullanın instanceof.

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

Anonim işlevler (PHP 5.3'te eklenen türden) her zaman Closuresınıfın örnekleridir ve sınıfın her örneği Closureanonim bir işlevdir.

PHP'de muhtemelen bir işlev olarak düşünülebilecek başka tür bir şey vardır ve bu __invokesihirli yöntemi uygulayan nesnelerdir . Bunları dahil etmek istiyorsanız (dizeleri ve dizileri hala hariç tutarken) kullanın method_exists($func, '__invoke'). Kapamalar __invoketutarlılık için uygulandığından, bu yine de kapatmaları içerecektir .


8
Bu özellikle yararlıdır, çünkü is_callable()aktarılan bir dizeye veya diziye dayalı olarak aramak için bir yöntem bulmaya çalışır, bu da sınıfları otomatik olarak yükleyebilir ve beklediğiniz / ihtiyaç duyduğunuz davranış olmayabilir.
spikyjt

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

Gelecekte, diğer dillerde olduğu gibi, PHP gettype () 'i Object'ten Callable'a değiştirebilir. Yani, bu cevap muhtemelen gitmenin en iyi yoludur. Ancak bu şu şekilde optimize edilebilir: return! İs_string ($ f) &&! İs_array ($ f) && is_callable ($ f).
Alexandre T.

0

Php'de geçerli çağrılabilirler işlevler, işlevlerin adı (dizeler) ve form dizileri olabilir ['className', 'staticMethod']veya [$object, 'method']bu nedenle yalnızca işlevlerin algılanması için dizeleri ve dizileri dışlamalıdır:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.