Варианты функций


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

//---------------------------------------------------------
// 1. Обычная функция
// Принимает на входе параметры, что-то делает, возвращает результат
function maxvalue($a,$b) {
    if ($a>=$b) return $a; else return $b;
}

// Напечатает 7
print maxvalue(5,7);

//---------------------------------------------------------
// 2. Рекурсивная функция
// Функция вызывает сама себя, в первой строке содержит условие выхода
function factorial($n) {
    if ($n==1) return 1;
    else return factorial($n-1)*$n;
}

// Напечатает 24
print factorial(4);

//---------------------------------------------------------
// 3. Функция с параметрами по умолчанию
// Параметры по умолчанию при вызове можно не указывать
function sum3($a,$b,$c=10) {
    return $a+$b+$c;
}

// Напечатает 20
print sum3(5,5);

//---------------------------------------------------------
// 4. Функция, принимающая ссылки
// Принимает на только переменные, не может принимать числа-константы
function plusone(&$a, &$b) {
    $a++;  ++$b;
}

$x=3; $y=4;
plusone($x,$y);
// Напечатает 4
print $x;

//---------------------------------------------------------
// 5. Функция, возвращающая ссылку
// Возвращает ссылку, а не копию данных
function &getref(&$s) {
    $s = $s . "_world";
    return $s;
}

$y = "hello"; $x =& getref($y);
// Напечатает super_hello_world
$x="super_".$x; print $y;

//---------------------------------------------------------
// 6. Функция с переменным числом параметров
// Принимает любое число параметров
function bigsum() {
    $args = func_get_args();
    $s = 0;
    for($i=0;$i<count($args);$i++) $s = $s + $args[$i];
    return $s;
}

// Напечатает 10
print bigsum(1,2,3,4);

//---------------------------------------------------------
// 7. Анонимная функция
// Функция не имеет имени, "находится внутри переменной"
$anonim = function($name) {
    print "Hello $namen";
};

// Напечатает Hello world
$anonim("world");

//---------------------------------------------------------
// 8. Функция, вызванная по имени - через строку с названием
// Строку с названием фукнции можно формировать где угодно
// и даже хранить в файле (Например, история операций)
function f1($name) {
    print "f1($name)n";
}

// Напечатает f1(world)
$x = "f1";  $x("world");

//---------------------------------------------------------
// 9. Функция, изменяющая глобальную переменную
// Позволяет менять данные, объявленные в главной программе
$K=10; $R=10;
function change() {
    global $K;
    $K=20; $R=20;
}

// Напечатает 30
change(); print $K+$R;

//---------------------------------------------------------
// 10. Функция со статической переменной
// Статическая переменная всегда инициализируется до вызова фукнции
// Статическая переменная сохраняет состояние после завершения фукнции
function increment($add) {
    static $my = 0;
    $my = $my + $add;
    return $my;
}

// Напечатает 3
increment(1); print increment(2);

//---------------------------------------------------------
// 11. Функция, принимающая другую фукнцию
// Принимает и вызывает другую фукнцию с заданным параметром
function callme($p1,$p2) {
    print "$p1-$p2n";
}
function callfunc($func,$param1,$param2) {
    $func($param1,$param2);
}

// Напечатает 100-200
print callfunc("callme", "100", "200");

//---------------------------------------------------------
// 12. Функция, возвращающая другую фукнцию
// Возвращает другую функцию в зависимости от аргумента
function mult($x) {
    if ($x>10) return function($a) { return $a*5; };
    else return function($a) { return $a*10; };
}

// Напечатает 50;
print call_user_func(mult(5),5);

//---------------------------------------------------------
// 13. Фукнция, принимающая на вход свой результат
// Такая фукнция позволяет строить цепочки из данных
function makestr($open,$str,$close) {
    return $open.$str.$close;
}

// Напечатает (/id/)
print makestr( '(', makestr('/','id','/'), ')' );

//---------------------------------------------------------
// 14. Две взаиморекурсивные функции
// Вызывают по очереди друг друга
// Заменяют 1 на Y или +, 0 на N или -
function showbool($str,$pos=0) {
    if ($pos>=strlen($str)) return '';
    $res = $str{$pos}=='1'?'Y':'N';
    return $res.showplus($str,$pos+1);
}
function showplus($str,$pos=0) {
    if ($pos>=strlen($str)) return '';
    $res = $str{$pos}=='1'?'+':'-';
    return $res.showbool($str,$pos+1);
}

// Напечатает Y-Y+N+Y
print showbool('1011011');
// Напечатает +N+Y-Y+
print showplus('1011011');

//---------------------------------------------------------
// 15. Функция, возвращающая массив и обратная ей фукнция
// Одна - принимает параметры, возвращает массив
// Вторая - принимает массив, возвращает параметры через массив
function packme($a,$b,$c) {
    $z = array($a,$b,$c);
    return $z;
}

$a = packme(1,2,3);
// Напечатает 2
print $a[1];

function unpackme($e) {
    $a = $e[0]; $b = $e[1]; $c = $e[2];
    return array($a,$b,$c);
}

$m = array(1,2,3);
list($x,$y,$z) = unpackme($m);
// Напечатает 3
print $z;