PHP

РНР (читается как пи-эйч-пи) является интерпретируемым языком программирования.

Рабочие скрипты:

Документация PHP:

Синтаксис

  • Код на PHP начинается с открывающего дескриптора <?php, после которого следует исходный код PHP до конца файла. Как правило, они не завершаются закрывающим дескриптором ?>. Закрывающий дескриптор является необязательным и в файлах содержащих только код PHP рекомендуется его опускать.
  • Для того чтобы объявить переменную в PHP, вначале имени переменной, ставиться знак $.
  • Переменная создаётся в момент первого присваивания ей значения. Прежде чем использовать переменную настоятельно рекомендуется присвоить ей значение.
    $isoalpha2='';
  • Имена переменных чувствительны к регистру, а имена функций нет. Т.е. $Name и $name - это разные переменные, а Name() и name() - одинаковые функции.
  • Специальное значение NULL представляет собой переменную без значения.
  • Комментарии
    // или # - однострочный комментарии. /**/ - многострочный комментарий.
  • Строки заключённые в одинарные кавычки, трактуются как обычные литералы. При использовании одинарных кавычек следует экранировать только два специальных символа: обратную косую черту и саму одинарную кавычку, например
    print 'Кот-д\'Ивуар - \изумительная\ страна.';
  • Строки заключённые в двойные кавычки интерпретатор PHP будет пытаться вычислить.
  • Символ тире и "больше" (→) обозначают вызов метода из класса.
  • Двойное двоеточие (::) обознает вызов статического метода из класса.
  • Символ точка и интерполяция. Строки в РНР объединяются при помощи символа точки (.), при этом все типы, отличные от строкового, приводятся К нему автомати­чески. Однако это не единственный способ формирования строки : можно прибегнуть к так называемой интерполяции, при которой переменная встав­ляется в строку, заключенную в двойные кавычки. Например, переменная $name = "Hello" , подставленная в строку "$name world!", при водит к фор­мированию строки " Hello world!". Аналогично можно подставлять в строку значения членов класса. Однако конструкция $this→имя_члена достаточно сложна для интерпретации. Для того чтобы интерпретатор мог корректно различить обращение к члену клас­са из строки, необходимо заключить переменную в фигурные скобки, например
        public function get_full_info()
        {
          return "{$this->get_info()} ({$this->get_age()})";
        }
  • Фигурные скобки {} обозначают начало и конец выполняемых конструкций, если их не использовать в операторах (if, for и т.д.) будет выполняться только одна конструкция. Например: Вывести все Веб корректные(безопасные) цвета (всего 216 цветов):
    <?php
    for ($rr = 0; $rr <= 0xFF; $rr += 0x33)
     for ($gg = 0; $gg <= 0xFF; $gg += 0x33)
      for ($bb = 0; $bb <= 0xFF; $bb += 0x33)
       printf("%02X%02X%02X\n", $rr, $gg, $bb);
    ?>
    

    Фигурные скобки {} можно применять для экранирования переменных, например

    echo "Цена: ${Cost}UAH "; 
    // или
    echo "Цена: {$Cost}UAH ";
  • Альтернативный синтаксис управляющих структур: if, while, for, foreach и switch. В каждом случае основной формой альтернативного синтаксиса является изменение открывающей фигурной скобки на двоеточие (:), а закрывающей скобки на endif;, endwhile;, endfor;, endforeach; или endswitch; соответственно.
  • Цикл for. Синтаксис:
    FOR (условие1; условие2; условие3)выражения

    PHP поддерживает альтернативный синтаксис FOR:

    FOR(усл1; уcл2; усл3;):операторы;...;ENDFOR;
  • условие1 - Безусловно выполняется (вычисляется) в начале цикла
  • условие2 - Проверяется в начале каждой итерации. Если оно равно TRUE, то цикл продолжается и выполняются вложенные операторы. Если оно равно FALSE, то цикл заканчивается.
  • условие3 - Выполняется (вычисляется) в конце каждой итерации.

Каждое из этих условий может быть пустым.

Пример. Так как условие1 безусловно выполняется один раз в начале цикла - это можно использовать для записи более компактного кода.

array1.php
$matches = array('Makap', true, 'false', 35);
 
for ($i = 0, $cnt=count($matches); $i < $cnt; $i++) {
        echo "$matches[$i]\n";
}
  • Конструкция foreach предоставляет простой способ перебора массивов. Когда оператор foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый его элемент. Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. У цикла foreach существует альтернативный вариант записи:
    <?php foreach ($array as $item): ?>
    <li><?=$item?></li>
    <?php endforeach; ?>

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

В альтернативном варианте можно записать также: for, while, if-else, switch-case.

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

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

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

Для того чтобы функция принимала аргументы по ссылке, а не по значению, поставьте символ & перед именем параметра в прототипе функции:

function wrap_html_tag(&$string, $tag = 'b') {
   $string = "<$tag>$string</$tag>";
}

Теперь нет необходимости возвращать строку, поскольку изменяется сам оригинал.

  • Вывести все подключенные функции PHP
    print_r(get_defined_functions());
Желательно чтобы функция всегда возвращала значение, чтобы можно было проверить выполнилась функция или нет.

PHP и JavaScript

Взаимодействие PHP и JavaScript

  • Взаимодействие PHP и JavaScript: Язык PHP предназначен для написания скриптов, которые выполняются на стороне сервера, а в браузер клиента отправляется не сам скрипт, а только результаты его работы. Это означает, что пользователь, загрузивший страницу вашего сайта, никогда не увидит исходный код скрипта и может даже не догадываться, что страница создана динамически. В свою очередь, на языке JavaScript создаются исключительно клиентские скрипты, которые исполняются в браузере клиента. Для сервера скрипты JavaScript – это обычные текстовые данные, ничем не отличающиеся от прочего содержимого страницы. Поэтому прямое взаимодействие скриптов на PHP и JavaScript невозможно. Для передачи данных между клиентской и серверной стороной можно использовать один из трёх вариантов:
  1. Внесение изменений в текст страницы, например в php файле
    echo '
    <html><head>
    <script>
    var fromDate="'.$_POST['fromDate'].'";
    var toDate="'.$_POST['toDate'].'";
    </script>
    ...Your HTML here
    ';

    После загрузки при помощи JavaScript считываются переменные fromDate и toDate.

  2. Использование Cookie

Переменная $GLOBALS. Ассоциативный массив (array), содержащий ссылки на все переменные глобальной области видимости скрипта, определенные в данный момент. Имена переменных являются ключами массива.

Опция (register_globals=On) в Настройка файла php.ini для высоконагруженных сайтов указывает на необходимость регистрации переменных, полученных методом Метод HTTP POST или get в глобальный массив $GLOBALS.
<?php
$conf['conf']['foo'] = 'this is foo';
$conf['conf']['bar'] = 'this is bar';
global $conf; // добавляем переменную в глобальный массив видимости скрипта
$output = print_r($GLOBALS["conf"], true);
echo "$output\n";
?>

Для объявления глобальной переменной ее достаточно поместить в массив $GLOBALS

$GLOBALS['testkey2']='testvalue2';

Вывести на экран все значения переменных массива $GLOBALS можно при помощи print_r($GLOBALS); или так:

foreach ($GLOBALS as $key=>$value)
   echo 'GLOBALS['.$key.'] == '.$value.'<br>'; 

Переменная $_SERVER.

  • Переменная $_SERVER является массивом, содержание которого создается Веб- сервером. В нем должны присутствовать сведения (в зависимости от реализации сервера их может и не быть) описанные в спецификации RFC 3875, такие как
  • $_SERVER['REMOTE_ADDR'] IP- адрес, с которого пользователь просматривает текущую страницу
  • $_SERVER['HTTP_ACCEPT_LANGUAGE'] содержимое заголовка Accept-Language определение локали в браузере
  • $_SERVER['HTTP_USER_AGENT'] содержимое заголовка User-Agent
  • $_SERVER['HTTP_VIA'] если не пустая, значит используется proxy. Значение - адрес (или несколько адресов) proxy сервера.
  • $_SERVER['HTTP_X_FORWARDED_FOR'] если не пустая, значит используется proxy, без анонимизатора (т.е. ваш реальный IP не скрывается). Значение - реальный ip адрес клиента.
  • $_SERVER['REQUEST_METHOD'] какой метод был использован для запроса страницы 'GET', 'HEAD', 'POST', 'PUT' и тд., например проверим пришел ли запрос на нашу страницу методом POST
    if ($_SERVER['REQUEST_METHOD']=='POST') {
        include_once 'your.inc.php';
    }
  • $_SERVER['HTTP_REFERER'] - Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER. Одним словом, в самом деле ему нельзя доверять.

Переменная $_GET.

Переменная $_POST.

  • Вывести все переменные переданные методом POST
    <?php
    echo '<br>';
    var_dump($_POST);
    echo '<br>';
    print_r($_POST);
    echo '<br>';
    ?>
  • Если массив POST пуст прервать выполнение скрипта
    if (empty($_POST)) {exit();}

Переменная $_FILES - переменные файлов, загруженных по протоколу Коды состояния HTTP. Методы и структура протокола HTTP методом Метод HTTP POST. Пример PHP - загрузка файла на сервер.

Переменная $_REQUEST - ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST и $_COOKIE. Переменные в массиве $_REQUEST передаются в скрипт посредством методов GET, POST или COOKIE, поэтому им нельзя доверять, т.к. они могли быть изменены удаленным пользователем. Их наличие и порядок добавления данных в соответствующие массивы определяется директивой variables_order (по умолчанию установлено GPCS).

Переменная $_SESSION

Переменная $_ENV. Заполняется если скрипт был запущен из командной строки. Массив $_SERVER будет содержать все переменные из массива $_ENV.

Переменная $_COOKIE: Cookie.

Переменная $http_response_header

Операторы include, require, include_once и require_once работают аналогично серверным включениям (SSI). Операторы include и require являются языковыми конструкциями, а значит могут использоваться без круглых скобок.

include 'vars.php'; include_once './second.class.php';
Операторы require() и include() ничем не отличаются друг от друга, единственно в случае неудачного их выполнения require() выдаст сообщение о неисправимой ошибке и прервет выполнение программы, а include() выдаст только предупреждение.

В относительном виде путь может содержать специальные управляющие символы "." (точка) и ".." (две точки). Точка обозначает текущий каталог, а две точки - предыдущий вышележащий.

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

Тернарная операция в PHP записывается аналогично языку С. Синтаксис тернарного оператор "?":

$переменная = условие ? $переменная = если условие выполнено : $переменная = если условие не выполнено
  • Пример.
    echo (empty($_SERVER['HTTP_REFERER'])) ? 'Not referer' : $_SERVER['HTTP_REFERER'];
  • Пример. Формирование SQL запроса.
    #!/usr/bin/php
    <?php
    $nColumns = 'peer,valute';
    for ($year = 2009; $year <= 2012; $year++) { // цикл перебирает года
        for ($month = 1; $month <= 12; $month++) { //вложенный цикл перебирает месяцы
    ($month < 10 ? $day = $year . "0" . $month . "%" : $day = $year . $month . "%"); // тернарный оператор
    $query = "select " . $nColumns . " from Cache where day like '" . $day . "'";
        }
    }
    ?>

Справочник функций PHP

  • get_defined_vars - эта функция возвращает многомерный массив, содержащий список всех определенных переменных в месте вызова функции get_defined_vars()
    var_dump(get_defined_vars()); exit;

Обработка строк

  • printf - выводит отформатированную строку. Её следует использовать при необходимости вывода переменной в формате с плавающей запятой с определенной точностью, либо в любом другом случае, когда возникает необходимость изменения формата выводимых данных. Где только возможно printf нужно заменять функцией print(), так как она выполняется быстрее.
  • print - выводит строку.
  • echo - выводит одну или более строк. Пример краткой записи echo
    //полная запись
    <a href="index.php"><?php echo $num_page ?></a>
     //краткая запись
    <a href="index.php"><?=$num_page?></a>

Обработка текста

  • print_r - выводит информацию о переменной, структуре массива и объекта. Принимает только один обязательный параметр(если будет указан второй параметр true - выходные данные функции будут представлять собой её возвращаемое значение и не будут выводиться на экран). В случае массивов функция выводит все элементы массива, в наглядном виде.
  • var_dump - сходная с функцией print_r. Дополнительно выводит размер переменных, не выводит непубличные данные в объектах, не имеет второго параметра для вывода данных в возвращаемое значение.
  • var_export - сходна с print_r и print_r. Различие состоит в том, что var_export выводит информацию о переменных в стиле PHP кода, т.е. вывод можно скопировать и вставить в свой PHP- скрипт.
  • empty() возвращает true, если переменная не существует или пустая, в противном случае - false. Переменная считается пустой, если она не существует или её значение равно FALSE.
  • isset() возвращает true, если переменная существует, и false - в противном случае (переменная с пустой строкой считается существующей). Удобно применять для проверки checkbox, так как элемент суперглобального массива для флажка (checkbox) устанавливается только в том случае, если флажок отмечен, в противном случае элемент для флажка в суперглобальном массиве не создается.
  • nl2br — Вставляет HTML -код разрыва строки перед каждым переводом строки

Функции запуска внешних программ

  • exec — исполняет внешнюю программу. Возвращает последнюю строку вывода запущенной на исполнение команды.
  • passthru — выполняет внешнюю программу и отображает необработанный вывод. Эта функция должна быть использована вместо функции exec() или system(), когда вывод команды Unix представляет собой двоичные данные, которые необходимо передать непосредственно в браузер. Стандартное использование этой функции - выполнение таких утилит как pbmplus, которые выводят непосредственно поток изображения. Установив Content-type в image/gif и затем вызвав программу pbmplus для вывода gif, вы можете создать PHP-скрипты, которые выводят изображения напрямую в браузер.
  • system — выполняет внешнюю программу и отображает её вывод.
  • shell_exec - выполняет команду через shell и возвращает полный вывод в виде строки. Функция аналогична оператору исполнения: обратные кавычки (``).
    <?php
    $output = shell_exec('ls -lart');
    echo "<pre>$output</pre>";
    ?>
  • escapeshellcmd - экранирует метасимволы командной строки при помощи обратного слэша.
  • escapeshellarg — Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки
  • fgetss - прочитать строку из файла и отбросить HTML и PHP теги.
  • fgets - построчное чтение из файла. Пример. Считываем построчно текстовый файл и каждую строку передаем на обработку функции TxtToSQL()
    function TxtToSQL($line) {
        echo "$line";
    }
    
    $filename = 'ARMY_utf8.txt';
    
    $fhandle = fopen($filename, "r") or die("File $filename not found\n");
    while (!feof($fhandle)) {
        TxtToSQL(fgets($fhandle));
    }
    fclose($fhandle);
  • file_get_contents - читает содержимое файла в строку. Функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой. Пример: запрос страницы с передачей логина и пароля
    <?php
    $url = 'https://example.com/dbs/test.php';
    $auth = base64_encode('user:password');
    $header = array("Authorization: Basic $auth");
    $opts = array('http' => array('method' => 'GET',
    //        'protocol_version' => 1.1,
            'header' => $header));
    
    // Создаем окружение с помощью установленных выше HTTP- заголовков
    $context = stream_context_create($opts);
    $file = file_get_contents($url . '?id=8300120011', false, $context);
    
    print_r($file);
    ?>

    Пример: запрос страницы методом POST:

    <?php
    $data = array(
        'needle' => '38093'
    );
    $postdata = http_build_query($data); // Генерирует URL-кодированную строку запроса
    $options = array('http' =>
        array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );
    $context = stream_context_create($options);
    // Открываем файл с помощью установленных выше HTTP-заголовков
    $result = file_get_contents('https://example.com/response.php', false, $context);
    echo $result;
    ?>

Безопасность

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

  • Сервер ожидает от пользователя строку. Минимальная защита достигается применением функций strip_tags и trim
    if ($_GET['id']) {
                    $id = trim(strip_tags($_GET['id']));
    }
  • Сервер ожидает от пользователя целое положительное число. Минимальная защита достигается явным применением к целому типу и использовании функции abs
    $age = abs((int) ($_POST['age']));
  • Валидация EMail, при помощи фильтра FILTER_SANITIZE_EMAIL (удаляет все символы, кроме букв, цифр и !#$%&'*+-/=?^_`{|}~@.[]. )
    <?php
    # email
    $a = "dar(k)f ire@ex\amp/le.c om";
    echo filter_var($a, FILTER_SANITIZE_EMAIL);
    echo "\n";
    ?>

Маленькие советы

  • Hачинающий: echo "$var";
    Пpофи: echo $var;
  • Начинающий: print("Test");
    Пpофи: print "Test";
  • Краткая запись <?= для строки <?php echo. Спорный совет - требует включения short_open_tag, не знаешь как писать всегда выбирай вариант с полными тегами т.е. первый вариант.
    1 способ: <?php echo '<a href=\"http://www.php.net\">PHP</a>'; ?>
    2 способ: <?= '<br><a href="http://www.php.net">PHP1</a>' ?>

    Начиная с версии PHP 5.4.0 запись <?= стала доступна всегда.

  • Hачинающий: $a[0]=1; $a[1]=2; $a[2]=3;
    Пpофи: $a = array(1,2,3);
  • Hачинающий: if($a>1) { $b=2; } else { $b=3; }
    Пpофи: $b = ($a>1) ? 2:3;
  • При написании собственных функций желательно чтобы они возвращали результат, даже если сама функция просто форматирует страницу. Это позволяет легко проверить выполнилась функция или нет, что позволяет проще обнаруживать этапы на которых возникли ошибки.
  • Конкатенация строк — два способа:
    Hачинающий: $a = $a. $b;
    Пpофи: $a .= $b; // этот способ намного быстрее - использовать его
PQ VPS сервера в 28+ странах.