Функции, определяемые пользователем

Приведем пример синтаксиса, используемого для описания функций:

Пример #1 Псевдокод для демонстрации использования функций

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

Внутри функции можно использовать любой корректный PHP-код, в том числе другие функции и даже объявления классов.

Имена функций следуют тем же правилам, что и другие метки в PHP. Корректное имя функции начинается с буквы или знака подчеркивания, за которым следует любое количество букв, цифр или знаков подчеркивания. В качестве регулярного выражения оно может быть выражено так: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Подсказка

Смотрите также Руководство по именованию.

Функции не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.

В случае, когда функция определяется в зависимости от какого-либо условия, например, как это показано в двух приведенных ниже примерах, обработка описания функции должна предшествовать ее вызову.

Пример #2 Функции, зависящие от условий

<?php

$makefoo 
true;

/* Мы не можем вызвать функцию foo() в этом месте,
   поскольку она еще не определена, но мы можем 
   обратиться к bar() */

bar();

if (
$makefoo) {
  function 
foo()
  {
    echo 
"Я не существую до тех пор, пока выполнение программы меня не достигнет.\n";
  }
}

/* Теперь мы благополучно можем вызывать foo(),
   поскольку $makefoo была интерпретирована как true */

if ($makefoofoo();

function 
bar() 
{
  echo 
"Я существую сразу с начала старта программы.\n";
}

?>

Пример #3 Вложенные функции

<?php
function foo() 
{
  function 
bar() 
  {
    echo 
"Я не существую пока не будет вызвана foo().\n";
  }
}

/* Мы пока не можем обратиться к bar(),
   поскольку она еще не определена. */

foo();

/* Теперь мы можем вызвать функцию bar(),
   обработка foo() сделала ее доступной. */

bar();

?>

Все функции и классы PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если были определены внутри и наоборот.

PHP не поддерживает перегрузку функции, также отсутствует возможность переопределить или удалить объявленную ранее функцию.

Замечание: Имена функций регистронезависимы, тем не менее, более предпочтительно вызывать функции так, как они были объявлены.

Функции PHP поддерживают как списки аргументов переменной длины, так и значения аргументов по умолчанию. Смотрите также описания функций func_num_args(), func_get_arg(), и func_get_args() для более детальной информации.

Можно также вызывать функции PHP рекурсивно. Однако, пытайтесь избегать вызовов рекурсивных функций/методов с более чем 100-200 уровней рекурсии, так как это сильно бьет по стэку и может вызвать крах выполняемого скрипта.

Пример #4 Рекурсивные функции

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

Коментарии

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($arr2true);

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
                )

        )

)
**/

?>
2014-04-23 20:17:23
http://php5.kiev.ua/manual/ru/functions.user-defined.html
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.
2014-09-15 20:59:28
http://php5.kiev.ua/manual/ru/functions.user-defined.html
Автор:
You can also call function from itself.  For example, I want to reach the deepest value in multidimensional array and I call function from inside the very same function. In this example function behave as some meta-loop.
   
<?php 

$arr1
=array('a'=>array('e'=>array('f'=>array('g'=>'h''n' )),'b','c'));
$arr2=array('a'=>array('e'=>array('f'=>array('g'=>array('l'=>array('m'=>'w','q')), 'n' )),'b','c'));

function 
Deep($array){
    foreach(
$array as $key){
        if(
is_array($key)){
             return 
Deep($key);//calling the function inside the function
}else {
echo 
$key;
        }
    }
}

echo 
Deep($arr1); //outputs: hn
echo Deep($arr2); //outputs: wq

?>
2015-03-16 19:31:16
http://php5.kiev.ua/manual/ru/functions.user-defined.html
As of PHP 7.0, you can restrain type of return value of user defined functions.

Syntax is : function FunctionName ($arg1, $arg2, ...)  : TYPE { ... }

TYPE is a string representing the type of return value, TYPE can be a class name or a php variable type, such as array/string/bool/int/float. 

When TYPE is one of the following value, it also stands for a classname

str/boolean/integer/real/double/resource/object/scalar

However,in my opion, boolean/bool, integer/int ... should have the same meaning, but at least in PHP7, they stand for different meanings respectively. This may be fixed in later versions of PHP.

<?php
   
function wxc ($var) : string {
        return 
$var;
    }
?>

this function must return a string, if it return something else when called, a "Fatal error: Uncaught TypeError" error will be triggered.

code above is supported only in PHP 7+
2015-11-07 17:52:14
http://php5.kiev.ua/manual/ru/functions.user-defined.html
Автор:
following is a function that can be used to convert numeric date to alphabetic date, e-g from 2015-11-16 to 16 Nov, 2015.

1. Function takes 3 parameters, numeric date, locale and length of month
2. Function currently supports EN and ES month names.
3. Function can be calles as <?php convertDate("2015-11-16","en","full"); ?>

<?php

   
function convertDate($date,$locale,$length){
       
       
$monthNames = array(
               
"en" => array(
                   
"full" => array(1=>'January','February','March','April','May',
                   
'June','July','August','September','October','November','December'),
                   
                   
"short" => array(1=>'Jan','Feb','Mar','Apr','May','Jun',
                   
'Jul','Aug','Sep','Oct','Nov','Dec')
                ),
               
"es" => array(
                   
"full" => array(1=>'Enero','Febrero','Marzo','Abril','Mayo',
                   
'Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Deciembre'),
                   
                   
"short" => array(1=>'Ene','Feb','Mar','Abr','May','Jun',
                   
'Jul','Ago','Sep','Oct','Nov','Dec')
                ),
            );
           
           
$exploded explode("-",$date);
           
$year $exploded[0];
           
$month $exploded[1];
           
$day $exploded[2];
           
           
$month $monthNames[$locale][$length][$month];
           
$date $day " " $month ", " $year;
            return 
$date;
    }

?>
2015-11-23 17:09:12
http://php5.kiev.ua/manual/ru/functions.user-defined.html
Functions that are written by the user are User defined functions.

function function name [(argument1, argument 2, ...argument n)] 
{any PHP code }

For example,

<?php
function hello()
{
print(
"Hello!");
}
hello();
?>

Using the function hello() anywhere in the PHP code will display the word "Hello".
2015-12-29 20:23:03
http://php5.kiev.ua/manual/ru/functions.user-defined.html
As posted by ohcc at 163 dot com

    function wxc ($var) : string 
    {
        return $var;
    }
 
  this function must return a string, if it return something else when 
  called, a "Fatal error: Uncaught TypeError" error will be triggered.

  But when executed by passing various datatypes, it doesn't throw error   
  other than array and object.

  Please look over the code

  function abc($var) :string { return $var;}
  echo abc(true);    // Results 1
 
  function abc($var) :string { return $var;}
  echo abc(88.99);  // Results 88.99 

  function abc($var) :string { return $var;}
  echo abc(array());
 
  //Results 
  Fatal error : Uncaught TypeError: Return value of abc() must be of the   
  type string

  Note :
  Even though function is forced to return only string, it still considers the   
  other datatype arguments as string.
 
  echo gettype(abc(99.88));  // Returns string.
2016-03-31 08:40:27
http://php5.kiev.ua/manual/ru/functions.user-defined.html
For a good note, we can pass function as argument to function.

Take a look at the code. Passing function as argument can be achieved by Closure class ( A class to represent anonymous function).

function math(Closure $type, $first, $second) {
    // Execute the closure with parameters
    return $type($first, $second);
}

// Create an addition closure.
$addition = function ($first, $second) {
    // Add the values.
    return $first + $second;
};

// Create an subtraction closure.
$subtraction = function ($first, $second) {
    // Subtract the values.
    return $first - $second;
};

// Execute math function.
Note :anonymous  function is passed as an argument to function math.
echo math($addition, 2, 2); 
echo PHP_EOL; // New line!
echo math($subtraction, 5, 3);

Courtesy : PHP Panda. Inspired from PHP panda.
2016-03-31 09:22:06
http://php5.kiev.ua/manual/ru/functions.user-defined.html
//Calling function with in a function or inner function

function add($a,$b){
    return $a+$b;
}

function sub($a,$b){
    return $a-$b;
}

function math($first, $second) {
    $res =  add($first, $second)/sub($first, $second);
    return (int)$res;
}
echo math(200,100);  //Results  3
2016-03-31 09:45:29
http://php5.kiev.ua/manual/ru/functions.user-defined.html
Type Checking in PHP 7 

case A: //Using return
-------------------------
function welcome($name):string 
{
   return $name;
}
echo welcome(100); 

Results :  100

case B: //Using echo
-------------------------
function welcome($name):string 
{
    echo $name;
}
welcome("100");

Results : Fatal error</b>:  Uncaught TypeError

function welcome(string $name) 
{
    echo $name;
}
welcome(100);

Results :  100

case C: // Using strict_types
--------------------------------
declare(strict_types=1);

function welcome($name):string 
{
    return $name;
}
echo welcome(90.99);

Results : Fatal error</b>:  Uncaught TypeError

case D: // Using strict_types
--------------------------------
//declare(strict_types=1);   On comment to strict_types

function welcome($name):string 
{
    return $name;
}
echo welcome(90.99);

Results :  90.99

Note: 
Behaviour of echo and return on welcome function show in different reflection. Representation of function type checking can be in either type as follows

function welcome(string $name){ }
or
function welcome($name):string{ }

Executed on PHP Version : 7.0.3
2016-03-31 16:00:58
http://php5.kiev.ua/manual/ru/functions.user-defined.html

    Поддержать сайт на родительском проекте КГБ