Типы переменных

Скалярные

  • bool
  • int
  • float
  • string

Составные

  • array
  • object
  • callable — вызываемые функции
  • iterable

Специальные

  • resourse — пути к файлам или api и тд
  • null
gettype($var); // вернет тип переменной
var_dump($var); // вернет тип и значение

//php имеет динамическую типизацию, но если нам такое не надо то
declare(strict_types=1); // так называемый строгий режим

Допустимые преобразования типов

(int)$variable - cast to int
(bool)$variable - cast to bool
(float)$variable - cast to float
(string)$variable - cast to string
(array)$variable - cast to array
(object)$variable - cast to object
(unset)$variable - cast to NULL

Таблицы сравнения типов PHP

Boolean

$isComplite = true; // не база а целый генштаб
// integers 0   -0   будут преобразованы в false
// floats 0.0  -0.0  будут преобразованы в false
// Тоже самое для ''  '0'  []  null 

echo $isComplite; // 1   ну а для false пустая строка

Integer

PHP_INT_MIN , PHP_INT_MAX //покажут лимиты для чисел
$x = 10; //что может быть проще
$x = 0x2A; // 16я система, в 10 это 42

echo PHP_INT_MAX + 1; // допустимо но вывод будет в типе float
echo (int) '5.9'; // 5  дробная часть отбрасывается
echo (int) 'dadada'; // 0 в случае если преобразовать нельзя
is_int($x); // является ли целым числом

$x = 2_000_000_000; // после 7.4 это считается нормальным числом, просто для удобства
echo (int)'2_000_000_000'; //2 такая вот особенность

Float

$x = 13.5;
$x= 13.5e3; // 13500
$x= 13.5e-3; // 0.0135
PHP_FLOAT_MIN , PHP_FLOAT_MAX //покажут лимиты для чисел

//удивительное крепление для рук
floor((0.1 + 0.7) * 10) // неожиданно 7 а не 8 - округление в меньшую сторону
ceil((0.1 + 0.7) * 10) // 8 как и ожидалось - округление в большую сторону
ceil((0.1 + 0.2) * 10) // 4, округляем 0.30000000000000004 в большую сторону
// сравнивать числа с плавающей точкой - фатальная ошибка
1 - 0.77 != 0.23 // живи теперь с этим

PHP_FLOAT_MAX + 1 = INF;  // за буйки не заплываем
$x= '10.12a'; $y = 'dasdads';
echo (float)$x, ' ', (float)$y; // 10.12 0

String

Строка — есть последовательность символов.

$name = 'Bezdel`nik';

echo $name[0]; // B  Обращение к символу по его индексу
echo $name[-1]; // k  обратная нумерация, начинается с 1
$name[99] = 'I'; // допустимо выйти за размер строки, пустые позиции заполняются пробелами

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

// Heredoc
$text = <<<TEXT
можно и просто так $x
<p>а можно и с тегами $y </p>
TEXT;

// Nowdoc - в этом варианте переменные остаются в виде текста
$text = <<<'TEXT'
Line 1 $x
Line 2 $y
TEXT;

echo nl2br($text); // вывод с учетом переноса строки

NULL

is_null($x); // проверка
$x === NULL;  // допустимая проверка

var_dump($y); // Warning увидим если переменная не определена, но в дампе будет NULL
var_dump((string)$x); // '' пустая строка
var_dump((int)$x); // 0
var_dump((bool)$x); // false

Array

$lang = array('PHP','Java','Python'); // для бумеров
$lang = ['PHP','Java','Python']; // для зумеров

echo $lang[1]; // Java
echo $lang[-1]; // Warning, за это бан
echo $lang[99]; // Warning, за это бан

isset($lang[99]); // проверка на существование ключа вернет true или false так же false если значение ключа NULL
array_key_exists(ключ, масиив); //проверка только на то что ключ есть


echo '<pre>', print_r($lang), '</pre>'; // допустимый вывод массива

count($lang); // 3 - размер массива

$lang[] = 'value'; // добавит элемент в конец массива
array_push($lang,'C','C++','GO'); // добавление нескольких элементов в конец

// ассоциативный массив
$lang = [
'php' => '8.0',
'python' =>'3.9.1',
];

$lang['php']; // 8.0

// многомерные массивы
$lang = [
'php' => [
  'version' => '8.0',
  'someData' => [
    'explain' => 'и так сколько угодно',
    ],
  'arrays' =>[
    [1,2,3],
    [1,2,3]
    ]
  ]
]

echo $lang['php']['version']; // 8.0

//нумерация автоматическая
$lang['php', 'go', 50 => 'C', 'C++']; //  [0]=>php, [1]=>go, [50]=>C, [51]=>C++  

array_pop($lang); // удалит последний элемен
array_shift($lang); 
// удалит первый элемент
// нумерация произойдет заного если индексы были числовые
// индексы строчные останутся без изменений

unset($lang[2]); //удаляет конкретный элемент, переиндексация не происходит