Сейчас, наконец, стал актуален PHP 7.*
На него собираются мигрировать все большие фреймворки:
Symfony, Zend, Yii, Laravel.
Никуда не собирается деваться.
phpng рулит! От 5% до 70% прироста без изменения кода.
Раньше ещё имелся смысл использовать массивы вместо объектов из соображений экономии. Теперь его почти нет. Семёрка кушает вдвое меньше.
\Error
или \ParseError
.foreach
не смещает указатель.Раньше приходилось писать polyfill-ы.
declare(strict_types=1)
) и нет.
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));
Строгость позволяет выловить целый класс ошибок на этапе написания кода.
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
null
нельзя.
$username = $_GET['user'] ?? 'nobody';
// то же, что и
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// можно и так:
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
https://wiki.php.net/rfc/combined-comparison-operator
Пользуетесь?
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
Нужно редко. Лучше не увлекаться.
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
Очень удобно.
Временно привязывает замыкание к объекту и вызывает его с параметрами.
Этим можно делать хаки вроде гидрации.
class Value {
protected $value;
public function __construct($value) {
$this->value = $value;
}
public function getValue() {
return $this->value;
}
}
$three = new Value(3);
$closure = function ($delta) { var_dump($this->getValue() + $delta); };
$closure->call($three, 4);
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
Можно не париться :)
Проверки для отладки, разработки и тестов. Не влияют на продакшн (zend.assertions
, php.ini).
assert(true == false);
Хорошая альтернатива строгим проверкам всего и выкидыванию исключений.
// 'new', 'private', and 'for' were previously unusable
Project::new('Project Name')->private()->for('purpose here')->with('username here');
Привет, приятные DSL!
getenv()
научился не учитывать SAPI.
function testReturn(): ?string
{
return 'elePHPant';
}
Ура!
Запрещает возвращать что либо из функции.
function acceptsObject(object $obj) {
...
}
Иногда может быть полезно. Например, сериализация.
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
[$id1, $name1] = $data[0];
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}
["id" => $id1, "name" => $name1] = $data[0];
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
https://wiki.php.net/rfc/iterable
Раньше надо было проверять is_array() && instanceof \Traversable
.
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}
Просто немного удобней.
Дмитрий Стогов не дремлет!
https://wiki.php.net/rfc/allow-abstract-function-override
Зачем?!
Можно использовать в password_hash()
и password_verify()
.
Libsodium — более простая и понятная альтернатива mcrypt и openssl.
$this->request->data['comments']['user_id'] =
$this->request->data['comments']['user_id'] ?? 'value';
↓
$this->request->data['comments']['user_id'] ??= 'value';
Добивайтесь этого как только можете.
Практически все большие фреймворки переходят на 7.1.