# PHP

# Основа

**Включение кода в html**

- XML style ```php
    <?php  ?>
    ```
- SGML style ```
    <? ?>
    ```

**Общая информация:**

- Динамическая типизация,
- Функции не чувствительны, переменные чувствительны к регистру
- Завершающая ;
- Операторные скобки { }, после закрывающей скобки ; не нужна
- Комментарии: ```php
    // # /**/
    ```
- Переменные начинаются с $
- Имена функций и классы строки без пробелов

**Целые числа**

- Десятичные: без первого 0, аналог long
- Восьмеричные: первый 0
- Шестнадцатеричные: 0x
- Двоичные: 0b

**Строки**

- "" - разименование переменной, Escape-последовательности, '' - как есть
- \\ - экранирование

**Булевы**

- Ключевое слово false
- Целое число 0
- Число с плавающей запятой 0.0
- Пустая строка("") и строка, содержащая "0"
- Массив с О элементов
- Объект без значений и функций
- Значение NULL

**Массивы**

- Обычные ```php
    $person = агrау("Эдисон",  "Ванкель",  "Крэпnер");
    $person[O] = "Эдисон"; 
    $person = ("Эдисон", "Ванкель", "Крэппер");
    ```
- Ассоциативные ```php
    $creator = аrrау('Лампочку' => "Эдисон", 
    'Роторный двигатель'=> "Ванкель", 
    'Туалет'=> "Крэппер"); 
    $сгеаtог['Роторный двигатель'] = "Ванкель"; 
    ```

**Ресурсы**

- Ресурс ( resource) - это специальная переменная, содержащая ссылку (дескриптор) на внешний ресурс.

**Сравнение и преобразование типов**

- is\_float(), is\_string(), is\_bool(), is\_object(), is\_resource(), is\_null()
- intval() вещественное в целое
- Для преобразования строки в число первым символом д б число. Иначе 0. Будет преобразовывать, пока не повстречает логическую ошибку и на этом завершит работу и вернет значение.

**Операторы**

- присвоение =
- сравнение ==, &lt;, &gt;,

# Специфика синтаксиса

**Глобальные переменные:**

```php
define();
```

**Переменные переменных**

```php
$foo = "bar"; 
$$foo = 'bаz";
```

После выполнение второго оператора у переменной $bar будет значение "baz". Значение переменной foo рассматривается как имя переменной.

**Переменные-ссылки**

```php
$black = &$white
```

**Области видимости переменной:**

- Локальная область: переменные, объявленные в функции, локальны для функции. Но созданная внутри цикла - все равно функция.
- Глобальная: перед переменной поставить global ```php
    function updateCounler() 
    { 
      global $counter; 
      $counler++; 
    } 
    $counter = 10; 
    updateCounter(); 
    echo $counter;
    ```
    
     В массиве $GLOBALS хранятся глобальные переменные, доступные напрямую
    
    ```php
    function updateCounter()
    { 
    $GLOBALS[counter]++; 
    } 
    ```
- Статическая переменная сохраняет значение между вызовами функции. Объявляется через static

isset() проверяет, существует ли переменная, unset() уничтожает переменную.

**Операторы**

<table border="1" id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BE%D1%80.-%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-%D0%9E%D0%BF%D0%B8%D1%81" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 7.74732%;"></col><col style="width: 13.6415%;"></col><col style="width: 78.6112%;"></col></colgroup><thead><tr><td class="align-center">Приор.</td><td class="align-center">Оператор</td><td class="align-center">Описание</td></tr></thead><tbody><tr><td>21</td><td>clone, new</td><td>создание нового объекта</td></tr><tr><td>20</td><td>\[</td><td>индекс массива</td></tr><tr><td>19</td><td>~</td><td>побитное отрицание</td></tr><tr><td>  
</td><td>++</td><td>инкремент</td></tr><tr><td>  
</td><td>--</td><td>декремент</td></tr><tr><td>  
</td><td>(int), (bool), (float), (string), (array), (object), (unset)

</td><td>Приведение типов

```
$b = (int) $a;
```

</td></tr><tr><td>  
</td><td>@</td><td>подавление ошибок</td></tr><tr><td>18</td><td>isinstanceof</td><td>проверка типа</td></tr><tr><td>17</td><td>!</td><td>Логическое отрицание</td></tr><tr><td>16</td><td>\* / %</td><td>Умножение, деление, остаток от деления</td></tr><tr><td>15</td><td>+ - .</td><td>Сложение, вычитание, конкатенация строки</td></tr><tr><td>14</td><td>&lt;&lt; &gt;&gt;</td><td>Побитный сдвиг влево, побитный сдвиг вправо</td></tr><tr><td>13</td><td>&lt; &lt;= &gt; &gt;=</td><td>Меньше, меньше или равно, больше, больше или равно</td></tr><tr><td>12</td><td>== != &lt;&gt; === !==</td><td>Равно, не равно, тип и значение равны, тип и значение не равны</td></tr><tr><td>11</td><td>&amp;</td><td>Побитное и</td></tr><tr><td>10</td><td>^</td><td>Побитное исключающее или</td></tr><tr><td>9</td><td>|</td><td>Побитное или</td></tr><tr><td>8</td><td>&amp;&amp;</td><td>Логическое и</td></tr><tr><td>7</td><td>||</td><td>Логическое или</td></tr><tr><td>6</td><td>?:</td><td>Условный оператор</td></tr><tr><td>5</td><td>= += -= и т д </td><td>Присваивание</td></tr><tr><td>4</td><td>and</td><td>Логическое и</td></tr><tr><td>3</td><td>xor</td><td>Логическое исключающее или</td></tr><tr><td>2</td><td>or</td><td>Логическое или</td></tr><tr><td>1</td><td>,</td><td>разделитель списка</td></tr></tbody></table>

**Префиксный и постфиксный способ записи**

```php
$m = ++$var;//увеличит значение на 1 и вернет значение
$m = $var++;//вернет значение и увеличит значение на 1
```

**Выполнение команд оболочки**

Обратные кавычки.

```php
$listing =  `ls -al /tmp`; 
```

**Условные операторы**

Стандартный синтаксис:

```
if (условие) 
    {действия}
else
    {действия}
```

Тенарный синтаксис:

```php
 if($active) { echo "да";} else { есhо "нет";}
```

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

```php
<? if ($user_validated) :?> 
<tаble> 
<tr> 
<td>Имя:</td><td>Sophia</td> 
</tr> 
<tr> 
<td>Фaмилия:</td><td>lee</td>
</tr> 
</table> 
<? else: ?> 
Пожалуйста войдите. 
<? endif ?> 
```

Switch

```php
switch ($name) {
case 'one': 
    //do something
    break;
case 'two':
    //do something
    break;
}
```

```php
switch ($name):
case 'one': 
    //do something
    break;
case 'two':
    //do something
    break;
endswitch;
```

**Циклы**

```php
while (условие) {
  //операторы
}
```

```php
while (условие):
  //операторы
endwhile;
```

continue / break - следующая итерация / выход из текущего цикла. break 2 - выход из 2 текущих циклов.

```php
do
  оператор
while (условие);
```

```php
for ($counter=0; $counter<10; $counter++){
  оператор
}
```

Счетчик по массиву

```php
foreach ($mass as $elem) {
  оператор
}
```

```php
foreach ($mass as $key => $val) {
  оператор
}
```

Альтернативный способ:

```
foreach ($mass as $key => $val):
  оператор
endforeach;
```

**Обработка ошибок**

```php
function inverse($x) {
    if (!$x) {
        throw new Exception('Деление на ноль.');
    }
    return 1 / $x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'PHP перехватил исключение: ',  $e->getMessage(), "\n";
}
```

**Включение кода**

include - включение статического кода

```php
<?php include "header.html"; ?> 
содержимое страницы 
<?php include "footer.html"; ?>
```

require - включение динамического кода

```php
require "codelib.php"; 
mysub();  //определено в codelib.php 
```

Лучше:

```php
<?php require "design.php"; 
heoder(); ?> 
content 
<?php footer(); ?> 
```

**Подавление ошибок:**

```php
@include
```

Если в файле конфигурации РНР (php.ini) включена опция allow\_url\_fopen, вы можете включать файлы, находящиеся на удаленных узлах, ука­зав URL вместо пути к файлу

```php
include "http://www.exomple.com/codelib.php";
```

 include\_once и require\_once - однократная загрузка в пределах скрипта

Область видимости включаемых файлов = области видимости точки включения.

# Функции

**Синтаксис:**

```php
function [&] имя_функции([parameter,...]) {

  return $perem;
}
```

&amp; - передача по ссылке

**Параметры по умолчанию**

```php
function getPreferences($whichPreference = 'all')
```

**Функция, возвращающая текст**

```php
<?php function column() {
  ?>
  </td><td>
  <?php }
```

**Вложенные объявления:**

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

**Функция с динамическим количеством переменных**

```
function getPreferences()
```

- func\_get\_args() - массив всех переданных параметров функции.
- func\_num\_args() - количество параметров, переданных функции.
- func\_get\_arg($num) - параметр с определенным номером.

При отсутствии аргумента будет выведено предупреждение.

Контроль типа есть, но только относительно классов, массивов или функций. Примитивы нельзя.

Если после переменной добавить (), то будет вычислено значение переменной, произойдет поиск функции с именем равным значению и выполнение этой функции.

function\_exist($fname) определяет наличие функции с данным именем

**Анонимная функция (замыкание)**

```php
usort($array, function($a, $b){
  return strlen($a) - strlen($b)
})
```

Для передачи внутрь переменных используется use

```php
usort($array, function($a, $b) use ($Someperem){
  if ($Someperem == 'random') {return rand(0,2) - 1;}
  else {
    return strlen($a) - strlen($b)
    }
})
```

# Строки

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

```php
$n = 12;
echo "You are {$n}th number";
```

Одинарные - как есть.

**Формат heredoc**

```
$clerihew = <<EndOIOuote 
Съешь ещё этих мягких 
французских булок, 
да выпей чаю. 
EndOIOuote; 
echo $clerihew; 
```

**Вывод строк:**

```php
echo "one", "two";
print("some");
```

Есть еще printf, print\_r, var\_dump

**Функции:**

<table border="1" id="bkmrk-strlen%28%24string%29%3B-%D0%B4%D0%BB%D0%B8" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30.4167%;"></col><col style="width: 69.7025%;"></col></colgroup><tbody><tr><td>strlen($string);</td><td>длина строки</td></tr><tr><td>trim(), ltrim(), rtrim()</td><td>обрезание лишних пробелов слева и справа, второй необ. параметр - список символов, удаляемых вместе с пробелами</td></tr><tr><td>strtolower() strtoupper()</td><td>всю строку</td></tr><tr><td>ucfirst()</td><td>одну первую букву всей строки</td></tr><tr><td>ucwords()</td><td>первую букву каждого слова</td></tr><tr><td>htmlentities() htmlspecialchars{)</td><td>Преобразование сырой строки в html-безопасную строку</td></tr><tr><td>strip\_tags()</td><td>Удаление html тегов</td></tr><tr><td>get\_meta\_tags()</td><td>возвращает массив МЕТА-тегов НТМL­  
страницы, указанный в виде URL или локального файла</td></tr><tr><td>rawurlencode() rawurldecode{)</td><td>кодирование/декодирование строки согласно URL-соглашению RFC 3986</td></tr><tr><td>addslashes() stripslashes()</td><td>экранировать/убрать обратный слеш перед: одинарные кавычки, двойные кавычки, NUL-байты и об­ратные слеши</td></tr><tr><td>strrev()</td><td>порядок символов на обратный</td></tr><tr><td> str\_repeat()</td><td>Повтор строки n раз</td></tr><tr><td> str\_pad()</td><td>заполняет одну строку другой строкой</td></tr><tr><td>explode(separator , string \[,limit\]);

 implode(separator, array);

</td><td>разбитие / сборка</td></tr></tbody></table>

Сравнение и поиск строк:

<table border="1" id="bkmrk-soundex%28%29-%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30.6548%;"></col><col style="width: 69.4644%;"></col></colgroup><tbody><tr><td>soundex()</td><td>Сравнение степени похожести звучания (не написания) двух строк</td></tr><tr><td>metaphone()</td><td>Более мягкое сравнение степени похожести звучания (не написания) двух строк</td></tr><tr><td>similar\_text()</td><td>воз­вращает число одинаковых символов, которые есть в двух переданных стро­ках. В третий параметр, если он задан, заносится степень похожести двух строк, выраженная в процентах</td></tr><tr><td>levenshtein()</td><td>Вычисляет расстояние Левенштейна между двумя строками</td></tr><tr><td> substr(string, start \[, length \]);</td><td>  
</td></tr><tr><td>suЬstг\_соuпt(большая\_строка, маленькая\_строка)</td><td>сколько раз меньшая строка встречается в большей строке</td></tr><tr><td>substr\_replace(original, new, start \[, length \]); </td><td> заменяет часть строки original начинающуюся с символа с поряд­ковым номером start и длиной length строкой new и возвращает результат.   
Если не задан четвертый аргумент, substr\_replace() удаляет текст, начи­ная с позиции start до конца строки.

length в 0 для вставки без удаления

"" для удаления без вставки

Если start - отрицательное число, замена начинается с символа с порядко­вым номером start, считая от конца строки

Отрицательное значение аргумента length определяет количество символов   
от конца строки, на котором заканчивается замена

</td></tr><tr><td> strpos() strrpos()</td><td>первая / последняя позиция

</td></tr><tr><td> strspn(), strcspn()</td><td>длина участка. в начале строки, полностью соответствующего маске

</td></tr><tr><td> parse\_url()</td><td>массив составляющих URL

parse\_url("http:/ /me:secret@example.com/ cgi-bln/board?user=fred" );

(

\[scheme\] =&gt; http   
\[host\] =&gt; example.com   
\[user\] =&gt; me   
\[pass\] =&gt;· secrel   
\[path\] =&gt; /cgi-bln/board   
\[query\] =&gt; user=fred

)

</td></tr></tbody></table>

# Массивы

**Инициализация:**

```php
 $addresses = array("spam@cyberpromo.net", "abuse@example.com", "root@example.com" );
 $price = аггау( 
'прокладка'=> 15.29, 
'диск'=> 75.25, 
'шина' => 50.00 
); 

```

```php
$addresses[0] = "spam@cyberpromo.net"; 
$ргiсе['прокладка'] = 15.29;
```

**Добавление в конец:**

```php
$family[] = "Павел";
```

range(1, 50); создает массив последовательных чисел или символов между двумя заданными значениями.

count($family); кол-во элементов

**Многомерные массивы**

```php
$row0 = array( 1, 2, 3 ); 
$гоw1 = array(4,  5, 6); 
$row2 = array(7, 8, 9); 
$multi = array($гоw0, $гоw1, $row2);
```

**Копирование нескольких значений и вырезка:**

```php
list ($var1, ... ) = $аггау; 
```

Оставшиеся значения игнорируются. Если в массиве меньше - NULL.

```php
$subset = array_slice(array, offset,length); 
```

Если массив ассоциативный, то ключи заменяются на цифры.

```php
$nums = range(1, 7); 
$rows = array_chunk($nums, З);
```

rows\[0\] = (1,2,3); rows\[1\] = (4,5,6); rows\[3\] = (7);

**Обработка всего массива**

array\_sum(array) Возвращает сумму значений

array\_merge(arr1, arr2, ...) Объединение массивов

array\_diff(arr1, arr2) Разница

array\_filter(arr, callback) Каждое значение элемента передается в callback, в возвращаемом - только элементы, для которых callback вернул true. Ключи массива сохраняются.

**Использование в виде множеств**

```php
function arrayUnion($a, $b){
  $union = array_merge($a, $b);
  $union = array_unique($union);
  return $union;
  }
```

**Стек**

При помощи array\_push, array\_pop

**Разное**

array\_keys(array); - массив ключей

array\_key\_exists(key, аггау) - проверка существования ключа в массиве

in\_array(to\_find, аггау \[, strict\]) - поиск значений

$removed = array\_splice(array, start \[, length \[, replacement\] \]); - удаление/вставка элементов в массив

extroct{) - создание переменных из массива (ключи - имена)

compact() - из переменных массив

array\_walk{array, callable); - применение к каждому элементу функции, третий параметр - параметр функции (для нескольких - массив)

array\_search(элем, масс) - возвращает индекс найденного элемента

 in\_array() - есть или нет в массиве элемент

array\_reverse() - обратный порядок массива

array\_flip() - массив, в котором ключи стали значениями и наоборот

<table border="1" id="bkmrk-%D0%9F%D0%BE-%D0%B2%D0%BE%D0%B7%D1%80%D0%B0%D1%81%D1%82%D0%B0%D0%BD%D0%B8%D1%8E-%D0%9F%D0%BE-%D1%83%D0%B1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25.0298%;"></col><col style="width: 25.0298%;"></col><col style="width: 25.0298%;"></col><col style="width: 25.0298%;"></col></colgroup><thead><tr><td>  
</td><td>По возрастанию</td><td>По убыванию</td><td>Пользовательская</td></tr></thead><tbody><tr><td>Сортирует по значениям, затем обновляет индексы</td><td>sort()</td><td>rsort()</td><td>usort()</td></tr><tr><td>По значениям</td><td>asort()</td><td>arsort()</td><td>ausort()</td></tr><tr><td>По ключам</td><td>ksort()</td><td>krsort()</td><td>kusort()</td></tr></tbody></table>

Пользовательская сортировка требует предоставления функции, ко­торая принимает два значения и возвращает значение, которое определяет порядок двух переданных значений в отсортированном массиве. Функция должна вернуть 1, если первое значение больше, чем второе, -1, если первое значение меньше, чем \_второе и 0, если значения равны с точки зрения ва­шей функции сортировки.

# Объекты

**Создание класса:**

```php
class SimpleClass
{
    public $var = 'значение по умолчанию';
    private $privatevar = 57;
    protected $protperem = '8';
    static $mystat = 55; //изнутри обращаться через self
    static function someFunc() {
      echo "Hello!";
    }
    // Объявление метода
    public function displayVar() {
        echo $this->var;
    }
    private function displayPrivate() {
        echo $this->privatevar;
    }
}
```

**Наследование:**

```php
class Child extends Person {}
```

Вызов методов родительского и дочернего класса:

```php
parent::birthday();
self::birthday();
```

**Создание объекта:**

```php
$newobj = new ClassName($arg1, $arg2, ...);

$clname = "ClassName";
$newobj2 = new $clname;
```

**Доступ к свойствам и методам:**

```php
$some = $obj -> prop;
$some = $obj -> meth([]);
$some = $obj::methstat([]); 
```

**Клонирование объекта:**

```php
$b = clone $f;
```

Запрет переопределения методов

```php
final function lastFunc(){}
```