class Locale
{
private string $languageCode;
private string $countryCode;
public function __construct(string $languageCode, string $countryCode)
{
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getLanguageCode(): string
{
return $this->languageCode;
}
public function setLanguageCode(string $languageCode): void
{
$this->languageCode = $languageCode;
}
public function getCountryCode(): string
{
return $this->countryCode;
}
public function setCountryCode(string $countryCode): void
{
$this->countryCode = strtoupper($countryCode);
}
public function setCombinedCode(string $combinedCode): void
{
[$languageCode, $countryCode] = explode('_', $combinedCode, 2);
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getCombinedCode(): string
{
return \sprintf("%s_%s", $this->languageCode, $this->countryCode);
}
}
$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->getCountryCode()); // BR
var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR
class Locale
{
public string $languageCode;
public string $countryCode
{
set (string $countryCode) {
$this->countryCode = strtoupper($countryCode);
}
}
public string $combinedCode
{
get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
set (string $value) {
[$this->countryCode, $this->languageCode] = explode('_', $value, 2);
}
}
public function __construct(string $languageCode, string $countryCode)
{
$this->languageCode = $languageCode;
$this->countryCode = $countryCode;
}
}
$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR
class PhpVersion
{
private string $version = '8.3';
public function getVersion(): string
{
return $this->version;
}
public function increment(): void
{
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
class PhpVersion
{
public private(set) string $version = '8.4';
public function increment(): void
{
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
#[\Deprecated]
RFC
Doc
class PhpVersion
{
/**
* @deprecated 8.3 use PhpVersion::getVersion() instead
*/
public function getPhpVersion(): string
{
return $this->getVersion();
}
public function getVersion(): string
{
return '8.3';
}
}
$phpVersion = new PhpVersion();
// No indication that the method is deprecated.
echo $phpVersion->getPhpVersion();
class PhpVersion
{
#[\Deprecated(
message: "use PhpVersion::getVersion() instead",
since: "8.4",
)]
public function getPhpVersion(): string
{
return $this->getVersion();
}
public function getVersion(): string
{
return '8.4';
}
}
$phpVersion = new PhpVersion();
// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead
echo $phpVersion->getPhpVersion();
#[\Deprecated]
rend le mécanisme d'obsolescence existant de PHP disponible pour les fonctions, méthodes et constantes de classe définies par l'utilisateur. $dom = new DOMDocument();
$dom->loadHTML(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
$classes = explode(" ", $node->className); // Simplified
var_dump(in_array("featured", $classes)); // bool(true)
$dom = Dom\HTMLDocument::createFromString(
<<<HTML
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)
Nouvelle API DOM offrant une prise en charge conforme aux standards pour l'analyse des documents HTML5, corrigeant plusieurs bogues de conformité de longue date dans le comportement des fonctionnalités DOM et ajoutant plusieurs fonctions pour faciliter la manipulation des documents.
La nouvelle API DOM est disponible dans l'espace de noms Dom
. Les documents utilisant cette API peuvent être créés à l'aide des classes Dom\HTMLDocument
et Dom\XMLDocument
.
$num1 = '0.12345';
$num2 = 2;
$result = bcadd($num1, $num2, 5);
echo $result; // '2.12345'
var_dump(bccomp($num1, $num2) > 0); // false
use BcMath\Number;
$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;
echo $result; // '2.12345'
var_dump($num1 > $num2); // false
BCMath vous permet de travailler avec des nombres flottants de précision arbitraire en PHP. Avec cette version, vous pouvez bénéficier du style orienté objet et de la surcharge des opérateurs pour utiliser les nombres BCMath.
Cela signifie que vous pouvez désormais utiliser les opérateurs standard avec les objets BcMath\Number
, ainsi que toutes les fonctions bc*
.
Ces objets sont immuables et implémentent l'interface Stringable
, afin d'être utilisés dans des chaînes de caractères tels que echo $num
.
array_*()
RFC
$animal = null;
foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) {
if (str_starts_with($value, 'c')) {
$animal = $value;
break;
}
}
var_dump($animal); // string(3) "cat"
$animal = array_find(
['dog', 'cat', 'cow', 'duck', 'goose'],
static fn (string $value): bool => str_starts_with($value, 'c'),
);
var_dump($animal); // string(3) "cat"
array_find()
, array_find_key()
, array_any()
et array_all()
sont désormais disponibles. $connection = new PDO(
'sqlite:foo.db',
$username,
$password,
); // object(PDO)
$connection->sqliteCreateFunction(
'prepend_php',
static fn ($string) => "PHP {$string}",
);
$connection->query('SELECT prepend_php(version) FROM php');
$connection = PDO::connect(
'sqlite:foo.db',
$username,
$password,
); // object(Pdo\Sqlite)
$connection->createFunction(
'prepend_php',
static fn ($string) => "PHP {$string}",
); // Does not exist on a mismatching driver.
$connection->query('SELECT prepend_php(version) FROM php');
Pdo\Dblib
, Pdo\Firebird
, Pdo\MySql
, Pdo\Odbc
, Pdo\Pgsql
et Pdo\Sqlite
de PDO
sont désormais disponibles. new MyClass()->method()
sans parenthèses. RFC
Doc
class PhpVersion
{
public function getVersion(): string
{
return 'PHP 8.3';
}
}
var_dump((new PhpVersion())->getVersion());
class PhpVersion
{
public function getVersion(): string
{
return 'PHP 8.4';
}
}
var_dump(new PhpVersion()->getVersion());
new
entre parenthèses. request_parse_body()
.bcceil()
, bcdivmod()
, bcfloor()
, et bcround()
.RoundingMode
pour round()
avec 4 nouveaux modes d'arrondi TowardsZero
, AwayFromZero
, NegativeInfinity
, et PositiveInfinity
.DateTime::createFromTimestamp()
, DateTime::getMicrosecond()
, DateTime::setMicrosecond()
, DateTimeImmutable::createFromTimestamp()
, DateTimeImmutable::getMicrosecond()
, et DateTimeImmutable::setMicrosecond()
.mb_trim()
, mb_ltrim()
, mb_rtrim()
, mb_ucfirst()
, et mb_lcfirst()
.pcntl_getcpu()
, pcntl_getcpuaffinity()
, pcntl_getqos_class()
, pcntl_setns()
, et pcntl_waitid()
.ReflectionClassConstant::isDeprecated()
, ReflectionGenerator::isClosed()
, et ReflectionProperty::isDynamic()
.http_get_last_response_headers()
, http_clear_last_response_headers()
, et fpow()
.XMLReader::fromStream()
, XMLReader::fromUri()
, XMLReader::fromString()
, XMLWriter::toStream()
, XMLWriter::toUri()
, et XMLWriter::toMemory()
.grapheme_str_split()
._
comme nom de classe est désormais obsolète.round()
déclenche une ValueError
.date
, intl
, pdo
, reflection
, spl
, sqlite
, xmlreader
sont désormais typées.GMP
est désormais final.MYSQLI_SET_CHARSET_DIR
, MYSQLI_STMT_ATTR_PREFETCH_ROWS
, MYSQLI_CURSOR_TYPE_FOR_UPDATE
, MYSQLI_CURSOR_TYPE_SCROLLABLE
, et MYSQLI_TYPE_INTERVAL
ont été supprimées.mysqli_ping()
, mysqli_kill()
, mysqli_refresh()
, méthodes mysqli::ping()
, mysqli::kill()
, mysqli::refresh()
, et constantes MYSQLI_REFRESH_*
sont désormais obsolètes.stream_bucket_make_writeable()
et stream_bucket_new()
renvoient désormais une instance de StreamBucket
au lieu de stdClass
.exit()
.E_STRICT
est désormais obsolète.