ConFoo: Call for paper is now Open

توابع تعریف شذه کاربر

یک تابع با استفاده از دستور زیر قابل تعریف شدن است:

Example #1 شبه کد نمایش استفاده از توابع

<?php
function foo($arg_1$arg_2/* ..., */ $arg_n)
{
    echo 
"Example function.\n";
    return 
$retval;
}
?>

یک کد صحیح PHP می‌تواند در داخل تابع قرار گیرد حتی تعریف توابع و کلاس .

نام تابع قوانین یکسانی مانند برچسب‌ها پیروی می‌نماید. یک نام صحیح با یک حرف یا _ شروه شده و پس از آن حروف اعداد یا _ می‌تواند قرار گیرد. یک عبارت منظم برای این قوانین بصورت یر است: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Tip

See also the Userland Naming Guide.

تابع نیاز به تعریف پیش از استفاده ندارند به جز زمانی که یک تابع بصورت شرطی همانند مثال‌های پایین تعریف شده باشد.

وقتی یک تابع بصورت شرطی تعریف می‌گردد همان طور که در دو مثال پایین نشان داده شده است.تعریف آن باید پیش از فراخوانی آن نوشته شده باشد.

Example #2 توابع شرطی

<?php

$makefoo 
true;

/* We can't call foo() from here 
   since it doesn't exist yet,
   but we can call bar() */

bar();

if (
$makefoo) {
  function 
foo()
  {
    echo 
"I don't exist until program execution reaches me.\n";
  }
}

/* Now we can safely call foo()
   since $makefoo evaluated to true */

if ($makefoofoo();

function 
bar() 
{
  echo 
"I exist immediately upon program start.\n";
}

?>

Example #3 توابع در توابع

<?php
function foo() 
{
  function 
bar() 
  {
    echo 
"I don't exist until foo() is called.\n";
  }
}

/* We can't call bar() yet
   since it doesn't exist. */

foo();

/* Now we can call bar(),
   foo()'s processesing has
   made it accessible. */

bar();

?>

تمام توابع و کلاس‌ها در PHP حوزه جهانی دارند - آنها را می‌توان خارج از تابع فراخواند حتی اگر در داخل تعریف شده باشد و یا برعکس.

PHP از بارگذاری توابع پشتیبانی نمی‌نماید و یک تابع از پیش تعریف شده را دوباره تعریف کرد یا از تعریف خارج نمود.

Note: نام‌های تابع غیرحساس به حروف بزرگ یا کوچک است با این وجود فراخوانی تابع به همان صورت تعریف آنها بسیار خوب است.

هر دو تعداد آرگومان متغیر و آرگومان پیشفرض در تابع‌ها فراخوانی می‌گردد. همچنین مرجع‌های تابع برای func_num_args() func_get_arg() و func_get_args() برای اطلاعات بیشتر ببینید.

می‌توان توابع بازگشتی را در PHP فراخواند. به هر حال توابع متدهای بازگشتی با بشاز ۱۰۰-۲۰۰ بار فراخوانی می‌تواند موجب اتمام پشته در اسکریپت فعلی گردد.

Example #4 توابع بازگشتی

<?php
function recursion($a)
{
    if (
$a 20) {
        echo 
"$a\n";
        
recursion($a 1);
    }
}
?>

add a note add a note

User Contributed Notes 6 notes

up
9
aydinantmen [at] hotmail [dot] com
4 months ago
I want to use multidimentional arrays in a callback function what accepts second parameter.

Solution:

<?php

$arr1
= array("a" => "b", "c", "d's", "e" => array("f's", "g" => array("h's", "i" => "j's")));
$arr2 = mdarr_parameter($arr1);
$arr3 = mdarr_parameter($arr2, true);

function
mdarr_parameter($needle, $job=false) {
    if (
is_array($needle)) {
        foreach(
$needle as $name => $value) {
           
$needle[$name] = mdarr_parameter($value, $job);
        }
    } else {
       
// Now you do anything you want...
       
if ($job === true) {
           
$needle = stripslashes($needle);
        } else {
           
$needle = addslashes($needle);
        }
    }
    return
$needle;
}

print_r($arr2);
print_r($arr3);

/**
Outputs:

Array
(
    [a] => b
    [0] => c
    [1] => d\'s
    [e] => Array
        (
            [0] => f\'s
            [g] => Array
                (
                    [0] => h\'s
                    [i] => j\'s
                )

        )

)
Array
(
    [a] => b
    [0] => c
    [1] => d's
    [e] => Array
        (
            [0] => f's
            [g] => Array
                (
                    [0] => h's
                    [i] => j's
                )

        )

)
**/

?>
up
3
webmaster at heathdale dot vic dot edu dot au
5 months ago
<?php

// first run (function doesn't exist)
$myfunc_exists;
if (!
$myfunc_exists) {
    function
myfunc() {
        echo (
'myfunc ran definition #1<br>');
    }
   
$myfunc_exists = true;
}

myfunc();   // echoes 'myfunc ran definition #1<br>'

// second run (function already exists, so won't be redefined and won't cause error)
// e.g. if the file containing the function got #included twice (it does happen)
$myfunc_exists;
if (!
$myfunc_exists) {
    function
myfunc() {
        echo (
'myfunc ran definition #2<br>');
    }
   
$myfunc_exists = true;
}

myfunc();  // still echoes 'myfunc ran definition #1<br>' (not #2)

?>
up
1
php at xenhideout dot nl
16 hours ago
Please be advised that the code block defining the function, within the function_exists() call, has to be executed for the function to get defined, whereas this is not the case for regular, unenclosed functions.

Meaning, if you write code like this:

<?php

do_function
();

if (!
function_exists('my_undefined')) {
    function
my_undefined() {
    }
}

function
do_function() {
   
my_undefined();
}
?>

..Then my_undefined will not be defined before the code in do_function calls it. Some people put their function sections below the regular executing code of the script. Making any of it 'pluggable' can then cause problems.
up
-11
Alexandre
3 months ago
In  PHP version less than 5 a function named "retorna_so_numeros" was OK.

Now in current PHP version I had to rename this function to "retorna_numeros" or the script won't work.
up
-37
lubaev
8 months ago
<?php

function overload()
{
 
$overloadFn = array();
 
 
// key = count arguments, value = callback function.
 
$overloadFn[0] = function() {
    return print
nl2br("Zero argument. \n");
  };
 
$overloadFn[1] = function($a) {
    return print
nl2br("One argument. Result: $a \n");
  };
 
$overloadFn[2] = function($a,$b) {
    return print
nl2br("Two argument. Result: $a, $b \n");
  };
 
$overloadFn[4] = function($a,$b,$c,$d) {
    return print
nl2br("Four argument. Result: $a, $b, $c, $d \n");
  };
 
 
$countArgs = func_num_args();
 
$valueArgs = func_get_args();
 
  if( isset(
$overloadFn[ $countArgs ]) )
  {
    return
call_user_func_array( $overloadFn[ $countArgs ], $valueArgs );
  }
 
trigger_error("Wrong number of arguments!", E_USER_WARNING);
 
}

// OVERLOAD
overload(); // Zero argument.
overload(1); // One argument. Result: 1
overload(1,2); // Two argument. Result: 1, 2
overload(1,2,3); // Warning: Wrong number of arguments!
overload(1,2,3,4); // Four argument. Result: 1, 2, 3, 4
overload(1,2,3,4,5); // Warning: Wrong number of arguments!

?>
up
-50
Ben Tiessen
7 months ago
Functions can also be executed from variables:

function myFunc(){
  echo "Hello World";
}

$myFunc = myFunc();

$myFunc();

// Will output Hello World
To Top