Функции
Содержание
Функции, определяемые пользователем
Приведем пример синтаксиса, используемого для описания функций:
Пример #1 Псевдокод для демонстрации использования функций
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Example function.\n";
return $retval;
}
?>
Внутри функции можно использовать любой корректный PHP-код, в том числе другие функции и даже объявления классов.
В PHP 3 функции должны были быть определены прежде, чем они будут использованы. Начиная с PHP 4 такого ограничения нет, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.
В случае, когда функция определяется в зависимости от какого-либо условия, например, как это показано в двух приведенных ниже примерах, обработка описания функции должна предшествовать ее вызову.
Пример #2 Функции, зависящие от условий
<?php
$makefoo = true;
/* Мы не можем вызвать функцию foo() в этом месте,
поскольку она еще не определена, но мы можем
обратиться к bar() */
bar();
if ($makefoo) {
function foo()
{
echo "I don't exist until program execution reaches me.\n";
}
}
/* Теперь мы благополучно можем вызывать foo(),
поскольку $makefoo была интерпретирована как true */
if ($makefoo) foo();
function bar()
{
echo "I exist immediately upon program start.\n";
}
?>
Пример #3 Вложенные функции
<?php
function foo()
{
function bar()
{
echo "I don't exist until foo() is called.\n";
}
}
/* Мы пока не можем обратиться к bar(),
поскольку она еще не определена. */
foo();
/* Теперь мы можем вызвать функцию bar(),
обработка foo() сделала ее доступной. */
bar();
?>
PHP не поддерживает перегрузку функции, также отсутствует возможность переопределить или удалить объявленную ранее функцию.
Замечание: Имена функций регистронезависимы, тем не менее, более предпочтительно вызывать функции так, как они были объявлены.
PHP 3 не поддерживает переменное количество аргументов функции, хотя поддержка значений по умолчанию для аргументов присутствует (смотрите раздел Значения аргументов по умолчанию). Начиная с 4-й версии PHP поддерживает и то, и другое: смотрите раздел Списки аргументов переменной длины и описания функций func_num_args(), func_get_arg(), и func_get_args() для более детальной информации.
- Основы синтаксиса
- Типы
- Переменные
- Константы
- Выражения
- Операторы
- Управляющие конструкции
- Функции
- Классы и объекты
- Пространства имен
- Errors
- Исключения
- Generators
- Ссылки. Разъяснения
- Предопределённые переменные
- Предопределённые исключения
- Встроенные интерфейсы и классы
- Контекстные опции и параметры
- Поддерживаемые протоколы и обработчики (wrappers)
Коментарии
<?php
// Inicializamos el array para almacenar todas las reservas
$reservasCompletas = array();
// Verificamos si el formulario se ha enviado
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Recuperamos los datos del formulario
$hab = $_POST["habitacion"];
$nochesReservadas = (int)$_POST["noches"];
$fechaReserva = $_POST["fecha"];
// Crear un array de reserva individual
$reserva = [
'habitacion' => $hab,
'noches' => $nochesReservadas,
'fecha' => $fechaReserva,
];
// Si ya hay reservas previas, las recuperamos y reconstruimos los arrays
if (!empty($_POST['reservas_previas'])) {
$reservasPrevias = explode(",", $_POST['reservas_previas']);
foreach ($reservasPrevias as $reservaStr) {
// Convertimos cada reserva de cadena a array asociativo
$reservaArray = explode("|", $reservaStr);
$reservasCompletas[] = [
'habitacion' => $reservaArray[0],
'noches' => $reservaArray[1],
'fecha' => $reservaArray[2],
];
}
}
// Añadimos la nueva reserva
$reservasCompletas[] = $reserva;
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reserva de Hotel</title>
</head>
<body>
<h1>Reserva de Habitación</h1>
<form action="" method="post">
<!-- Menú desplegable para seleccionar tipo de habitación -->
<label for="habitacion">Tipo de habitación: </label>
<select name="habitacion" id="habitacion" required>
<option value="Sencilla">Sencilla</option>
<option value="Doble">Doble</option>
<option value="Suite">Suite</option>
</select>
<!-- Campo para la cantidad de noches -->
<label for="noches">Número de noches: </label>
<input type="number" id="noches" name="noches" min="1" step="1" value="1" required>
<!-- Campo para la fecha de llegada -->
<label for="fecha">Fecha de llegada: </label>
<input type="date" id="fecha" name="fecha" required>
<!-- Campo oculto para almacenar las reservas previas, usamos implode para convertir el array en cadena -->
<input type="hidden" name="reservas_previas" value='<?php
// Convertimos las reservas en cadenas usando | para separar valores y , para separar reservas
$reservasStr = array_map(function($reserva) {
return implode("|", $reserva);
}, $reservasCompletas);
echo implode(",", $reservasStr);
?>'>
<!-- Botón para enviar el formulario -->
<button type="submit">Agregar reserva</button>
</form>
<h2>Resumen de la reserva</h2>
<?php if (!empty($reservasCompletas)): ?>
<?php foreach ($reservasCompletas as $reserva): ?>
<p>
Habitación: <?= $reserva['habitacion'] ?> <br>
Noches: <?= $reserva['noches'] ?> <br>
Fecha de llegada: <?= $reserva['fecha'] ?> <br>
</p>
<?php endforeach; ?>
<?php else: ?>
<p>No hay reservas realizadas aún.</p>
<?php endif; ?>
</body>
</html>