Структура и синтаксис PHP (выжимка)

 

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

 

elephant

 

Сперва хочу дать ссылку на официальную документацию (на русском)

Используйте её как единственный верный источник информации о PHP, все что написано ниже – это моя логическая выжимка по структуре и синтаксису PHP с моими комментариями.

1. Комментарии

 

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

 

 

С помощью “//” и “/* */” можно сделать интересный трюк – «комментарий переключатель»

 

 

Сейчас закомментирована строка « echo «Два»; », но если удалить один слеш в первой строке (//*), то закомментируется первая строка и раскомментируется вторая. Выходит, с помощью удаление одного слеша, мы переключаем, какой блок занесен в комментарий, а какой нет.

 

 

2. Размещение скрипта в HTML

 

Скрипт размещается в следующих тегах:

 

или в

 

 

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

 

В PHP поддерживается 8-емь типов данных:

  • bool – логическое значение TRUE или FALSE
  • int — целые числа
  • float или double – дробные числа
  • string – строки
  • array – массивы
  • object – объекты

 

так же еще есть  два специальных:

  • resource – для дескрипторов ресурсов
  • NULL – для неинициализированных значений

 

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

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

Пример явного приведения типа:

 

 

Но это не значит, что $i и $j всегда будет заданного в скобках типа, они будут иметь данный тип только в том месте, где вы это укажете. Например, если после этого, я присвою $i значение 10.0, то переменная поменяет тип  c int на double.

P.S. Узнать тип данных можно с помощью функции gettype(имя_переменной) 

 

С PHP 5 стало возможно явно указывать тип аргументов функции (или методов), делается это как и в С/C++, перед аргументам указываем его тип, пример:

 

 

Если мы вызовем функцию f с аргументом отличного типа от array (массив), то интерпретатор выведет ошибку:

«Catchable fatal error: Argument 1 passed to f() must be an array, тип_аргумента_который_вы_использовали given, called in …»

 

 

4. Переменные

 

Обозначение переменных начинается со знака «$».

Объявлять переменную и присваивать ей значение нужно так:

 

 

Где name_var — имя переменной, value – значение переменной.

 

Пример объявление и инициализации переменных разных типов:

 

P.S. Повторюсь, узнать тип данных можно с помощью функции gettype(имя_переменной) 

 

Продолжим…

Присвоить что-то переменной, можно по значению (простое присваивание), а можно по ссылке.

 

Пусть есть две переменные:

 

 

  • Присвоим значение $s2 переменной $s1:

    Переменная $s1 получила значение “слово №2”, то, что мы будем дальше делать с $s1 ни как не влияет на $s2. В общем, это самое обычное присваивание значение переменной.
  • Присвоим значение $s2 по ссылке переменной $s1

    Знак «&» обозначает, что присваиваться будет не значение, а ссылка на данную переменную. Теперь и в $s1 и в $s2 находиться одно значение «слово №2», если мы изменим его в $s1, то измениться и значение в $s2 и наоборот, изменив его в $s2 оно (значение) также измениться и в $s1. Замечу, что аналогия с С++ тут не пройдет, &$s2не содержит в явном виде адрес переменной $s2, так что делать что-то с адресами у вас не получиться. Для сброса ссылки используйте функцию unset(имя_переменной);

 

Пару слов о переменных с типом «string», объявить и инициализировать переменную с данным типом можно «классическим способом»:

 

 

а можно, используя синтаксис «here doc»:

 

 

Где EOD – произвольный идентификатор (т.е. любое слово — транслитом), обозначающий начало и конец текста, закрывающий идентификатор (в моем случае EOD) должен разделяться от последнего символа строки только знаком «переход на новую строку» (ни каких табов от левого края до закрывающего EOD быть не должно).

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

 

Важно заметить, что в отличие от С/С++, в PHP глобальные переменные (которые объявлены выше вне функции) в теле функции по умолчанию не видны. Для того чтобы они стали видны и с ними можно было работать, необходимо их пометить что они глобальные, с помощью ключевого слова global, пример:

 

 

Если мы вызовем f(), значение глобальной переменной $i измениться с 1 на 2.

Также есть еще вариант, работать с глобальными переменными можно через специальный массив $GLOBALS, например:

 

 

все также, вызов f() изменит значение глобальной переменной $i с 1 на 2.

Переменная $GLOBALS является суперглобальной, её видно во всех областях видимости. Посмотреть список суперглобальных переменных вы можете на этой страницы документации

 

Переменная объявленная в теле функции, живет только во время исполнения функции, если мы хотим сохранить значение переменной до момента нового вызова той же функции, то её  необходимо сделать «статической», используя зарезервированное слово «static», пример:

 

 

любое кол-во раз вызвав функцию f() вы получите «2».

 

Объявим переменную $i как статичную:

 

 

теперь вызывая f(), вы каждый раз будете получать число больше на единицу, тут важно три момента:

  • статическая переменная инициализируется только при первом вызове функции (т.е. ей не будет присваиваться значение 1-цы при каждом запуске функции ).
  • значение переменной $i сохраняется в памяти до нового вызова f()
  • статическая переменная может хранить только константные значения (не ссылки на переменные и не объекты, а также нельзя приравнивать выражения, например static $i=1+1, все эти случаи интерпретатор будет считать ошибкой)

 

 

В PHP есть такая интересная штука как «переменные переменных» (или динамическая переменная), это переменная, которая хранит значение другой переменной и считает его именем, на примере должно быть более понятно:

 

 

Что это значит?

С помощью двойного знака «$» мы создали переменную с именем «name_1» и присвоили ей цифру 2. Еще раз, конструкция $$i=2 обозначает, что PHP интерпретатору нужно создать переменную с именем указанным в переменной $i и присвоить этой переменной значение 2.

 

одно и тоже

 

 

 5. Константы

 

Константы это неизменяемые значения или «имя какого либо значения». Например константа Pi (пи) равна 3,14… .

 

Определяют константу в PHP так:

или так

 

Обращаются к константе просто по имени, без знака «$», например:

 

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

 

 

6.  Операторы условия

 

Синтаксис оператора IF

 

 

Пару слов о понятие «выражение» …

 

Под выражением понимается «все что угодно» в языке PHP, главное чтобы оно возвращало значение. А т.к. оператор IF (и все условные операторы) требует от выражения значения типа boolean,  то все значения иного типа будут автоматически приведены к типы boolean.

В значение FALSE типа boolean преобразуются значение 0-ля типа int, значение 0.0 типа double, пустая строка и строка «0» типа string и массив без элементов, все остальное преобразуются в значение TRUE типа boolean.

 

Пример выражений и что они возвращают TRUE или FALSE при преобразование в тип boolean:

  • выражение «1» в if() возвращает TRUE
  • выражение «-1» в if() возвращает TRUE
  • выражение «123456» в if() возвращает TRUE
  • выражение «0» в if() возвращает FALSE
  • выражение «0.0» в if() возвращает FALSE
  • выражение «0.00000001» в if() возвращает TRUE
  • выражение «””» (пустая строка) в if() возвращает FALSE
  • выражение «” ”» (строка с символом пробела) в if() возвращает TRUE
  • выражение «”0”» (строка с символом 0) в if() возвращает FALSE
  • выражение «”1”» (строка с символом 1) в if() возвращает TRUE
  • выражение «”123456”» (строка с символами 123456) в if() возвращает TRUE
  • выражение «”FALSE”» (строка с символами FALSE) в if() возвращает TRUE (!)
  • выражение «”TRUE”» (строка с символами FALSE) в if() возвращает TRUE
  • выражение «array(1,2,3,4)» в if() возвращает TRUE
  • выражение «array()» в if() возвращает FALSE
  • выражение «f()» (функция которая возвращает 1-цу) в if() возвращает TRUE
  • выражение «$x» (переменная $x содержит 1-цу) в if() возвращает TRUE

 

Обычно выражения это условные операторы:

выражение «2>1» возвращает TRUE

выражение «2<1» возвращает FALSE

 

P.S. Объект всегда возвращает TRUE (кроме PHP версии 4), даже если он не имеет свойств и методов.

 

 

Итак оператор IF…

 

Оператор IF имеет следующий синтаксис:

 

 

Если выражение возвращает «истина» (TRUE), то выполняется команда1, если «ложь» (FALSE) то команда2.

 

Синтаксис оператора IF c elseif:

 

 

Если выражение1 «истина», то выполняется команда1, если выражение2 «истина» а все выше выражения «ложь» (выражение1 «ложь») то выполняется команда2, если выражение3 «истина» а все выше выражения «ложь» (выражение1 и выражение2 «ложь») то выполняется команда3. Т.е. выполняется всегда код первого истинного выражения.

 

В PHP есть альтернативный синтаксис для IF

 

и для IF с elseif

 

Также есть еще одна альтернативная запись IF c помощью тернарного условного оператора:

 

Если выражение TRUE выполняется команда1, если FALSE то команда2.

 

 

Синтаксис оператора switch

 

Оператор имеет следующий синтаксис:

 

 

Если $i равно 0, то выполняется команда1 и break (выход из условия), если $i равно 1, то выполняется команда2 и break (выход из условия), если $i не попадает не под одно из условий (не равно 0 и не равно 1) то выполняется то, что под default, т.е. команда3.

В том случаем, если после команд вы не напишите break, то выполняться будут все нижестоящие команды до конца switch, например:

 

 

Если $i равно 0, то выполниться команда1 потом команда2 и далее команда3, если $i равно 1, то выполниться команда2 и команда3.

 

Альтернативный синтаксис switch:

 

 

 

7. Операторы цикла

 

Синтаксис оператора FOR

 

Сначала, я продемонстрирую классическое применение оператора FOR, обычно люди всегда ищут что то вроде этого:

 

 

Цикл выполнит команду 10 раз.

 

Интересующимся я расскажу про синтаксис цикла for более подробно, итак синтаксис:

 

 

До начала цикла выполняется выражение1, далее проверяется что возвращает выражение2, если истина, то выполняется код заключенный в { }, если ложь то работа цикла завершается. После исполнения всех команд в {} (одна итерация)  выполняется выражение3. Если вместо одного выражения вы хотите записать не сколько, пишите их через запятую.

Тогда «классический пример» выше, можно записать в следующем непопулярном, но в интересном сокращенном виде:

 

 

У FOR также есть альтернативный синтаксис:

 

 

 

Синтаксис оператора WHILE и DO…WHILE

 

Оператор while имеет следующий синтаксис:

 

 

Первым делом выполняется выражение, если оно возвращает TRUE, то исполняется команда, если выражение возвращает FALSE то работа цикла завершается. После исполнение команды в {} опять выполняется выражение, если оно возвращает TRUE, то вновь исполняются команды в {} если FALSE, то цикл завершается. Далее все по аналогии.

 

Альтернативный синтаксис WHILE:

 

 

 

Оператор do … while имеет следующий синтаксис:

 

 

Оператор цикла do … while сначала исполняет команду в {}, а потом проверяет, что возвратит выражение, если TRUE, то команда в {} выполниться еще раз, если FALSE то работа цикла завершиться. Получается, что команда исполниться в любом случае хотя бы один раз.

 

 

Синтаксис оператора foreach

 

foreach – цикл перебора массивов (и объектов).

 

У данного оператора как и у всех в PHP есть два синтаксиса, первый:

 

 

На каждой итерации, значение текущего элемента присваивается переменной, далее выполняется команда, в которой мы можем работать с данной переменной. Тут важно заметить, что цикл foreach работает с копией массива, поэтому, изменять элементы массива через переменную мы не можем. Чтобы изменять элементы массива внутри цикла через переменную, нам необходимо после «as» и перед переменной поставить знак «&»:

 

 

 

Альтернативный синтаксис foreach:

 

 

На каждой итерации, значение текущего ключа присваивается переменной1, а текущего элемента переменной2. Чтобы изменять элементы массива внутри цикла через переменную, нам необходимо после «=>» и перед переменной2 поставить «&»:

 

 

 

С версии PHP 5.5 появилась возможность распаковывать вложенный массив с помощью функции list(), пример:

 

 

В данном случае, на каждой итерации, переменная1 получит значение первого элемента текущего вложенного массива, а переменная2 второго элемента текущего вложенного массива. Т.е. на первой итерации переменная1=1, а переменная2=2, на второй итерация переменная1=3, переменная2=4;

 

 

Операторы break и continue:

 

  • break – прерывает выполнение циклов (for,while,foreach)
  • continue – прекращает текущею итерацию, после чего проверятся выражение и в случае TRUE выполняется следующая итерация.

 

 

8.  Директивы интерпретатора PHP

 

Все нижеуказанные директивы, заменяются интерпретатором на содержимое файла, имя которого указывается в качестве параметра. Подключаемый файл считается HTML – файлом, поэтому php-код, в нем обязательно обрамляется тегом <?php … ?> (или <? … ?>). Путь до подключаемого файла указывается относительного выполняемого сценария.

 

8.1. include ‘имя_файла.php’ – Подключает файл, в случае его отсутствия интерпретатор выведет ошибку, но выполнение скрипта продолжиться. Также include может возвращать значения (return в подключаемом файле), пример:

 

 

В данном примере, подключиться файл и переменной $var присвоится значение, которое возвращает подключаемый файл с помощью return. В том случае, если подключаемый файл ничего не возвращает, include вернет «1» при удачном подключение или «FALSE» при не удачном.

 

8.2. require ‘имя_файла.php’ – Подключает файл, в случае его отсутствия, выполнение текущего скрипта прекратиться.

 

 

P.S.  Также есть:

  • require_once
  • include_once

Они аналогичны include и require по функциональности, отличие в том, что файл подключиться только один раз, в не зависимости от того сколько вы раз вызвали данные директивы.

 

 

 9. Функции

 

В интерпретатор PHP по умолчанию встроено большое количество функций, список их можно увидеть по ссылке

 

 

Разберемся, как создавать пользовательские функции

 

Описывать функцию можно даже после её вызова, приведу синтаксис описания функции:

 

 

Вызывается функция таким образом:

 

 

В качестве аргументов функции, передается «переменная1», «переменная2» и т.д. Функция в результате вызова по имени «имя_функции(переменная1, переменная2, …)» выполняет команду и возвращает значение переменной с помощью return, последнее не обязательное и ни кто не обязывает возвращать результат через return. Получить результат работы функции можно и иным способом, если передать аргументы не по значению как выше (в данном случае функция работает с копиями переменных), а по ссылке, пример:

 

 

Переменная с именем «$переменная1» передана в функцию по ссылке, а это значит, что все изменения, которые произойдут с ней в теле функции будут видны и вне функции, выходит «$переменная1» можно использовать как результат работы функции. Таких переменных может быть любое кол-во.

 

В PHP как и в С++ есть возможность задавать значение аргументов по умолчанию:

 

 

P.S. Аргументы функции с значениями по умолчанию должны всегда следовать за «простыми» аргументами

 

Выше указанное обозначает, что если мы вызовем данную функцию не указав в качестве ее аргументов переменнуюN, то ее значение будет равно значению_по_умолчанию, которое может быть любого типа (число, строка и т.п.).

 

 

Полезно повторить (о чем я уже говорил в разделе «3. Типы данных»):

 

а) Что с PHP 5 стало возможно явно указывать тип аргументов функции, делается это как и в С/C++, перед аргументам указываем его тип.

 

Пример №1 «аргумент должен быть массивом»:

 

 

Если мы вызовем функцию f с аргументом отличного типа от array (массив), то интерпретатор выведет ошибку:

 

«Catchable fatal error: Argument 1 passed to f() must be an array, тип_аргумента_который_вы_использовали given, called in …»

 

Пример №2 «аргумент должен быть экземпляр класса myClass»:

 

 

Если мы вызовем функцию f с аргументом отличного типа от объекта унаследованного от класса myClass, то интерпретатор выведет ошибку

«Catchable fatal error: Argument 1 passed to f() must be an instance of myClass, тип_аргумента_который_вы_использовали given, called in …»

 

б) Отличительной чертой PHP от C++ является то, что в теле функции по умолчанию не видно глобальных переменных, как я уже писал в разделе «4. Переменные» для исправления данного исключения необходимо либо использовать ключевое слово «global», либо обращаться к массиву глобальных переменных — $GLOBALS.

 

Применение ключевого слова «global»:

 

 

Применение массива «$GLOBALS»:

 

Если мы вызовем f() в любом из двух случаев, значение глобальной переменной $i измениться с 1 на 2.

 

Идем дальше…

 

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

 

 

 

И последнее о функциях…

 

Есть такой тип функций «анонимные» (их также называют «замыкания» или «closures»), появились они в PHP начиная с версии 5.3.0. Объяснить что такое анонимные функции не трудно, труднее дать представление, где они применяются.

 

Итак, анонимные функции это функции без имени, объявляются они так:

 

 

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

При объявление, анонимные функции можно присваивать переменным:

 

 

Тогда вызов функции, будет таким:

 

 

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

Callback – параметр, это аргумент функции, значение которого и есть анонимная функция (в таком случае анонимную функцию называют функцию обратного вызова)

В PHP имеется множество стандартных функций, аргументы которых являются callback, т.е. принимают в качестве аргументов — анонимную функцию. Самые популярные из них:

 

Пример:

 

 

Результат: массив с элементами 2,3,4.

 

 

10. Пространство имён

(данная возможность добавлена с PHP 5.3.0)

 

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

Зачем нужно пространство имен, объясню на примере:

Допустим в вашем php-скрипте вы подключили с помощью include  некоторое количество сторонних php-файлов (библиотек), вы пишете код и описываете свою пользовательскую функцию, придумывайте ей имя, но вы не знаете (точнее не держите в голове) какие имена у функций в подключаемых файлах, если имя совпадет, то интерпритатор PHP выведет фатальную ошибку. «Fatal error: Cannot redeclare … ».

Вы можете сказать, я могу переименовать свою функцию и проблем нет, но на какое имя? Ведь название может опять совпасть… придется гадать. Чтобы не заниматься глупостями, правильнее, размещать свой код в пространстве имён, тогда мы можем не забивать себе голову — о проблеме совпадений имен. Заметьте, мы говорим о конфликте имен функций, классов и констант, про переменные (!) я не говорил. При конфликте имени переменной, PHP интерпретатор ошибку не вызовет, он просто посчитает, что вы хотите данную переменную переинициализировать (придать ей новое значение).

 

Пример:

 

файл script.php:

 

файл index.php:

 

Результат – ошибка:

Fatal error: Cannot redeclare f() (previously declared in Z:\home\s-engineer.ru\www\index.php:11) in Z:\home\s-engineer.ru\www\script.php on line 4

 

Решение проблемы – использовать пространство имен, достаточно объявить все, что в файле index.php в одно пространство имен:

 

 

Результат:

моя функция
функция сторонней библиотеки

 

Знак слеша (\) обозначает что данная функция описана в «глобальном пространстве имён», т.е. где угодно кроме этого пространства имен или этого файла.

 

P.S. Ключевое слово «namespace» должно быть первой строкой в php файле (строка «<?php» или «<?» за первую не считается). Следующий код вызовет ошибку:

<html>

<?

namespace mySpace;

….

?>

</html>

т.к. до «namespace» есть строка с тегом <html>

 

Тут важно заметить, что f() вызовет функцию, если она описана в данном пространстве имен, если нет, то ошибки не будет, интерпретатор вызовет f() из «глобального пространства имен».

 

Пример, удалим из index.php описание функции f():

 

Результат:

функция сторонней библиотеки
функция сторонней библиотеки

 

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

 

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

 

 

 

11. Классы и объекты

 

Про классы и объекты рассказано в следующем посте




Буду признателен если вы поделитесь данным постом


Ваш комментарий


Ответ в цифрах

 
© s-engineer.ru, 2012-2017 | Все права защищены