PHPerKaigi 2024

is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

is_callableBir değişkenin değerinin bir işlev olarak çağrılabilirliğini doğrular

Açıklama

is_callable(mixed $değer, bool $sözdizimsel = false, string &$isim = null): bool

değer callable türündeyse true döner.

Bağımsız Değişkenler

değer

Bir işlev ismi.

sözdizimsel

true atanırsa işlev bağımsız değişkeninde bir işlev veya yöntem ismi belirtildiği varsayımıyla doğrulama yapılmaya çalışılır. Sadece dizge olmayan veya bir geriçağırım işlevi olarak kullanılabilecek geçerli bir yapıya sahip olmayan bir dizi içeren basit değişkenler reddedilir. Geçerli bir dizinin 2 girdisi olacağı varsayılır; ilki bir nesne veya bir dizge, ikincisi ise bir dizge.

isim

İşlev veya yöntemin çağrılabilir ismi. Aşağıdaki örnekteki "birSınıf::birYöntem" gibi. birSınıf::birYöntem() çağrılabilir bir duruk yöntem olsa da bunun hep böyle olması gerekmez.

Dönen Değerler

Belirtilen değer bir işlev olarak çağrılabiliyorsa true, aksi takdirde false döner.

Örnekler

Örnek 1 - is_callable() örneği

<?php
// Bir değişkenin içeriğinin bir işlev olarak
// çağrılabilirliğinin sınanması.

//
// Bir işlev içeren basit bir değişken
//

function bir_işlev()
{
}

$işlevDeğişkeni = 'bir_işlev';

var_dump(is_callable($işlevDeğişkeni, false, $isim)); // bool(true)

echo $isim, "\n"; // bir_işlev

//
// Bir yöntem içeren bir dizi
//

class birSınıf {

function
birYöntem()
{
}

}

$birNesne = new birSınıf();

$yöntemDeğişkeni = array($birNesne, 'birYöntem');

var_dump(is_callable($yöntemDeğişkeni, true, $isim)); // bool(true)

echo $isim, "\n"; // birSınıf::birYöntem

?>

Örnek 2 - is_callable() ve kurucular

is_callable() kurucuları çağrılabilir saymaz.

<?php

class Foo
{
public function
__construct() {}
public function
foo() {}
}

var_dump(
is_callable(array('Foo', '__construct')),
is_callable(array('Foo', 'foo'))
);

Yukarıdaki örneğin çıktısı:

bool(false)
bool(false)

Notlar

  • Bir nesne __invoke() örnekliyorsa nesne ismi çağrılabilirdir ve geçerli etki alanında görünür olur.
  • Bir sınıf __callStatic() örnekliyorsa sınıf ismi çağrılabilirdir.
  • Bir nesne __call() örnekliyorsa, nesne ismi çağrılabilirdir ve nesne üzerindeki her yöntem için, yöntem tanımlanmamış olsa bile true döndürür.
  • Bir çağrılabilir, sınıfın ismiyle çağrılırsa otomatik yüklemeyi tetikleyebilir.

Ayrıca Bakınız

add a note

User Contributed Notes 2 notes

up
34
izharaazmi at gmail dot com
8 years ago
If the target class has __call() magic function implemented, then is_callable will ALWAYS return TRUE for whatever method you call it.
is_callable does not evaluate your internal logic inside __call() implementation (and this is for good).
Therefore every method name is callable for such classes.

Hence it is WRONG to say (as someone said):
...is_callable will correctly determine the existence of methods made with __call...

Example:
<?php
class TestCallable
{
public function
testing()
{
return
"I am called.";
}

public function
__call($name, $args)
{
if(
$name == 'testingOther')
{
return
call_user_func_array(array($this, 'testing'), $args);
}
}
}

$t = new TestCallable();
echo
$t->testing(); // Output: I am called.
echo $t->testingOther(); // Output: I am called.
echo $t->working(); // Output: (null)

echo is_callable(array($t, 'testing')); // Output: TRUE
echo is_callable(array($t, 'testingOther')); // Output: TRUE
echo is_callable(array($t, 'working')); // Output: TRUE, expected: FALSE
?>
up
17
mohamed dot elidrissi at protonmail dot com
2 years ago
Note that -- as mentioned in the migration guide-- starting from PHP 8.0, is_callable() will not work with non-static methods if you use a class name, instead an object of the class should be provided:

<?php

class Test
{
public function
method1() { }
public static function
method2() { }
}

// Pre PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(true)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)

// Post PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(false)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)
var_dump(is_callable(array(new Test, 'method1'))); // bool(true)

?>
To Top