Php объявить функцию внутри функции

Вложенные функции

Функции можно вызывать внутри других функций — по аналогии с тем, как одна управляющая конструкция(if, while, for и т.д.) может находиться внутри другой. Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы.

В примере, описанном выше, можно полностью избавиться от необходимости модификации даты. Для этого достаточно включить в d1splay_copyright() вызов стандартной функции РНР date():

function display_copyright($site_name)

Параметр Y функции date() указывает, что возвращаемое значение представляет собой текущий год, отформатированный в виде четырех цифр. Если системная дата установлена правильно, РНР при каждом выполнении сценария будет выводить год. Функция РНР date() отличается исключительной гибкостью и поддерживает 25 разных флагов форматирования даты и времени.

Также допускается объявление функций внутри других функций. Тем не менее, вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена. Более того, вложенная функция не наследует параметров родительской функции; параметры должны передаваться ей точно так же, как и любой другой функции. Впрочем, вложенные объявления функций все равно могут использоваться из соображений удобства сопровождения и наглядности. Пример вложенного объявления приведен в листинге 4.1.

Листинг 4.1. Эффективное использование вложенных функций

function display_footer($site_name) < function display_copyright($site_name) < print "Copyright &сору". date("Y") .$site_name. All Rights Reserved."; print "
home | recipes | events
tutorials | about I contact us
"; display_copyright($site_name); print "
"; > $site_name = "PHP Recipes"; display_footer($site_name); display_copyhght($site_name);

Сценарий выводит следующий результат:

home | recipes | events tutorials | about | contact us Copyright © 2001 PHP Recipes. All Rights Reserved

Обратите внимание: функцию display_copyright() можно вызвать и за пределами display_footer() по аналогии стем, как функция display_footer() использовалась в предыдущем примере. Концепция защищенных функций в РНР не поддерживается.

Читайте также:  Python requests http response

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

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Copyright © 2005-2016 Project.Net.Ru

Источник

Вложенные функции php

Функции можно вызывать внутри других функций — по аналогии с тем, как одна управляющая конструкция (if, while, for и т.д.) может находиться внутри другой. Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы. Вложенные функции выглядят следующим образом:

function Parent($a) < echo $a; function Child($b) < echo $b+1; return $b*$b; >return $a*$a*Child($a); // фактически возвращает $a*$a*($a+1)*($a+1) > // Вызываем функции Parent(10); Child(30);

Видно, что нет никаких ограничений на место описания функции — будь то глобальная область видимости программы, либо же тело какой-то другой функции. Каждая функция добавляется во внутреннюю таблицу функций PHP тогда, когда управление доходит до участка программы, содержащего определение этой функции. При этом, конечно, само тело функции пропускается, однако ее имя фиксируется и может далее быть использовано в сценарии для вызова. Если же в процессе выполнения программы PHP никогда не доходит до определения некоторой функции, она не будет «видна», как будто ее и не существует. Вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена. Вложенная функция не наследует параметров родительской функции. Параметры должны передаваться ей точно так же, как и любой другой функции. Хотя вложенные функции не защищены от вызова из других точек сценария, они не могут вызываться до вызова своей родительской функции. При попытке вызвать вложенную функцию раньше вызова родительской функции выводится сообщение об ошибке.

Источник

Встраивание функций в PHP

Встраивание функций в PHP

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

Современный PHP работает быстро! Он имеет ряд особенностей для повышения производительности, такие как OPCache, JIT и другие улучшения на этапе компиляции, чтобы сделать интеллектуальную оптимизацию для приложения PHP.

На данный момент PHP имеет более 30 функций , которые используют специальные коды OPCodes или встроены иным образом для повышения производительности.

Одним из примеров, демонстрирующих этот эффект, является функция strlen. Она возвращает длину заданной строки, и PHP пытается выполнить оптимизацию с упреждением.

В этом фрагменте функция strlen вызывается для статической строки, и PHP может полностью исключить этот блок, поскольку длина строки Test фиксирована, и значение сравнения также является статическим. Это лучше видно с помощью дампа OPCode .

php -d opcache.opt_debug_level=0x10000 test.php
0000 JMPZ bool(false) 0002 
0001 ECHO string("Test")
0002 RETURN int(1)
php -d opcache.opt_debug_level=0x20000 test.php

Этот пример работает и в обратном направлении, избавляясь от ненужных OPCodes JMP / JMPZ / JMPNZ, которые в противном случае использовались бы в блоке if.

0000 ECHO string("Test") 
0001 RETURN int(1)

Полные имена функций

А вы замечали в каком-нибудь чужом коде, в начале файла, где идет объявление используемых классов, так же есть объявление функций с помощью оператора use? Ну знаете, что-то типа:

Зачем объявлять функции, если они, вроде как, уже известны интерпретатору PHP?

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

namespace Foo; 

if (strlen('Test') < strlen('Test Test')) echo "Test";
>

Обратите внимание, как блок if находится внутри п ространства имен Foo. Дамп OPCode показывает, что PHP не применил здесь особую обработку:

php -d opcache.opt_debug_level=0x20000 test.php
0000 INIT_NS_FCALL_BY_NAME 1 string("Foo\strlen") 
0001 SEND_VAL_EX string("Test") 1
0002 V1 = DO_FCALL_BY_NAME
0003 INIT_NS_FCALL_BY_NAME 1 string("Foo\strlen")
0004 SEND_VAL_EX string("Test Test") 1
0005 V2 = DO_FCALL_BY_NAME
0006 T0 = IS_SMALLER V1 V2
0007 JMPZ T0 0009
0008 ECHO string("Test")
0009 RETURN int(1)

Большинство проектов на PHP используют пространства имен, и чтобы вернуть особую обработку, имена функций могут быть снабжены префиксом обратной косой черты (\) или как раз, объявление псевдонимами с use function. Их часто называют «Полностью определенными именами функций» — (Fully-Qualified Function Names) или же FQFN.

Ускорение вашего приложения

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

namespace Foo; 
if (\strlen('Test') < \strlen('Test Test')) echo "Test";
>
namespace Foo; 
use strlen;
if (strlen('Test') < strlen('Test Test')) echo "Test";
>

Оба приведенных выше фрагмента сигнализируют движку о том, что вызов strlen действительно предназначен для внутренней функции strlen, что позволяет движку продолжать и встраивать их. С FQFN движок снова может применить свою магию:

0000 ECHO string("Test") 
0001 RETURN int(1)

Есть еще варианты объявление автоматических реализация, в виде подключения сторонних пакетов типа php_backslasher, FunctionFQNReplacer и пр. Так же можно объявить declare(no_dynamic_functions=1) в начале вашего файла.

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

Список функций со специальной обработкой

Все следующие функции имеют особую обработку в Zend Engine и могут нести большую пользу, если вызываются как полностью определенное имя функции.

Источник

Как сделать вызов функции из другой функции php?

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

 function firstFunction()  echo 'This is the first function!'; > function secondFunction()  firstFunction(); > secondFunction(); // => This is the first function! 

А также можно сделать с помощью функции call_user_func()

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

 function firstFunction()  echo 'This is the first function!'; > function secondFunction()  call_user_func('firstFunction'); > secondFunction(); // => This is the first function! 

Источник

Оцените статью