В этом уроке мы научимся работать с сигнатурой функции. Также мы узнаем, как функция принимает и возвращает значения. Мы разберем функции abs()
и round()
.
Функция abs()
, которая возвращает абсолютное значение, принимает параметр — число. Если вызывать abs()
без параметров, то PHP выдаст следующее:
TypeError: abs() expects exactly 1 argument, 0 given
Так интерпретатор сообщает, что функция ожидает один параметр, а мы вызвали ее без параметров.
Параметрами abs()
могут быть только числа. Если мы попробуем передать в нее строку, это приведет к следующей ошибке:
TypeError: abs(): Argument #1 ($num) must be of type int|float, string given
Результат вызова этой функции — тоже всегда число. Другая функция может иметь иное число параметров и другие типы параметров. Например, может существовать функция, которая принимает три параметра: число, строку и еще одно число.
Откуда мы знаем, сколько и каких параметров нужно функции abs()
и какого типа будет возврат? Мы посмотрели в сигнатуру этой функции. Сигнатура определяет входные параметры и их типы, а также выходной параметр и его тип.
О функции abs()
можно почитать в официальной документации PHP. В разделе «Описание» есть такой текст:
abs(int|float $num): int|float
Возвращает абсолютное значение num.
Это сигнатура функции и короткое пояснение на русском языке.
Информация расшифровывается так:
abs
Если параметров больше одного, то передавать их можно только в той последовательности, в которой они определены в сигнатуре. Любая функция возвращает всегда только одно значение. Это ограничение существует на уровне языка, и не может нарушаться.
Рассмотрим функцию round()
. Она округляет переданное число:
<?php
$result = round(10.25, 0); // 10
Мы передали в нее два аргумента: число и точность округления. 0
означает, что округление будет до целого значения.
Чаще всего нужно округлять именно до целого числа, поэтому создатели функции round
сделали второй аргумент необязательным и задали ему внутри функции значение по умолчанию 0
. Значит, можно не указывать второй аргумент, а результат будет тем же:
<?php
$result = round(10.25); // 10
А если нужна другая точность, то можно передать аргумент:
<?php
$result = round(10.25, 1); // 10.3
Если функция в PHP принимает необязательные аргументы, то они всегда стоят после обязательных. Их количество может быть любым. Это зависит от самой функции. Но такие аргументы всегда идут рядом и в конце списка аргументов.
Теперь ваша очередь посмотреть на сигнатуру функции в документации и разобраться, как её использовать. Можете читать документацию на русском языке, но программист обязан уметь читать документацию на английском. Используйте словари или переводчики при необходимости. Лучше сразу привыкать и подтягивать навыки чтения на английском, иначе будут сложности в будущем.
В PHP есть функция ucfirst()
. Изучите её сигнатуру на странице https://php.net/manual/ru/function.ucfirst.php.
Напишите программу, которая использует функцию ucfirst()
с переменной $text
и выводит результат на экран. Значение переменной $text
уже определено.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1<?php // phpcs:ignore PSR1.Files.SideEffects
2
3namespace HexletBasics\CallingFunctions\FunctionSignature;
4
5use PHPUnit\Framework\TestCase;
6
7\HexletBasics\Functions\runScript();
8
9class Test extends TestCase
10{
11 public function test()
12 {
13 $expected = 'Mount';
14 $this->expectOutputString($expected);
15 require 'index.php';
16 }
17}
18
Решение учителя откроется через: