НовыС возмоТности

Π―Π΄Ρ€ΠΎ PHP

Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ свойства

Бвойства класса Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ объявлСния Ρ‚ΠΈΠΏΠΎΠ².

<?php

class User
{
public
int $id;
public
string $name;
}
ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ свойству $user->id получится ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния с Ρ‚ΠΈΠΏΠΎΠΌ int, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ свойству $user->name β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния с Ρ‚ΠΈΠΏΠΎΠΌ string.

Π‘Ρ‚Ρ€Π΅Π»ΠΎΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘Ρ‚Ρ€Π΅Π»ΠΎΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” сокращённая запись для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с нСявной привязкой Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ области видимости ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

<?php

$factor
= 10;
$nums = array_map(fn ($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Π°Ρ ковариация Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

<?php

class A {}
class
B extends A {}

class
Producer
{
public function
method(): A {}
}

class
ChildProducer extends Producer
{
public function
method(): B {}
}
Полная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° вариантности доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π°Π²Ρ‚ΠΎΠ·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ классов. НСльзя ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΈΠΏΡ‹ цикличСски Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ ссылкС Π½Π° класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ° нСдоступСн, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка.
<?php

/**
* Класс удовлСтворяСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ подстановки Π‘. Ли́сков (Π°Π½Π³Π». Liskov Substitution Principle, LSP),
* ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс C ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΡƒ A,
* Π½ΠΎ ΠΏΡ€ΠΈ объявлСнии класса B класс C Π΅Ρ‰Ρ‘ нСдоступСн
*/
class A
{
public function
method(): A {}
}

class
B extends A
{
// Fatal error: Could not check compatibility between B::method():C and
// A::method(): A, because class C is not available
public function method(): Π‘ {}
}

class
C extends B {}

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ объСдинСния с null

<?php

$array
['key'] ??= computeDefault();

// ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° null с присваиваниСм β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ:
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}

Распаковка Π²Π½ΡƒΡ‚Ρ€ΠΈ массивов

<?php

$parts
= ['apple', 'pear'];

$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π² числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ…

ΠœΠ΅ΠΆΠ΄Ρƒ Π·Π½Π°ΠΊΠ°ΠΌΠΈ числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ символы подчёркивания.

<?php

6.674_083e-11
; // число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ
299_792_458; // дСсятичноС число
0xCAFE_F00D; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ число
0b0101_1111; // Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ число

Π‘Π»Π°Π±Ρ‹Π΅ ссылки

Π‘Π»Π°Π±Ρ‹Π΅ ссылки Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ программисту Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, которая Π½Π΅ прСпятствуСт ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сборщиком мусора, ΠΊΠΎΠ³Π΄Π° ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² магичСском ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ __toString()

Π’ магичСском ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ __toString() Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. РаньшС это Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ошибки ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² строку ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ класса Error.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ cURL

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ станадртным названиям Ρ„Π°ΠΉΠ»ΠΎΠ² класс CURLFile Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ, Ссли ΠΌΠΎΠ΄ΡƒΠ»ΡŒ собрали с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ libcurl >= 7.56.0.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Filter

Π€ΠΈΠ»ΡŒΡ‚Ρ€ FILTER_VALIDATE_FLOAT Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ min_range ΠΈ max_range, с Ρ‚Π΅ΠΌ ΠΆΠ΅ смыслом, Ρ‡Ρ‚ΠΎ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ FILTER_VALIDATE_INT.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ FFI

FFI β€” Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ простой способ Π²Ρ‹Π·ΠΎΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, доступа ΠΊ встроСнным ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ способ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ структурам Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π½Π° языкС Π‘ΠΈ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ GD

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ константу IMG_FILTER_SCATTER для примСнСния Ρ€Π°ΡΡΠ΅ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΊ изобраТСниям.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Hash

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° crc32c, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычисляСт Β«Ρ…Π΅ΡˆΒ» Π½Π° основС ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° ΠšΠ°ΡΡ‚Π°Π½ΠΎΠ»ΠΈ. Π‘ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° CRC32 Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ систСмы хранСния Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ iSCSI, SCTP, Btrfs ΠΈ ext4.

ΠœΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mb_str_split(), которая выполняСт Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ функция str_split(), Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Π° Π½Π΅ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ OPcache

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ΄Π°.

РСгулярныС выраТСния, совмСстимыС с синтаксисом языка Perl

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ preg_replace_callback() ΠΈ preg_replace_callback_array() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ flags с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ„Π»Π°Π³ΠΎΠ² PREG_OFFSET_CAPTURE ΠΈ PREG_UNMATCHED_AS_NULL. Он повлияСт Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ массива ΡΠΎΠ²ΠΏΠ°Π²ΡˆΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ PDO

Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ DSN-строки Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² mysql, mssql, sybase, dblib, firebird ΠΈ oci. РаньшС это ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° pgsql. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Π΅Π΅, Ссли имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΈ Π² конструкторС, ΠΈ Π² DSN-строкС.

Π’ SQL-запросах Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π—Π°ΠΏΠΈΡΡŒ ?? ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ Π·Π½Π°ΠΊ вопроса Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π‘Π£Π‘Π” PostgreSQL, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ?, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, содСрТит Π»ΠΈ столбСц JSON ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡.

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ PDO_OCI

Для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступСн ΠΌΠ΅Ρ‚ΠΎΠ΄ PDOStatement::getColumnMeta().

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ PDO_SQLite

Π’Ρ‹Π·ΠΎΠ² PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, доступСн Π»ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ запрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, Ρ‚. Π΅. Π½Π΅ измСняСт Π»ΠΈ запрос Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈ установкС PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ PDO::errorInfo() ΠΈ PDOStatement::errorInfo() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ошибок Π‘Π£Π‘Π” SQLite3.

SQLite3

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ SQLite3::lastExtendedErrorCode(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ послСдний Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ошибки.

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ SQLite3::enableExtendedResultCodes($enable = true), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставит ΠΌΠ΅Ρ‚ΠΎΠ΄ SQLite3::lastErrorCode() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ошибок.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка

Ѐункция strip_tags() с массивом ΠΈΠΌΡ‘Π½ Ρ‚Π΅Π³ΠΎΠ²

Ѐункция strip_tags() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ массив Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… Ρ‚Π΅Π³ΠΎΠ²: вмСсто strip_tags($str, '<a><p>') Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ strip_tags($str, ['a', 'p']).

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… магичСских ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: __serialize ΠΈ __unserialize.

<?php

// ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для сохранСния цСлостного состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
public function __serialize(): array {}

// ВосстанавливаСт состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· массива Π΄Π°Π½Π½Ρ‹Ρ…
public function __unserialize(array $data): void {}
Новый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации замСняСт интСрфСйс Serializable, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΡΡ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ слияния массивов Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ array_merge() ΠΈ array_merge_recursive() стали ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ пустой массив. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ с распаковкой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° spread-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ: array_merge(...$arrays).

Ѐункция proc_open()

Ѐункция proc_open() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ массив вмСсто строки для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ процСсс открываСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π° PHP экранируСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ссли потрСбуСтся.

<?php

proc_open
(['php', '-r', 'echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€\n";'], $descriptors, $pipes);

Ѐункция proc_open() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ дСскрипторы redirect ΠΈ null.

<?php

// Π’ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ 2>&1 Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);

// Π’ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ 2>/dev/null ΠΈΠ»ΠΈ 2>nul Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);

Алгоритмы Argon2i ΠΈ argon2id Π±Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libargon

Ѐункция password_hash() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ argon2i ΠΈ argon2id ΠΈΠ· модуля Sodium, Ссли PHP собрали Π±Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libargon.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 2 notes

up
102
Rain ΒΆ
6 years ago
It should be noted that typed properties internally are never initialized to a default null. Unless of course you initialize them to null yourself. That's why you will always going to encounter this error if you try to access them before initialization.

**Typed property foo::$bar must not be accessed before initialization**

<?php
class User
{
    public $id;
    public string $name; // Typed property (Uninitialized)
    public ?string $age = null; //  Typed property (Initialized)
}

$user = new User;
var_dump(is_null($user->id)); // bool(true)
var_dump(is_null($user->name)); // PHP Fatal error: Typed property User::$name must not be accessed before initialization
var_dump(is_null($user->age));// bool(true)
?>

Another thing worth noting is that it's not possible to initialize a property of type object to anything other than null.  Since the evaluation of properties happens at compile-time and object instantiation happens at runtime. One last thing, callable type is not supported due to its context-dependent behavior.
up
5
wow-apps.pro ΒΆ
6 years ago
<?php

// How to get property type? For example for testing:

class Foo
{
    private int $num;
    private bool $isPositive;
    private $notes;
}

$reflection = new \ReflectionClass(Foo::class);
$classProperties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE);
foreach ($classProperties as $classProperty) {
    var_dump((string) $classProperty->getType());
}

/**
 * Result:
 * "int"
 * "bool"
 * ""
 */