Библиотека
7 июля 2021 16:58

PHP для начинающих

Основы PHP

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

1. Привет, Мир!

PHP: Привет, Мир!

По традиции начнём с написания программы “Hello, World!”. Эта программа будет выводить на экран текст:

Hello, World!

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

<?php

echo 'Hello, World!';

Есть и другой способ вывести строку на экран. Для этого используется функция (с этим понятием мы познакомимся позже) print_r(). В этом случае строка указывается в скобках сразу после имени функции. В конце также нужно ставить ;.

<?php

print_r('Hello, World!');

В простых ситуациях между этими конструкциями нет никакой разницы. Можно использовать как один способ вывода, так и другой. В более сложных, там где на экран нужно выводить не просто числа или строки, а, например, массивы — echo не сможет этого сделать, а print_r() всё выведет.

Задание

Наберите в редакторе код из задания символ в символ и нажмите «Проверить».

<?php

print_r('Hello, World!');

Внимание: если вы напишете heLLo, woRld! вместо Hello, World!, то это будет считаться другим текстом, потому что заглавные и строчные буквы — разные символы. Размер буквы называют регистром и говорят: регистр — важен! Это касается почти всего в коде, поэтому привыкайте всегда обращать внимание на регистр.


Советы

2.  Теги

PHP: Теги

PHP — это, вероятно, единственный язык, в котором нельзя начать писать код сразу. Такой код будет воспринят интерпретатором (программой, выполняющей код) как обычный текст. Любой код на PHP должен быть обернут в конструкцию <?php ?>.

<?php — это открывающий тег, а ?> — это закрывающий тег. PHP позволяет не указывать закрывающую часть ?>. А руководство по оформлению кода PSR-12 вообще запрещает её указывать.

Задание

Наберите код из примера, поставьте в начале тег <?php:

<?php

print_r('King in the North!');

Советы

Определения

  • Интерпретатор – программа, выполняющая код, написанный на языке программирования.
3. Комментарии 

PHP: Комментарии

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

Комментарии в PHP бывают двух видов:

Однострочные комментарии

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

Комментарий может занимать всю строчку. Если одной строчки мало, то создаются несколько комментариев:

<?php

// For Winterfell!
// For Lanisters!

Комментарий может находиться на строчке после какого-нибудь кода:

<?php
print_r('I am the King'); // For Lannisters!

Многострочные комментарии

Многострочные комментарии начинаются с /* и заканчиваются на */. Между ними каждая строчка должна начинаться с символа *.

<?php
/*
 * The night is dark and
 * full of terrors.
 */
print_r('I am the King');

Задание

Создайте однострочный комментарий с текстом: You know nothing, Jon Snow!.


Определения

  • Комментарий – текст в коде программы, который не влияет на функциональность, и добавляется программистами для себя и своих коллег.// однострочный комментарий
    /*
    * многострочный комментарий
    * многострочный комментарий
    */
4. Инструкции (Statements)

PHP: Инструкции (Statements)

Инструкция — это команда для компьютера выполнить что-то. Код на PHP — это набор инструкций, которые, как правило, отделяются друг от друга символом ;.

Вот пример кода с двумя инструкциями.

<?php

print_r('Mother of Dragons. ');
print_r('Dracarys!');

При запуске этого кода на экран последовательно выводятся два предложения:

Mother of Dragons. Dracarys!

Теоретически инструкции можно написать последовательно друг за другом без переноса на новую строчку:

<?php

print_r('Mother of Dragons.'); print_r('Drakarys!');

Результат на экране будет таким же, но такой код неудобен для чтения, поэтому инструкции располагают друг под другом.

Почему это важно знать? Инструкция — это единица исполнения. Интерпретатор — программа, которая запускает код на PHP, выполняет инструкции строго по очереди. И мы, как разработчики, должны понимать этот порядок и уметь мысленно разделять программу на независимые части, удобные для анализа.

Задание

Выведите на экран друг за другом три имени: RobertStannisRenly. В результате на экране должно отобразиться:

RobertStannisRenly

Для каждого имени используйте свой собственный вызов print_r().


Советы

Определения

  • Интерпретатор – программа, выполняющая код на PHP.
  • Инструкция (statement) – команда для компьютера, написанная на языке программирования. Код на PHP — это набор инструкций, разделенных (чаще всего) символом ;.
5. Как мы проверяем ваши решения

PHP: Как мы проверяем ваши решения

Наш сайт автоматически проверяет ваши решения. Как это работает?

В самом простом случае, система просто запускает код и смотрит на то, что вывелось на экран. А потом сверяет с тем, что мы «ожидали» по заданию.

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

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

Такой подход называется тестированием, и он используется в реальной повседневной разработке. Обычно программист сначала пишет тест — проверочную программу, а потом уже ту программу, которую хотел написать. В процессе он постоянно запускает тесты и смотрит, приблизился ли он к решению.

Именно поэтому наш сайт говорит «Тесты пройдены», когда вы правильно решили задачу.

Вот простой пример: необходимо распечатать строку Hello, World!. Предположим, вы допустили небольшую ошибку, и функция вывела на экран другое значение. Система ответит примерно так:

  -'Hello, World!'
  +'ello, World!'

  FAILURES!
  Tests: 1, Assertions: 1, Failures: 1.

На экране появляется подсказка. На ней знаком + обозначено то, что распечатал ваш код. Знаком - – то, что ожидалось. Сравнивая эти два значения, можно увидеть ошибку. В примере выше видно, что в выводе пропущена буква H.

Кроме наших тестов, будет крайне полезно экспериментировать с кодом. Для этого можно ипользовать сервис repl.it. Идеально, если вы выполните самостоятельно весь код, который присутствует в уроках.


Иногда в процессе решения будет казаться, что вы сделали все правильно, но система «капризничает» и не принимает решение. Подобное поведение практически исключено. Нерабочие тесты просто не могут попасть на сайт, они автоматически запускаются после каждого изменения. В подавляющем большинстве таких случаев, (а все наши проекты в сумме провели миллионы проверок за много лет), ошибка содержится в коде решения. Она может быть очень незаметной, вместо английской буквы случайно ввели русскую, вместо верхнего регистра использовали нижний или забыли вывести запятую. Другие случаи сложнее. Возможно ваше решение работает для одного набора входных данных, но не работает для другого. Поэтому всегда внимательно читайте условие задачи и вывод тестов. Там почти наверняка есть указание на ошибку.

Однако, если вы уверены в ошибке или нашли какую-то неточность, то вы всегда можете указать на неё. В конце каждой теории есть ссылка на содержимое урока на гитхабе (этот проект полностью открытый!). Перейдя туда, вы можете написать issue, посмотреть содержимое тестов (там видно, как вызывается ваш код) и даже отправить pullrequest. Если для вас это пока тёмный лес, то подключитесь в наше сообщество, там в канале #hexlet-feedback мы всегда поможем.

Задание

Выведите на экран 9780262531962.


Советы

Определения

  • Тесты – специальный код, проверяющий программы на корректность, сверяя правильный результат с реальным.
6. Синтаксические ошибки

PHP: Синтаксические ошибки

Если программа на PHP написана синтаксически некорректно, то интерпретатор выводит на экран соответствующее сообщение, а также указание на файл и строчку в нём, где по его мнению произошла ошибка. Синтаксическая ошибка возникает в том случае, когда код был записан с нарушением грамматических правил. В человеческих языках грамматика важна, но текст с ошибками чаще всего можно понять и прочитать. В программировании всё строго. Любое мельчайшее нарушение — и программа даже не запустится. Примером может быть забытая ;, неправильно расставленные скобки и другие детали.

Вот пример кода с синтаксической ошибкой:

<?php

print_r('Hodor')

Если запустить код выше, то мы увидим следующее сообщение: $ PHP Parse error: syntax error, unexpected end of file in /private/var/tmp/index.php on line 4. Подобные синтаксические ошибки в PHP относятся к разряду “Parse error”. Как видно, в конце приводится путь до файла и номер строчки.

С одной стороны, ошибки “Parse error” — самые простые, потому что они связаны исключительно с грамматическими правилами написания кода, а не с самим смыслом кода. Их легко исправить: нужно лишь найти нарушение в записи.

С другой стороны, интерпретатор не всегда может чётко указать на это нарушение. Поэтому бывает, что забытую скобку нужно поставить не туда, куда указывает сообщение об ошибке.

Задание

Это задание не связано с уроком напрямую. Но будет полезным потренироваться с выводом на экран.

Выведите на экран What Is Dead May Never Die.


Советы

Определения

  • Синтаксическая ошибка – нарушение грамматических правил языка программирования.
  • Parse error (ошибка парсинга) – тип ошибок в PHP, возникающих при наличии синтаксических ошибок в коде.

Арифметика

Изначально языки программирования создавались для математических вычислений. С тех пор многое изменилось, и программы создаются в основном для обслуживания бизнесов, помощи в ежедневной жизни и развлечений. Но в основе работы большинства программ по-прежнему лежат вычисления. Наиболее простая и базовая тема в программировании — арифметика.

7. Арифметические операции

PHP: Арифметические операции

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

Для сложения двух чисел в математике мы пишем, например, 3 + 4. В программировании — то же самое. Вот программа, складывающая два числа:

<?php

// Не забываем точку с запятой в конце, так как каждая строчка в коде — инструкция.
3 + 4;

Помните про комментарии? Выше в коде после символов // — комментарий от учителя.

Арифметика в программировании практически не отличается от школьной арифметики.

Инструкция 3 + 4; заставит интерпретатор сложить числа и узнать результат. Эта программа будет работать, но в ней нет смысла, потому что по сути мы не даём команду интерпретатору, мы просто говорим ему «смотри, сумма трёх и четырёх». В реальной работе недостаточно сообщать интерпретатору о математическом выражении. Например, при создании интернет-магазина недостаточно просить интерпретатор посчитать стоимость товаров в корзине, а нужно просить посчитать стоимость И показать цену покупателю.

Нам нужно попросить интерпретатор сложить 3 + 4 И дать команду сделать что-то с результатом. Например, вывести его на экран:

<?php

// снова не забываем точку с запятой в конце строчки
print_r(3 + 4);

После запуска на экране появится результат:

7

Кроме сложения доступны следующие операции:

Теперь давайте выведем на экран результат деления, а потом результат возведения в степень:

<?php

print_r(8 / 2);  // => 4
print_r(3 ** 2); // => 9

Иногда для удобства мы будем показывать в комментариях результат запуска строчек кода вот так: => РЕЗУЛЬТАТ. Например, // => 4.

Первая инструкция выведет на экран 4 (потому что 8 / 2 это 4), а вторая инструкция выведет на экран 9 (потому что 32 это 9).

Задание

Выведите на экран результат деления числа 81 на 9.


Советы

  • Всегда отбивайте арифметические операторы пробелами от самих чисел (операндов) – это хороший стиль программирования. Поэтому в наших примерах print_r(3 + 4), а не print_r(3+4).
  • Деление на ноль приводит к ошибке Division by zero. Чтобы его не допустить, нужно знать про условные конструкции (о них вы узнаете в следующих уроках).
  • Если в редакторе есть запись // BEGIN и // END, то код нужно писать между этими строчками.
8. Операторы 

PHP: Операторы

Перед тем как двигаться дальше, разберем базовую терминологию. Знак операции, такой как +, называют оператором. Операторы выполняют операции над определенными значениями, которые называются операндами. Сами операторы обычно представлены одним или несколькими символами, реже — словом. Подавляющее большинство операторов соответствуют математическим операциям.

<?php

print_r(8 + 2);

В этом примере + это оператор, а числа 8 и 2 — это операнды.

В случае сложения у нас есть два операнда: один слева от знака +, другой — справа. Операции, которые требуют наличия двух операндов, называются бинарными. Если пропустить хотя бы один операнд, например, так 3 + ;, то программа завершится с синтаксической ошибкой.

Операции бывают не только бинарными, но и унарными (с одним операндом), и даже тернарными (с тремя операндами)! Причем операторы могут выглядеть одинаково, но обозначать разные операции. Символы + и - используются не только как операторы. Когда речь идет про отрицательные числа, то знак минуса становится частью числа:

<?php

print_r(-3); // => -3

Выше пример применения унарной операции к числу 3. Оператор минус перед тройкой говорит интерпретатору взять число 3 и найти противоположное, то есть -3.

Это немного может сбить с толку, потому что -3 — это одновременно и число само по себе, и оператор с операндом, но у языков программирования такая структура.

<?php

// То же самое, что и 4 - 3
print_r(4 + -3); // => 1

То же самое касается плюса:

<?php

print_r(+3); // => 3
print_r(1 + +3); // => 4

Задание

Напишите программу, которая посчитает разность между числами 6 и -81 и выведет ответ на экран.


Советы

Определения

  • Арифметическая операция – сложение, вычитание, умножение и деление.
  • Унарная операция – операция с одним операндом. Например, -3 — унарная операция для получения числа, противоположного числу три.
  • Бинарная операция – операция с двумя операндами. Например, 3 + 9.
9. Коммутативная операция

PHP: Коммутативная операция

Мы все помним со школы: «от перемены мест слагаемых сумма не меняется». Это один из базовых и интуитивно понятных законов арифметики, он называется коммутативным законом.

Бинарная операция считается коммутативной, если, поменяв местами операнды, вы получаете тот же самый результат. Очевидно, что сложение — коммутативная операция: 3 + 2 = 2 + 3.

А вот является ли коммутативной операция вычитания? Конечно, нет: 2 – 3 ≠ 3 – 2. В программировании этот закон работает точно так же, как в арифметике.

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

Задание

Напишите программу, которая считает и последовательно выводит на экран значения следующих математических выражений: «3 в степени 5» и «-8 разделить на -4».

Обратите внимание, что результаты выведутся «слепленными» в одну строчку без пробела. Мы научимся решать эту проблему в будущих уроках.


Определения

  • Коммутативность – свойство операции, когда изменение порядка операндов не влияет на результат. Например, сложение — коммутативная операция: от перемены мест слагаемых сумма не меняется.
10. Композиция операций

PHP: Композиция операций

А что, если понадобится вычислить такое выражение: 3 * 5 - 2? Именно так мы и запишем:

<?php

print_r(3 * 5 - 2); // => 13

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

Или другой пример:

<?php

print_r(2 * 4 * 5 * 10); // 2 * 4 * 5 * 10 = 8 * 5 * 10 = 40 * 10 => 400

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

Чтобы представить себе то, как происходят вычисления внутри интерпретатора, давайте разберем пример: 2 * 4 * 5 * 10.

  1. Сначала вычисляется 2 * 4 и получается выражение 8 * 5 * 10.
  2. Затем 8 * 5. В итоге имеем 40 * 10.
  3. В конце концов происходит последнее умножение, и получается результат 400.

Задание

Реализуйте программу, которая вычисляет и выводит на экран значение выражения:

8 / 2 + 5 - -3 / 2

Не вычисляйте ничего самостоятельно, ваша программа должна производить все вычисления сама.

11. Приоритет 

PHP: Приоритет

Посмотрите внимательно на выражение 2 + 2 * 2 и посчитайте в уме ответ.

Правильный ответ: 6.

Если у вас получилось 8, то этот урок для вас. В школьной математике мы изучали понятие «приоритет операции». Приоритет определяет то, в какой последовательности должны выполняться операции. Например, умножение и деление имеют больший приоритет, чем сложение и вычитание, а приоритет возведения в степень выше всех остальных арифметических операций: 2 ** 3 * 2 вычислится в 16.

Но нередко вычисления должны происходить в порядке, отличном от стандартного приоритета. В сложных ситуациях приоритет можно (и нужно) задавать круглыми скобками, точно так же, как в школе, например: (2 + 2) * 2.

Скобки можно ставить вокруг любой операции. Они могут вкладываться друг в друга сколько угодно раз. Вот пара примеров:

  <?php

 print_r(3 ** (4 - 2)); // => 9
 print_r(7 * 3 + (4 / 2) - (8 + (2 - 1))); // => 14

Главное при этом соблюдать парность, то есть закрывать скобки в правильном порядке. Это, кстати, часто становится причиной ошибок не только у новичков, но и у опытных программистов. Для удобства ставьте сразу открывающую и закрывающую скобку, а потом пишите внутреннюю часть. Редактор на нашем сайте (и большинство других редакторов кода) делают это автоматически: вы пишете (, а редактор сразу добавляет ). Это касается и других парных символов, например, кавычек. О них — в будущих уроках.

Иногда выражение сложно воспринимать визуально. Тогда можно расставить скобки, не повлияв на приоритет. Например, задание из прошлого урока можно сделать немного понятнее, если расставить скобки.

Было:

<?php

print_r(8 / 2 + 5 - -3 / 2); // => 10.5

Стало:

<?php

print_r(((8 / 2) + 5) - (-3 / 2)); // => 10.5

Запомните: код пишется для людей, потому что код будут читать люди, а машины будут только исполнять его. Для машин код — или корректный, или не корректный, для них нет «более» понятного или «менее» понятного кода. Явная расстановка приоритетов упрощает чтение вашего кода другими разработчиками.

Задание

Дано вычисление 70 * 3 + 4 / 8 + 2.

Расставьте скобки так, чтобы оба сложения (3 + 4) и (8 + 2) высчитывались в первую очередь. Выведите на экран результат.


Советы

12. Линтер 

PHP: Линтер

Теперь, когда мы уже научились писать простые программы, можно немного поговорить о том, как их писать.

Код нужно оформлять определённым образом, чтобы он был достаточно понятным и простым в поддержке. Специальные наборы правил — стандарты — описывают различные аспекты написания кода. Конкретно в PHP самым распространенными являются стандарты PSR (PHP Standards Recommendations или стандартные рекомендации PHP) от PHP-FIG. Рекомендация представляет из себя набор правил, призванных облегчить определённую сторону разработки (или решить какую-то определённую проблему). На текущий момент существует несколько утверждённых рекомендаций, каждая из них обозначена цифрой: PSR-1, PSR-2, PSR-3 и другие. Со всеми этими рекомендациями вы будете постепенно знакомиться во время обучения и работы. Сейчас же остановимся на двух основных:

  • PSR-1: Basic Coding Standard (Базовый стандарт написания кода). Это набор правил, определяющих, как следует оформлять программный код: как писать теги PHP, по каким правилам именовать классы, методы и константы классов. Он также затрагивает вопросы кодировки, автозагрузки, пространства имён и разделения ответственности между файлами. Это базовые правила, стандарт PSR-12 их расширяет.
  • PSR-12: Extended Coding Style (Расширенный стандарт стиля кодирования, заменяет и дополняет устаревший PSR-2). Во-первых, этот стандарт требует выполнения правил PSR-1. Во-вторых, он добавляет множество новых требований: к отступам, файлам, строкам, ключевым словам, классам, управляющим конструкциям, области видимости и другим элементам.

В любом языке программирования существуют специальные инструменты, так называемые линтеры, которые проверяют код на соответствие стандартам. Повсеместно используемым линтером в PHP является PHP_CodeSniffer.

Допустим, у нас есть файл с таким PHP-кодом:

<?php

// На следующей строке отступ равен одному табу
  print_r (((8 / 2) + 5) - (-3 / 2));

?>

При проверке файла линтер найдёт следующие ошибки:

  • Spaces must be used to indent lines; tabs are not allowed — PSR-12 рекомендует делать отступ размером в четыре пробела, а в примере выше использована табуляция
  • A closing tag is not permitted at the end of a PHP file — стандарт содержит требование опускать завершающий тег ?>
  • Space before opening parenthesis of function call prohibited — при вызове функции между именем функции и круглыми скобками не должно быть пробельных символов, а в проверяемом коде после имени print_r стоит один пробел

Исправим код, убрав закрывающий тег, отступы и пробел после имени функции:

<?php

print_r(((8 / 2) + 5) - (-3 / 2)); // => 10.5

Этот вариант уже не нарушает правил, и линтер будет «молчать».

Не «пугайтесь» обилию рекомендаций и правил. Большинство правил просты и понятны. Скорее всего, вы и так будете интуитивно придерживаться их в коде. С остальными вам помогут справиться время, опыт и линтер 😉

Задание

Проанализируйте этот код:

<?php

print_r (3 ** (4 - 2));

В нём нарушено одно правило, которое мы рассмотрели в предыдущем примере. Перепишите код, исправив ошибку стиля.

Сайт сейчас не будет проверять ваш код линтером, но в ваших будущих практиках на Хекслете и в реальной разработке линтер будет работать и сообщать вам о нарушениях.

Строки

Текст в программировании называется «строками», и эта тема не так проста, как может показаться. Экранирование, управляющие символы и другие аспекты нередко заводят в ступор начинающих разработчиков.

13. Кавычки 

PHP: Кавычки

'Hello'
'Goodbye'

'G'
' '
''

Какие из этих пяти вариантов — строки?

С первыми двумя всё понятно, это точно строки, мы уже работали с подобными конструкциями и говорили, что строки – это наборы символов.

Любой одиночный символ в кавычках — это строка. Пустая строка '' — это тоже строка. То есть строкой мы считаем всё, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов.

Ранее в уроках мы записывали строки в одинарных кавычках, но это не единственный способ. Можно использовать и двойные:

<?php

print_r("Dracarys!");

Представьте, что вы хотите напечатать строчку dragon’s mother. Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:

<?php

print_r('Dragon's mother');
// PHP Parse error: syntax error, unexpected 's' (T_STRING), expecting ',' or ')'

Такая программа не будет работать. С точки зрения PHP строчка началась с одинарной кавычки, а потом закончилась после буквы n. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: ');. Этот код синтаксически некорректен (это видно даже по тому, как подсвечен код).

Здесь нам помогут двойные кавычки. Такой вариант программы отработает корректно:

<?php

print_r("Dragon's mother");

Теперь интерпретатор знает, что строка началась с двойной кавычки — значит и завершиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки.

Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причём количество кавычек внутри самой строки не важно.

А что, если мы хотим создать такую строку:

Dragon's mother said "No"

В ней есть и одинарные, и двойные кавычки. Как быть в этой ситуации? Нужно каким-то образом указать интерпретатору считать каждую кавычку частью строки, а не началом или концом.

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

<?php

// Экранируется только ", так как в этой ситуации
// двойные кавычки имеют специальное значение
print_r("Dragon's mother said \"No\"");
// => Dragon's mother said "No"

Посмотрите внимательно: нам нужно было добавить \ для двойных кавычек, но не для одинарной (апостроф), потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.

<?php

// \ выводится, если после него идет обычный,
// а не специальный символ
print_r("Death is \so terribly final");
// => Death is \so terribly final

А что, если нужно вывести сам обратный слеш? Точно так же, как и любой другой специальный символ, его надо экранировать самим собой.

<?php

print_r("\\");
// => \

Вопрос на самопроверку, что выведет этот код?

<?php

print_r("\\ \\ \\\\ \\\ \'\"");

Задание

Напишите программу, которая выведет на экран:

"Khal Drogo's favorite word is "athjahakar""

Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы:

"Khal Drogo's favorite word is "athjahakar""
14. Экранирующие последовательности

PHP: Экранирующие последовательности

Мы хотим показать диалог Матери Драконов со своим ребенком:

- Are you hungry?
- Aaaarrrgh!

Если вывести на экран строку с таким текстом:

<?php

print_r("- Are you hungry?- Aaaarrrgh!");

то получится так:

- Are you hungry?- Aaaarrrgh!

Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: \n.

<?php

print_r("- Are you hungry?\n- Aaaarrrgh!");

результат:

- Are you hungry?
- Aaaarrrgh!

\n — это специальный символ. В литературе его часто обозначают как LF (Line Feed). Возможно вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа \ и n, но это не так. С точки зрения компьютера — это один невидимый символ перевода строки. Доказательство:

<?php

// Мы это не изучали, но вы должны знать правду
// Ниже код, который возвращает длину строки
strlen("a");    // 1
strlen("\n");   // 1 !!!
strlen("\n\n"); // 2 !!!

Почему так сделано? \n — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый. Именно поэтому и возникла такая задача. Нужно было как то представить его на клавиатуре. А поскольку количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений.

Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter. Во многих редакторах есть опция, позволяющая включить отображение невидимых символов — с её помощью можно понять, где они находятся (хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые):

- Привет!¶
- О, привет!¶
- Как дела?

Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

\n — это пример экранирующей последовательности (escape sequence). Их ещё называют управляющими конструкциями. Хотя таких символов не один десяток, в программировании часто встречаются всего несколько подобных символов. Кроме перевода строки, к ним относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать перевод строки \n для правильного форматирования текста.

<?php

print_r("Gregor Clegane\nDunsen\nPolliver\nChiswyck");

Внимание! Экранирующие последовательности вроде \n работают только внутри двойных кавычек!

На экран выведется:

Gregor Clegane
Dunsen
Polliver
Chiswyck

Обратите внимание на следующие моменты:

  1. Не имеет значения, что стоит перед или после \n: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.
  2. Помните, что строка может содержать один символ или вообще ноль символов. А ещё строка может содержать только \n. Проанализируйте следующий пример:
    <?php
    
    print_r('Gregor Clegane');
    print_r("\n");
    print_r('Dunsen');
    

    Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:

    Gregor Clegane
    Dunsen
    
  3. Если нам понадобится вывести \n именно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив ещё один \ в начале. То есть последовательность \\n отобразится как символы \ и n, идущие друг за другом.
<?php

print_r("Joffrey loves using \\n");

на экран выйдет:

Joffrey loves using \n

Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине в среде разработчиков принято всегда использовать \n без \r, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n.

Задание

Напишите программу, которая выводит на экран:

- Did Joffrey agree?
- He did. He also said "I love using \n".

При этом программа использует только один print_r(), но результат на экране должен выглядеть в точности как показано выше.


Советы

Определения

  • Экранирующая последовательность – специальная комбинация символов в тексте. Например, \n – это перевод строки.
15. Конкатенация 

PHP: Конкатенация

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

Мы уже знаем о математической операции сложения. Такая программа:

<?php

print_r(5 + 3);

выведет на экран 8 — результат работы бинарного оператора + с операндами 5 и 3.

Можно «сложить» две строки. Такая программа:

<?php

print_r('Dragon' . 'stone');

выведет на экран Dragonstone — результат работы бинарного оператора . с операндами ‘Dragon’ и ‘stone’.

Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой.

Вот ещё несколько примеров:

<?php

print_r('Kings' . 'wood');     // => Kingswood

print_r('Kings' . 'road');     // => Kingsroad

print_r("King's" . 'Landing'); // => King'sLanding

Как видите, строки можно склеивать, даже если они записаны с разными кавычками.

В последнем примере название города получилось с ошибкой: King’s Landing нужно писать через пробел! Но в наших начальных строках не было пробелов, а пробелы в самом коде слева и справа от символа . не имеют значения, потому что они не являются частью строк.

Выхода из этой ситуации два:

<?php

// Ставим пробел в левой части
print_r("King's " . 'Landing'); // => King's Landing

// Ставим пробел в правой части
print_r("King's" . ' Landing'); // => King's Landing

Пробел — такой же символ, как и другие, поэтому сколько пробелов поставить в строке — столько и получится:

<?php

print_r("King's " . ' Landing');   // => King's  Landing

print_r("King's  " . '  Landing'); // => King's    Landing

Задание

Выведите на экран

Winter came for the House of Frey.

используя конкатенацию слов.


Определения

  • Конкатенация – операция соединения двух строк. Например, print_r("King's " . ' Landing')
16. Кодировка 

PHP: Кодировка

На самом глубоком уровне компьютер оперирует исключительно цифрами 0 и 1. Это так называемый двоичный код, а единички и нули называются битами, от “binary digit” — «двоичная цифра».

Обычные, привычные нам числа в десятичной системе счисления, закодированы с помощью двоичных чисел:

  • 0 ← 0
  • 1 ← 1
  • 2 ← 10
  • 3 ← 11
  • 4 ← 100
  • 5 ← 101

Но как быть с текстом? Компьютер на самом деле не знает ничего о буквах, знаках пунктуации и прочих текстовых символах. Все эти символы также закодированы числами.

Можно взять английский алфавит и дать каждой букве число, начиная с единицы по порядку:

  • a ← 1
  • b ← 2
  • c ← 3
  • d ← 4
  • z ← 26

В этом заключается суть кодировок.

Далее можно научить компьютер понимать эту таблицу и переводить текст в числа и наоборот — числа в текст:

  • hello → 8 5 12 12 15
  • 7 15 15 4 → good

Подобные таблицы, в которых сопоставляются буквы и числа, называются кодировками. Кроме букв алфавита, в таблицы кодировок входят знаки препинания и другие полезные символы. Вы наверняка сталкивались с кодировками, например, ASCII или UTF-8.

Разные кодировки содержат разное количество символов. Изначально небольших таблиц вроде ASCII было достаточно для большинства задач. Но в ней есть только латинские буквы, несколько простых символов вроде % и ?, и специальные управляющие символы типа перевода строки.

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

Сегодня в большинстве случаев используется один из вариантов юникода – utf-8. Он включает в себя знаки почти всех письменных языков мира. Благодаря этому письмо, сформированное человеком в Китае на китайском, без проблем можно открыть и увидеть в первозданном виде на компьютере в Финляндии (поймет он его или нет, это уже другой вопрос).

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

Задание

В PHP можно «запросить» и вывести на экран любой символ из кодировки ASCII. Например:

<?php

print_r(chr(63));

На экран выведется символ с номером 63 — вопросительный знак ?. Таким способом можно выводить любой символ.

Найдите в интернете таблицу кодов ASCII. Можно использовать запросы типа “ascii codes table” или «коды ascii». Обычно в таких таблицах коды указаны сразу в нескольких системах счисления: десятичной, двоичной, восьмеричной и шестнадцатеричной. Нас интересует десятичный код (dec или decimal).

Используя пример выше и найденную таблицу, выведите на экран ~^%.

(Конечно, можно «обмануть» тесты и просто сделать print_r('~^%'), но так будет совсем неинтересно 🙂


Определения

  • Кодировка – набор символов, закодированных с помощью чисел для представления текста в электронном виде.

Типы данных

PHP — язык со слабой типизацией и неизменяемыми примитивными типами данных. О том, что это значит, вы узнаете в текущем модуле.

17. Типы данных

PHP: Типы данных

Бывают разные способы представлять данные в программах.

Есть строки — наборы символов в кавычках, вроде "Hello, World!". Есть целые числа — например, 7-1980. Это две разные категории информации — два разных типа данных.

Операция умножения имеет смысл для целых чисел, но не имеет смысла для строк: умножать слово «мама» на слово «блокнот» — бессмыслица.

Тип данных определяет, что можно делать с элементами конкретного множества элементов

Язык программирования распознает типы. Поэтому PHP не позволит нам умножать строку на строку («умножать текст на текст»). Но позволит умножать целое число на другое целое число. Наличие типов и таких ограничений в языке защищает программы от случайных ошибок.

В отличие от строк, числа оборачивать в кавычки не нужно. Чтобы напечатать число 5, достаточно написать:

<?php

print_r(5);

Обратите внимание, что число 5 и строка '5' — совершенно разные вещи, хотя вывод у print_r для этих данных идентичный.

Целые числа (134-19 и т.д.) и рациональные числа (1.31.0-14.324 и т.д.) — это два отдельных типа данных. Такое разделение связано с особенностями устройства компьютеров. Есть и другие типы, с ними мы познакомимся позже.

Вот ещё один пример, но уже с рациональным числом:

<?php

print_r(10.234);

Типы данных «строка», «целое число» и «рациональное число» — это примитивные типы, они встроены в сам язык PHP. В язык встроены также и некоторые составные типы данных, но пока мы будем работать только с примитивными. Программисты также могут создавать собственные типы данных.

(По-английски строки в программировании называются “strings”, а строчки текстовых файлов называются “lines”. Например, в коде выше есть три строчки (lines), и нет никаких строк (strings). В русском иногда может быть путаница, поэтому во всех уроках мы будем говорить строка для обозначения типа данных «строка», и строчка для обозначения строчек (lines) в файлах).

Задание

Выведите на экран число -0.304.


Советы

Определения

  • Тип данных – множество данных в коде (разновидность информации). Тип определяет, что можно делать с элементами конкретного множества. Например, целые числа, рациональные числа, строки — это разные типы данных.
  • Примитивные типы данных – простые типы, встроенные в сам язык программирования.
  • Строка (string) – тип данных, описывающий набор символов (иными словами — текст); например, 'text' или "text".
18. Слабая типизация

PHP: Слабая типизация

Нам известно про два разных типа данных: числа и строки. Мы, например, могли складывать числа, потому что операция сложения — это операция для типа «числа».

А что, если применить эту операцию не к двум числам, а к числу и строке?

print_r(1 + '7'); // => 8

Несмотря на то, что '7' — это строка, а не число, интерпретатор PHP выдал ответ 8, как если бы мы складывали два числа. Когда PHP видит несоответствие типов, он сам пытается преобразовать информацию. В данном случае он преобразовал строку '7' в число 7, а потом спокойно сложил 1 и 7.

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

В языках со строгой типизацией сложить число со строкой не получится.

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

Такое автоматическое неявное преобразование типов с одной стороны и правда удобно. Но на практике это свойство языка создает множество ошибок и проблем, которые трудно найти. Код может иногда работать, а иногда не работать — в зависимости от того, «повезло» ли в конкретном случае с автоматическим преобразованием. Программист это заметит не сразу.

В дальнейших заданиях вы будете встречаться с таким поведением не раз. Часто будет возникать вопрос «почему мой код работает не так, как я ожидаю?».

Слабая типизация красной нитью проходит сквозь всю разработку на PHP.

Задание

Выведите на экран результат выражения: 7 - (-8 - -2). Попробуйте сделать число 7 не числом, а строкой. Поэкспериментируйте с другими числами тоже.

19. Явное преобразование типов

PHP: Явное преобразование типов

Преобразование типов довольно частая операция в веб-разработке. С одной стороны, для её выполнения можно полагаться на слабую типизацию, с другой — во многих ситуациях лучше делать преобразование явно, используя специальный синтаксис. Такой код понятнее и предсказуемее.

<?php

// Примеры немного искусственные. В реальности этот механизм становится полезен при использовании переменных
print_r((string) 5);
print_r((int) '345');

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

Преобразование типов можно использовать внутри составных выражений:

<?php

// Дополнительные скобки помогают визуально отделить части выражения друг от друга
print_r('Это ' . ((string) 5));
  Это 5

В более сложных ситуациях (при использовании функций, которые проходятся позже) встречаются множественные преобразования: (string) (5 + ((int) '4')). Порядок вычисления этого выражения следующий:

<?php

(int) '4';  // 4
5 + 4;      // 9
(string) 9; // '9'

Задание

Выведите на экран строку 2 times, полученную из числа 2 и строки times, используя преобразования типов и конкатенацию.

Переменные

Информацию можно помещать в специальные «хранилища», а потом использовать сколько угодно раз. Эти хранилища называются переменными, и они помогают упростить код и сократить лишние повторения.

20. Что такое переменная

PHP: Что такое переменная

Представьте себе задачу: нам нужно напечатать на экран фразу Father! два раза или даже пять раз. Эту задачу можно решить в лоб:

<?php

print_r('Father!');
print_r('Father!');

В простейшем случае так и стоит поступить, но если фраза Father! начнет использоваться чаще, да ещё и в разных частях программы, то придётся её везде повторять. Проблемы с таким подходом начнутся тогда, когда понадобится изменить нашу фразу, а такое происходит довольно часто. Нам придётся найти все места, где использовалась фраза Father! и выполнить необходимую замену. А можно поступить по-другому. Вместо копирования нашего выражения достаточно создать переменную с этой фразой.

<?php

// greeting - переводится как приветствие
$greeting = 'Father!';
print_r($greeting);
print_r("\n");
print_r($greeting);

В строчке $greeting = 'Father!' – происходит присваивание значения 'Father!' переменной с именем $greeting. В PHP имена переменных начинаются со знака $. В итоге переменная указывает на данные, которые были в неё записаны.

Когда переменная создана, можно начать её использовать. Она подставляется в те места, где раньше стояла наша фраза. Во время выполнения интерпретатор (программа, которая выполняет код на PHP), доходит до строчки print_r($greeting); и подставляет вместо переменной её содержимое, а затем выполняет код. В результате вывод нашей программы будет таким:

  Father!
  Father!

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

Количество создаваемых переменных никак не ограничено, большие программы содержат десятки и сотни тысяч имен переменных:

<?php

$greeting1 = 'Father!';
print_r($greeting1);
print_r($greeting1);

$greeting2 = 'Mother!';
print_r($greeting2);
print_r($greeting2);

Для удобства анализа программы переменные принято создавать как можно ближе к тому месту, где они используются.

Задание

Создайте переменную с именем $motto и содержимым What Is Dead May Never Die!. Распечайте содержимое переменной.


Определения

  • Переменная – способ сохранить информацию и дать ей имя для последующего использования в коде.
21. Изменение переменной

PHP: Изменение переменной

Само слово «переменная», говорит о том, что её можно менять. И действительно, с течением времени внутри программы значения переменных могут изменяться.

<?php

// greeting - переводится как приветствие
$greeting = 'Father!';
print_r($greeting);
print_r($greeting);

$greeting = 'Mother!';
print_r($greeting);
print_r($greeting);

Имя осталось тем же, но внутри другие данные. Следует заметить, что переменные в PHP не требуют специального объявления. Вместо этого переменная объявляется при первом её использовании в программе.

Переменные – мощная, и в то же время опасная вещь. Никогда нельзя быть точно уверенным, что внутри неё записано, не проанализировав код, который находится перед переменной. Именно этим занимаются разработчики во время отладки, когда пытаются разобраться, почему программа не работает, или работает не так, как задумано.

Как вы увидите позже, в PHP есть не только переменные. Более того, переменные не так часто используются с целью их менять. Намного чаще их используют с целью хранить.

Задание

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


Советы

  • Если в редакторе есть запись // BEGIN и // END, то код нужно писать между этими строчками.

Определения

  • Переменная – способ сохранить информацию и дать ей имя для последующего использования в коде.
22. Выбор имени переменной

PHP: Выбор имени переменной

Представим себе, что программа из прошлого урока выглядит так:

<?php

$x = 'Father!';
print_r($x);
print_r($x);

Она по прежнему работает, но в ней изменилось имя переменной на $x. Компьютеру без разницы, как мы называем переменные — это просто бездушная машина, но вот программистам — нет. Мы гораздо чаще читаем код, чем пишем. Причём не свой, а написанный другими людьми. От качества и понятности имён переменных зависит половина успеха в анализе кода.

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

Среди разработчиков есть шутка: «самое сложное в программировании — названия переменных и инвалидация кеша». Придумывать названия и правда сложно. Как бы вы назвали переменную, в которой хранится количество неоплаченных заказов от клиентов, имеющих задолженность в предыдущем квартале?

Самопроверка. Придумайте название для переменной, в которой будет храниться «количество братьев и сестёр короля». Запишите его в блокноте или отправьте себе на почту. Не указывайте там ничего, кроме названия переменной. А через несколько уроков мы вернёмся к этой теме 😉

Задание

Создайте переменную, описывающую количество моих братьев, и присвойте ей значение 2. Распечатайте содержимое переменной. Затем сравните своё имя с именем, которое используется в учительском решении.


Советы

23. Ошибки при работе с переменными

PHP: Ошибки при работе с переменными

Главное правило: переменная должна быть объявлена до её использования. Если сделать это позже, то программа просто не заработает.

<?php

print_r($greeting);
$greeting = 'Father!';

Запуск программы выше завершается с ошибкой PHP Notice: Undefined variable: greetingUndefined variable — это ошибка обращения. Она означает, что в коде используется имя (говорят идентификатор), который не определен. Причём в самой ошибке явно указан индентификатор переменой: greeting. Кроме неправильного порядка определения, в PHP встречаются банальные опечатки — как при использовании переменной, так и во время её объявления.

Количество подобных ошибок уменьшается за счёт использования правильно настроенного редактора. Такой редактор подсвечивает имена, которые используются без объявления, и предупреждает о возможных проблемах.

Задание

Найдите в программе необъявленную переменную и объявите её, присвоив ей значение 'Dragon'.

24. Выражения в определениях

PHP: Выражения в определениях

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

Для начала переведем 50 евро в доллары. Допустим, что один евро равен 1.25 доллара:

<?php

$dollarsCount = 50 * 1.25;
print_r($dollarsCount);

В предыдущем уроке мы записывали в переменную конкретное значение. А здесь в $dollarsCount = 50 * 1.25; справа от знака равно находится выражение. Интерпретатор вычислит результат — 62.5 — и запишет его в переменную. С точки зрения интерпретатора не важно, что перед ним: 62.5 или 50 * 1.25, для него оба варианта — выражения, которые надо вычислить. И они вычисляются в одно и то же значение — 62.5.

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

<?php

62.5             // 62.5
50 * 1.25        // 62.5
120 / 10 * 2     // 24
(int) '100'      // 100

"hello"          // "hello"
"Good" . "will"  // "Goodwill"

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

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

Основываясь на сказанном выше, подумайте, сработает ли такой код?

<?php

$who = "dragon's" . 'mother';
print_r($who);

Запустите его на repl.it и поэкспериментируйте.

Вернемся к нашей валютной программе. Запишем стоимость доллара в рублях как отдельную переменную. Вычислим цену 50 евро в долларах, умножив их на 1.25. Допустим, что 1 доллар — 60 рублей:

<?php

$rublesPerDollar = 60;
$dollarsCount = 50 * 1.25; // 62.5
$rublesCount = $dollarsCount * $rublesPerDollar; // 3750

print_r($rublesCount);

А теперь давайте добавим к выводу текст с помощью конкатенации:

<?php

$rublesPerDollar = 60;
$dollarsCount = 50 * 1.25; // 62.5
$rublesCount = $dollarsCount * $rublesPerDollar; // 3750

print_r('The price is ' . $rublesCount . ' rubles');
The price is 3750 rubles

Любая переменная может быть частью любого выражения. В момент вычисления вместо имени переменной подставляется её значение.

Интерпретатор вычисляет значение $dollarsCount до того, как эта переменная начнёт использоваться в других выражениях. Когда подходит момент использования переменной, PHP «знает» значение, потому что уже вычислил его.

Задание

Напишите программу, которая берёт исходное количество евро из переменной $eurosCount, переводит евро в доллары и выводит значение на экран. Затем программа полученное значение переводит в рубли и выводит результат на новой строчке.

Пример вывода для 100 евро:

125
7500

Считаем, что:
– 1 евро = 1.25 долларов
– 1 доллар = 60 рублей


Советы

  • Для перевода строчки можно использовать \n между выводом долларов и рублей.
25. Переменные и конкатенация

PHP: Переменные и конкатенация

Для закрепления предыдущей темы попробуем использовать переменные с конкатенацией. Синтаксически ничего не меняется: мы умеем конкатенировать (склеивать) две строки:

<?php

$what = "Kings" . "road";
print_r($what); // => "Kingsroad"

… а значит сумеем конкатенировать строку и одну переменную, в которой записана строка:

<?php

$first = "Kings";
$what = $first . "road";

print_r($what); // => "Kingsroad"

… и даже конкатенировать две переменные, в которых записаны строки:

<?php

$first = "Kings";
$last = 'road';

$what = $first . $last;
print_r($what); // => "Kingsroad"

Задание

Сайты постоянно посылают письма своим пользователям. Типичная задача — сделать автоматическую отправку персонального письма, где в заголовке будет имя пользователя. Если где-то в базе сайта хранится имя человека в виде строки, то задача генерации заголовка сводится к конкатенации: например, нужно склеить строку Здравствуйте со строкой, где записано имя.

Напишите программу, которая будет генерировать заголовок и тело письма, используя уже готовые переменные, и выводить получившиеся строки на экран.

Для заголовка используйте переменные $firstName и $greeting, запятую и восклицательный знак. Выведите это на экран в правильном порядке.

Для тела письма используйте переменные $info и $intro, при этом второе предложение должно быть на новой строке.

Результат на экране будет выглядеть так:

Hello, Joffrey!
Here is important information about your account security.
We couldn't verify you mother's maiden name.

Выполните задание, используя только два print_r().


Советы

  • Подумайте, с какой строкой и в каком порядке нужно склеивать переменные, чтобы получить такой двустрочный вывод тела письма.
  • Помните, что можно создать строку, которая содержит только управляющую последовательность \n.
26. Именование переменных

PHP: Именование переменных

$greeting — пример простого имени, но не все имена так просты. Довольно часто они составные, то есть включают в себя несколько слов. Например, «имя пользователя». В разных языках применяются разные стили кодирования, и имя переменной будет отличаться.

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

  • kebab-case — составные части переменной разделяются дефисом. Например: my-super-var.
  • snakecase — для разделения используется подчеркивание. Например: `mysuper_var`.
  • CamelCase — каждое слово в переменной пишется с заглавной буквы. Например: MySuperVar.
  • lowerCamelCase — каждое слово в переменной пишется с заглавной буквы, кроме первого. Например: mySuperVar.

В PHP используется CamelCase и его вариация lowerCamelCase, при котором первая буква первого слова — строчная. Именно lowerCamelCase применяется для переменных. Это значит, что имена соединяются друг с другом, при этом все имена кроме первого становятся с заглавной буквы: $userName. С тремя словами это выглядит так: $mySuperVariable.

Другое общепринятое правило гласит: не используйте транслит для имён, только английский язык. Если вы испытываете сложности с английским, то пользуйтесь переводчиком. Со временем, копаясь в чужом коде, вы сформируете правильные понятия для именования.

Названия должны не только передавать смысл, но и соответствовать синтаксическим правилам, которые обычно никак не проверяются на уровне языка, но нужны во время разработки. Процесс написания программ в современном мире — коллективная работа, и для лучшего взаимодействия в команде код пишется в едином стиле, как если бы над ним работал один человек. В каждом языке свои правила. В PHP долгое время творился хаос. Да и сам язык соткан из противоречий, причём не только в названиях. С этим вы столкнетесь и в следующих уроках, и в реальной работе. Относительно недавно в PHP появился общепринятый стандарт кодирования, к которому все так или иначе стремятся. Подобные стандарты описывают множество аспектов. Советуем с самого начала завести привычку заглядывать в стандарт и писать код в соответствии с ним.

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

Задание

Создайте две переменные с именами «первое число» и «второе число» на английском языке, используя lowerCamelCase. Запишите в первую переменную число 1.10, во вторую — -100. Выведите на экран произведение чисел, записанных в получившиеся переменные.

Код будет работать с любыми названиями, а наша система всегда проверяет только результат на экране, поэтому выполнение этого задания — под вашу ответственность.


Определения

  • Стандарт кодирования – набор синтакстических и стилистических правил написания кода.
27. 

Контент

Серия публикаций:

Программирование и веб-разработка

Добавить комментарий

Belarusian BE Kazakh KK Russian RU Ukrainian UK
Авторизация
*
*
Регистрация
*
*
*
*
Открытый профиль общедоступен. (это не распространяется на вкладки вашего личного кабинета). Закрытый профиль закрывает все возможности найти или увидеть ваш личный кабинет посторонним. В любой момент, вы сможете изменить этот параметр в настройках личного кабинета.
Генерация пароля
логотип
Рекомендуем

Total Flow

Рекомендуем

Все самое интересное (Статьи)

Рекомендуем

Все самое вкусное (Рецепты)