PHP - Урок 11. Функции. Добавляем ядро системы core.php
Предыдущие уроки:
Программируем на PHP - Введение
PHP - Запросы от браузера к серверу
PHP - Как работает сервер
PHP - Урок 4. PHP - интерпретатор
PHP - Урок 5. Переменные сервера и глобальные переменные
PHP - Урок 6. Конструкции print и echo. Кавычки одинарные и двойные и конкатенация строк
PHP - Урок 7. Переменные, константы и условия
PHP - Урок 8. Точка входа в приложение. Настройка mod_rewrite и файл .htaccess
PHP - Урок 9. Массивы и switch. Кодим основной каркас
PHP - Урок 10. COOKIE
Функции
Тут попробую объяснить это с двух позиций - технической и философской. С технической точки зрения программа рассматривается как код, который вместе с данным может составлять процесс. В любой программе есть условные и безусловные переходы, которые представляют собой переход в определенный адрес кода (его загрузка в указатель инструкций процессора). Все циклы и условия в ваших программах имеют такую же семантику (хотя PHP напрямую и не выполняется процессором, но принцип интерпретатора похожий). В системном программировании бывают еще безусловные переходы. Это просто такие команды, которые в качестве операнда (параметра) принимают некоторый адрес и когда встречаются в коде переходят на этот адрес, могут перейти как назад так и вперед. Могут даже сами на себя, правда это просто подвесит программу и она "застрянет" в этом месте. Так вот. Такие безусловные переходы по сути уже наполовину функции. Но для того чтобы они стали ими в полной мере следует добавить - параметры, передаваемые в код функции - возврат из кода функции Как только эти два свойства добавлены у нас получается функция. Естественно в PHP все уже имеется.Параметры функции
Технически параметры - это стековые переменные, при вызове функции (переходе в ее код) такие переменные создаются в специальном участке памяти процесса - стеке и удаляются при выходе из функции. Если рассматривать функцию как подпрограмму - то ее параметры - это входные данные подпрограммы. А возвращаемое значение - результат работы подпрограммы (вывод). Локальные переменные не обязательно должны быть параметрами функции. Если переменная не статическая и объявлена внутри функции - то она сама по себе локальная - доступна только внутри этой функции. Вне функции можно объявлять переменные с таким же именем и они будут совершенно разными. Локальные будут указывать на адрес в стеке, а глобальные в области данных процесса, или дополнительной памяти поверх области данных процесса. Параметры же задаются внутри скобок при объявлении функции:function my_func($par, $par2) {
echo "Значения переданные в функцию: $par и $par2";
}
Вызов этой функции будет происходить следующим образом: my_func("Привет", "Мир!");
В параметрах функций можно указывать аргументы по умолчанию, но только если после них нет аргументов с неопределенным по умолчанию значением.
Например:
function my_func($par, $par2 = "По умол") {
echo "Значения переданные в функцию: $par и $par2";
}
В этом случае вызов my_func("Привет");
будет аналогичен my_func("Привет", "По умол");
Естественно в функции модно передавать не только константные значения, но и переменные, хранящие их
$arg = "Привет";
my_func($arg);
Возврат из функции
Показанные выше функции не возвращают значений. Они просто выполняют определенный код. (выводят строку с переданными в функцию параметрами).
Теперь мы просто заменим в коде нашей функции echo на return и вот что получим:
function my_func($par, $par2 = "По умол") {
return "Значения переданные в функцию: $par и $par2";
}
Теперь наша функция на экран ни чего не выводит. Вместо этого она возвращает сформированную строку в точку вызова функции. Можно представить это как будто вместо имени функции со скобками подставляется ее результат выполнения.
Таким образом мы можем сделать так
$res = my_func("Hello", "World");
echo $res;
или так
echo my_func("Hi", "World");
Философия функций
С философской точки зрения функции помогают структурировать код.
Вы можете представить программу как некого помощника, который сидит в компьютере и помогает решить определенную цель. Эта цель делится на задачи (каждая из которых на подзадачи). Чтобы эти задачи решить нужны исполнители. Таким образом функции это исполнители конкретных задач. А основная программа вызывает их, для достижения своей цели.
Продолжаем работу с thesite.loc - ядро системы core.php
Ядром у нас будет файл c core.php в котором будут все основные функции нашей системы (по сути библиотека функций).
Для начала создадим папку sys в корневой папке нашего сайта. А затем в ней файл core.php.
Теперь из начала нашего главного файла вырезаем вот этот код
$request = explode("/", $_SERVER["REQUEST_URI"]);
$page = $request[1];
$ext = $request[2];
и добавляем его в sys/core.php, а затем изменяем его (превращаем в функцию).
function route($item = 1) {
$request = explode("/", $_SERVER["REQUEST_URI"]);
return $request[$item];
}
Теперь нужно подключить файл sys/core.php в файле index.php
define(ROOT, $_SERVER['DOCUMENT_ROOT']);
require(ROOT.'/sys/core.php');
После такой нехитрой конструкции мы сможем вызывать функции определенные в core.php из index.php и всех ниже подключаемых php-файлов.
Давайте же вызовем нашу функцию роутер:
<h1>Это мое PHP-приложение</h1>
<?php
define(ROOT, $_SERVER['DOCUMENT_ROOT']);
require(ROOT.'/sys/core.php');
$page = route(1);
$ext = route(2);
echo 'Запрашиваемая страница: '.$page;
echo '<br />Дополнительные данные: '.$ext;
Обратившись в браузере к http://thesite.loc/qq/ww
(не забываем запустить денвер) мы увидим что все работает. Только теперь мы вынесли код роутера в ядро, а из index.php обращаемся к нему через нашу созданную функцию.
Таким образом мы будем в core.php (и некоторых специальных библиотеках) описывать функции. А уже к ним обращаться из других частей нашего приложения.
Полный код сегодняшнего занятия.
<?php
/*
* This core functions for application
*/
/* Route functions */
function route($item = 1) {
$request = explode("/", $_SERVER["REQUEST_URI"]);
return $request[$item];
}
<h1>Это мое PHP-приложение</h1>
<?php
define(ROOT, $_SERVER['DOCUMENT_ROOT']);
require(ROOT.'/sys/core.php');
$page = route(1);
$ext = route(2);
echo 'Запрашиваемая страница: '.$page;
echo '<br />Дополнительные данные: '.$ext;
switch($page){
case 'login':
echo '<h2>Страница авторизации</h2>';
break;
case 'logout':
echo '<h2>Тут мы разогиваемся</h2>';
break;
case 'register':
echo '<h2>Страница авторизации</h2>';
break;
case 'user':
echo '<h2>Профиь пользователя</h2>';
break;
case 'post':
echo '<h2>Конкретный пост</h2>';
break;
case 'news':
echo '<h2>Страница новостей</h2>';
break;
default:
echo '<h2>Если в запросе указано что-то другое</h2>';
}
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧