|
function_exists
Return TRUE if the given function has been defined
(PHP 4, PHP 5)
Example 761. function_exists() example<?php Related Examples ( Source code ) » function_exists Examples ( Source code ) » Animated Talking Captcha php class Examples ( Source code ) » Feed Validator Examples ( Source code ) » E-mail address validation class Examples ( Source code ) » RFC-compliant email address validator Code Examples / Notes » function_exists@flop
var_dump(function_exists(create_function('$a','return $a;'))); -> True :))) kweul fili
To prevent direct calls to included files i use the following technique. In the main file create an empty function with a random name. Like so: <?php function hjudejdjiwe() { return true; } ?> Then check for the existence of this function within your include: <?php if (!function_exists('hjudejdjiwe')) { die('!'); } ?> Simple but effective. dieter
to brooklynphil at hotmail dot com: Your post is misleading, namely the 3rd and last speedtest you describe is an unfair comparison: <?php is_callable('test','test'); ?> The value of the 2nd parameter $syntax_only is 'test' and this evaluates to boolean true. In other words, this is exactly the same as calling the function like this: <?php is_callable('test',true); ?> Of course this will be faster because is_callable only does a very basic syntaxcheck. From the documentation: 'It will only reject simple variables that are not strings, or an array that does not have a valid structure to be used as a callback.' If you omit this erroneous 3rd test, then according to your examples function_exists is 2 to 4 times faster. I hope you can see that loop-testing functions is not so simple. :) rtfm brooklynphil
to bob at thethirdshift dot net regarding is_callable vs function_exists. using your code is_callable = TRUE, function_exists = FALSE Did 10000 is_callables in 0.0443360805511 seconds Did 10000 function_exists in 0.0111110210419 seconds then we replace is_callable(array('test','test')); with $callarray = array('test','test'); // place this outside for-loop is_callable($callarray); is_callable = TRUE, function_exists = FALSE Did 10000 is_callables in 0.0314660072327 seconds Did 10000 function_exists in 0.0120670795441 seconds then we replace is_callable(array('test','test')); with is_callable('test','test'); is_callable = TRUE, function_exists = FALSE Did 10000 is_callables in 0.00991606712341 seconds Did 10000 function_exists in 0.0113790035248 seconds I hope you can see that loop-testing functions is not so simple. :) chaumo
to avoid direct calls this can be better than function_exists in the parent file: <?php define("IN_MODULE",true); ?> and in the target file: <?php if(!defined("IN_MODULE")) die("Can't access the file directly"); ?> dshearin
This can be used to conditionally define a user function. In this sense, it can act as a sort of inline include_once(). For example, suppose you have a function A that calls function B. B is only used inside function A and is never called from anywhere else in the script. It's logical (and perfectly legal in PHP) to define B inside of A's definition, like so: function A($inputArray) { if (!function_exists('B')) { function B($item) { // Do something with $item // and return result return $result; } } foreach ($inputArray as $nextItem) $outputArray[] = B($nextItem); return $outputArray; } Without the function_exists test, you would get a fatal error the second time you called A, as PHP would think you were trying to redefine B (not legal in PHP). The placement of the test is also important. Since the if block is executed sequentially, like any other block of code, it must come before any call to the function defined within. eddiec
Note that function_exists will return TRUE in the following situation, presumably because the function "testfunc" was defined when the script was PARSED/ITERPRETED, before the function_exists call was made at RUNTIME: <? if (function_exists('testfunc')) return; function testfunc() { } ?> So, this construction is not useful for preventing testfunc from being multiply defined if the script is muliply included or required. However, the following construction DOES work to prevent multiple defines of testfunc: <? if (!function_exists('testfunc')) { function testfunc() { } } ?> CONTRAST this with similar uses of defined() which is completely runtime evaluated. These both work: <? if (defined('testfunc_defined')) return; define('testfunc_defined', 1); function testfunc() { } ?> AND... <? if (!defined('testfunc_defined')) { define('testfunc_defined', 1); function testfunc() { } } chad 0x40 herballure 0x2e com
In-reply-to: neelam_ab2003 at yahoo dot co dot in See the functions section of the manual, http://us2.php.net/manual/en/language.functions.php - once you call B() then function C will exist, and likewise for calling C to create D. webmaster
If you use suhosin.executor.func.blacklist instead of disabled_functions in your php.ini, function_exists will return true for a disabled function. I used this to have the same beahviour with suhosin.executor.func.blacklist and disabled_functions: <?php function suhosin_function_exists($func) { if (extension_loaded('suhosin')) { $suhosin = @ini_get("suhosin.executor.func.blacklist"); if (empty($suhosin) == false) { $suhosin = explode(',', $suhosin); $suhosin = array_map('trim', $suhosin); $suhosin = array_map('strtolower', $suhosin); return (function_exists($func) == true && array_search($func, $suhosin) === false); } } return function_exists($func); } ?> jeremiah
If you are trying to use this for testing a "function" within a class, then you need to use method_exists(). A "function" within an object is a method, not a function.
bob
I, too, was wondering whether is_callable or function exists is faster when checking class methods. So, I setup the following test: <?php function doTimes($start, $end) { $start_time = explode (" ", $start); $start_time = $start_time[1] + $start_time[0]; $end_time = explode (" ", $end); $end_time = $end_time[1] + $end_time[0]; $time = $end_time - $start_time; return $time; } class test { function test() { return true; } } $callableIsTrue = false; $startIsCallable = microtime(); for($i = 0; $i < 10000; $i++) { if(is_callable(array('test', 'test'))) { $callableIsTrue = true; } } $endIsCallable = microtime(); $existsIsTrue = false; $startExists = microtime(); for($i = 0; $i < 10000; $i++) { if(function_exists('test::test')) { $existsIsTrue = true; } } $endExists = microtime(); $timeIsCallable = doTimes($startIsCallable, $endIsCallable); $timeExists = doTimes($startExists, $endExists); echo "<b>is_callable = ".($callableIsTrue ? "TRUE" : "FALSE")."</b>, \n"; echo "<b>function_exists = ".($existsIsTrue ? "TRUE" : "FALSE")."</b> \n"; echo " Did 10000 is_callables in ".$timeIsCallable." seconds"; echo " Did 10000 function_exists in ".$timeExists." seconds"; ?> This gives the output : is_callable = TRUE, function_exists = FALSE Did 10000 is_callables in 0.0640790462494 seconds Did 10000 function_exists in 0.0304429531097 seconds So the fact that function_exists is twice as fast is slightly over shadowed by the fact that it doesn't work on class methods, at least not as far as I can tell. dan
I would like to comment on the following post: A note of caution: function_exists() appears to be case-insensitive (at least as of PHP 4.3.8). e.g.: <?php function MyCasedFunction() { return true; } // Will return true, even though casing is "wrong" if (function_exists("mYcAsEdFuNcTiOn")) echo "I see it!"; ?> I believe that function calls itself are case insensitve, so this function is returning a valid truth. PHP doesn't care about cases. ckrack
i was wondering whether is_callable or function exists is faster when checking class methods. is_callable(array('foo', 'bar')); function_exists('foo::bar'); my results when doing each operation 10000 times with a simple test class were the following: is_callable: 0.28671383857727 seconds function_exists: 0.14569997787476 seconds (following tests have proved this to be true). thus you can see, function_exists is twice as fast as is_callable. white-gandalf
I stumbled over the same problem as "eddiec" (users not able or not willing to use "_once"-suffixes). A possible alternative explanation for the behavior: If a file is included, it is possibly parsed every include-time.(?) While parsing, every function in global scope is tried to register. THIS gets wrong, when multiple times included, and it produces an error. If functions are defined within block scopes, their registration seems to be delayed until execution of such a block. Thus, not the function "function_exists" functions wrong, but simply the philosophy of the interpreter produces such results. Thus, the same effect can be achieved by simply putting block braces around the contents of an include_once file: if (function_exists('function_in_question')) return; { function function_in_question(...) { ... } ...other stuff } ...which is equivalent to... if (!function_exists('function_in_question')) { function function_in_question(...) { ... } ...other stuff } andi
function_exists will return false for functions disabled with the disable_functions ini directive. However those functions are still declared so trying to define them yourself will fail. <? if(!function_exists('readfile')){ function readfile($file){ $handle=@fopen($cache,"r"); echo @fread($handle,filesize($file)); @fclose($handle); } } ?> The above will issue a "Cannot redeclare readfile()" fatal error if readfile was disabled with disable_functions. breadman
Functions within a function are better off as anonymous returns from create_function(), unless you want to be able to call it elsewhere. However, I have used this in skinning: I use alert_box() to display certain errors, like a faulty SQL query. This simply calls display_alert(), which is defined in my skin scripts. However, alert_box() is sometimes called before I know which skin to load, so it has its own functionality which it uses if function_exists('display_alert') returns false. codeslinger
case-insensitive is by design see http://www.php.net/manual/en/language.functions.php "Function names are case-insensitive, though it is usually good form to call functions as they appear in their declaration." PHP is not C, though the similarities can be confusing. dark dot ryder
A note of caution: function_exists() appears to be case-insensitive (at least as of PHP 4.3.8). e.g.: <?php function MyCasedFunction() { return true; } // Will return true, even though casing is "wrong" if (function_exists("mYcAsEdFuNcTiOn")) echo "I see it!"; ?> neelam_ab2003
<?php /*PHP doesn't Support nested functions. I have tried following in PHP_VERSION - 5.1.2*/ function A(){} function B(){ function C(){ function D(){} } } IsFunctionExist('A'); IsFunctionExist('B'); IsFunctionExist('C'); IsFunctionExist('D'); function IsFunctionExist($funcName){ echo function_exists($funcName)?" $funcName exist ":" $funcName doesn't exist "; } ?> /*O U T P U T A exist B exist C doesn't exist D doesn't exist */ |