A good rule of thumb for remembering what the spaceship operator expression returns is to replace the spaceship operator with a minus sign (-). If the result is negative, 0 or positive, the expression will return -1, 0 or 1 respectively.
Example:
<?php
echo 5 <=> 8; // 5 - 8 = -3, prints -1
echo 2 <=> 2; // 2 - 2 = 0, prints 0
echo 4 <=> 2; // 4 - 2 = 2, prints 1Нови одлики
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Нови одлики
Референца за `migration70.new-features.php` со подобрена типографија и навигација.
Нови одлики
Декларации за скаларни типови
Скаларен
декларации на типови
доаѓаат во два вида: коерцивни (по дифолт) и строги. Следниве типови за параметри сега можат да се применат (или коерсивно или строго): низи (string), цели броеви (int), броеви со пловечка точка (float), и булови вредности (bool). Тие ги надополнуваат другите типови воведени во PHP 5: имиња на класи, интерфејси,
array and callable.
<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
int(9)
За да се овозможи строг режим, еден declare директива мора да биде поставена на врвот на датотеката. Ова значи дека строгоста на типовите за скалари се конфигурира на база на датотека. Оваа директива влијае не само на декларациите на типовите на параметрите, туку и на типот на вратената вредност на функцијата (види
декларации за тип на враќање), вградени PHP функции и функции од вчитани екстензии.
Целосна документација и примери за декларации на скаларни типови може да се најдат во . Секоја друга reference.
Декларации за тип на враќање
PHP 7 додава поддршка за декларации за тип на враќање. Слично на декларации за тип на аргумент, декларациите за тип на враќање специфицираат тип на вредност што ќе биде вратена од функција. Истите types се достапни за декларации за тип на враќање како што се достапни за декларации за тип на аргумент.
<?php
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]));Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Array
(
[0] => 6
[1] => 15
[2] => 24
)
Целосна документација и примери за декларации за тип на враќање може да се најдат во декларации за тип на враќање. референца.
Оператор за збивање на нула
Операторот за збивање на нула (??) е додаден како синтаксичко шеќер за честата потреба од користење на тернарна операција во комбинација со isset(). Враќа првиот операнд ако постои и не е null; инаку го враќа вториот операнд.
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>Оператор за вселенски брод
Операторот за вселенски брод се користи за споредување на два изрази. Враќа -1, 0 или 1 кога $a е соодветно помал од, еднаков на или поголем од $b. Споредбите се вршат според вообичаените PHP правила за споредба на типови.
<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>Константни низи користејќи define()
Низа константи сега можат да се дефинираат со
define(). Во PHP 5.6, тие можеа да се дефинираат само со
const.
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // outputs "cat"
?>Анонимни класи
Поддршката за анонимни класи е додадена преку new
class. Тие можат да се користат наместо целосни дефиниции на класи за еднократни објекти:
<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
object(class@anonymous)#2 (0) {
}
Целосна документација може да се најде во референца за анонимни класи.
Синтакса за бегство од Unicode кодно точка
Ова зема Unicode кодна точка во хексадецимална форма и ја испишува таа кодна точка во UTF-8 во двојно наводна низа или heredoc. Се прифаќа секоја валидна кодна точка, со опционални водечки 0.
<?php
echo "\u{aa}", PHP_EOL;
echo "\u{0000aa}", PHP_EOL;
echo "\u{9999}", PHP_EOL;
echo <<<EOT
\u{01f418}
EOT;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
ª ª (same as before but with optional leading 0's) 香
Closure::call()
Closure::call() е поефикасен, кратен начин за привремено врзување на опсегот на објектот со затворање и негово повикување.
<?php
class A {private $x = 1;}
// Pre PHP 7 code
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A'); // intermediate closure
echo $getXCB();
// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
1 1
Филтрирано unserialize()
Оваа функција има за цел да обезбеди подобра безбедност при десериализација на објекти на недоверливи податоци. Таа спречува можни инјекции на код со овозможување на програмерот да ги наведе класите што можат да бидат десериализирани.
<?php
// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);
// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);IntlChar
Новиот IntlChar класата има за цел да изложи дополнителна ICU функционалност. Самата класа дефинира голем број статични методи и константи што можат да се користат за манипулирање со unicode знаци.
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
10ffff COMMERCIAL AT bool(true)
За да се користи оваа класа, Меѓународен мора да биде инсталирана екстензијата.
Очекувања
Очекувањата се подобрување компатибилно со претходните верзии на постарата assert() функција. Тие овозможуваат искази со нулта цена во продукцискиот код и обезбедуваат можност за фрлање прилагодени исклучоци кога исказот не успее.
Додека стариот API продолжува да се одржува за компатибилност, assert() сега е програмски конструктор, дозволувајќи првиот параметар да биде израз наместо само string да се процени или bool вредност за тестирање.
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Fatal error: Uncaught CustomError: Some error message
Целосни детали за оваа функција, вклучително и како да се конфигурира во средини за развој и продукција, може да се најдат на страницата за рачно управување на assert() конструкцијата на јазикот.
Група use declarations
Класите, функциите и константите што се увезуваат од истото namespace
сега можат да се групираат заедно во еден use statement.
<?php
// Pre PHP 7 code
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ code
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>Изрази за враќање на генераторот
Оваа функција се надградува на функционалноста на генераторот воведена во PHP 5.5. Таа овозможува return изјава да се користи во генератор за да се овозможи враќање на конечен израз (враќање по референца не е дозволено). Оваа вредност може да се добие со помош на новиот
Generator::getReturn() метод, кој може да се користи само откако генераторот ќе заврши со давање вредности.
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
1 2 3
Можноста за експлицитно враќање на последната вредност од генератор е корисна способност. Ова е затоа што овозможува враќање на последната вредност од генератор (можеби од некој вид корутинско пресметување) што може конкретно да се обработи од клиентскиот код што го извршува генераторот. Ова е многу поедноставно отколку да се принуди клиентскиот код прво да провери дали последната вредност е дадена, а потоа, ако е така, да се обработи таа вредност конкретно.
Делегирање на генератор
Генераторите сега можат да делегираат на друг генератор,
Траверзабилно објект или array
автоматски, без потреба да се пишува дополнителен код во најоддалечениот генератор користејќи го yield from construct.
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
1 2 3 4
Целобројно делење со intdiv()
Новиот intdiv() функцијата врши целобројно делење на своите операнди и ја враќа. "
<?php
var_dump(intdiv(10, 3));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
int(3)
Опции за сесија
session_start() сега прифаќа array од опции што ги надминуваат директиви за конфигурација на сесијата нормално поставени во php.ini.
Овие опции исто така беа проширени за да поддржат
session.lazy_write, што е вклучено по дифолт и предизвикува PHP да презапише само датотека за сесија ако податоците од сесијата се променети, и read_and_close, што е опција што може да се помине само на session_start() за да се означи дека податоците од сесијата треба да се прочитаат и потоа сесијата веднаш да се затвори непроменета.
На пример, за да се постави
session.cache_limiter to
private и веднаш да се затвори сесијата по нејзиното читање:
<?php
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
?>preg_replace_callback_array()
Новиот preg_replace_callback_array() функцијата овозможува кодот да се пишува почисто кога се користи preg_replace_callback() функција. Пред PHP 7, повиците што требаше да се извршат по регуларен израз бараа функцијата за повикување да биде загадена со многу разгранување.
Сега, повиците можат да се регистрираат за секој регуларен израз користејќи асоцијативен список, каде што клучот е регуларен израз, а вредноста е повикување.
CSPRNG функции
Додадени се две нови функции за генерирање криптографски сигурни цели броеви и низи на податоци на крос-платформски начин: random_bytes() and random_int().
list() секогаш може да ги распакува објектите што имплементираат ArrayAccess
Претходно, list() не беше загарантирано дека ќе работи правилно со објекти што имплементираат ArrayAccess. Ова е поправено.
Други карактеристики
-
Додаден е пристап до членовите на класата при клонирање, на пр.
(clone $foo)->bar().
Белешки од корисници 3 белешки
In php 7.0 it's possible to curry functions in a way that's similar to JavaScript.
<?php
// A curried function
function add($a) {
return function($b) use ($a) {
return $a + $b;
};
}
// Invoking curried function in PHP 7
$result = add(10)(15);
var_dump($result); // int 25
?>
Currying in this way is not possible in php 5.6.As a finding aid, here is the ordered list of section titles on this page:
Scalar type declarations
Return type declarations
Null coalescing operator
Spaceship operator
Constant arrays using define()
Anonymous classes
Unicode codepoint escape syntax
Closure::call()
Filtered unserialize()
IntlChar
Expectations
Group use declarations
Generator Return Expressions
Generator delegation
Integer division with intdiv()
Session options
preg_replace_callback_array()
CSPRNG Functions
list() can always unpack objects implementing ArrayAccess
Other Features