As mentioned before, is_callable and method_exists report all methods callable even if they are private/protected and thus actually not callable. So instead of those functions you may use following work-around which reports methods as supposed to.
<?php
class Foo1 {
public function bar() {
echo "I'm private Foo1::bar()";
}
}
class Foo2 {
private function bar() {
echo "I'm public Foo2::bar()";
}
}
$f1=new Foo1;
$f2=new Foo2;
if(is_callable(array($f1,"bar"))) {
echo "Foo1::bar() is callable";
} else {
echo "Foo1::bar() isn't callable";
}
if(is_callable(array($f2,"bar"))) {
echo "Foo2::bar() is callable";
} else {
echo "Foo2::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f1))) {
echo "Foo1::bar() is callable";
} else {
echo "Foo1::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f2))) {
echo "Foo2::bar() is callable";
} else {
echo "Foo2::bar() isn't callable";
}
?>
output
Foo1::bar() is callable (correct)
Foo2::bar() is callable (incorrect)
Foo1::bar() is callable (correct)
Foo2::bar() isn't callable (correct)
?>