PHP þróun. Symfony Console-íhlutur – ráð og brellur
Þessi grein var búin til með það að markmiði að sýna þér gagnlegustu og áhrifaríkustu ráðin og brellurnar varðandi Symfony Console-þróun.
Nýja útgáfan af PHP er handan við hornið. Hvaða nýju innleiðingarnar ættir þú að þekkja? Skoðaðu þessa grein til að komast að því!
Hér er tómt.PHP 8.2 Er að fara að koma út. Kannski verður þetta útgáfan sem gerir uppfærslu í PHP 8 aðlaðandi fyrir alla. Tölum um hvað forritarar geta hlakkað til með PHP 8.2 og undirbúa fyrir nýjustu útgáfuna. En fyrst skulum við fljótt fara yfir allar PHP-útgáfurnar og breytingarnar í gegnum árin.
Hvað gerirðu með þessu?
class User {
public int $id;
public string $name;
}
Spurningarmerki
Hvað gerirðu með þessu?
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
Spurningarmerki
Hvað gerirðu með þessu?
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
Hvað gerirðu með þessu?
$array['key'] ??= computeDefault();
// er gróflega jafngilt þessu
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
Hvað gerirðu með þessu?
$parts = ['epli', 'perur'];
$fruits = ['banani', 'appelsína', ...$parts, 'vatnsmelóna'];
// ['banani', 'appelsína', 'epli', 'perur', 'vatnsmelóna'];
?>
Hvað gerirðu með þessu?
// Skilar fylki sem inniheldur alla nauðsynlega stöðu hlutins.
public function __serialize(): array;
// Endurheimtir stöðu hlutins úr gefinni gögn rað.
opinber aðferð __unserialize(rað $data): ekkert;
?>
Gefinn út í nóvember 2020, færði PHP 8.0 okkur besta eiginleikarnir hingað til, sem innihalda:
htmlspecialchars($string, double_encode: false); Hljóðskrift
class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
echo match (8.0) {
'8.0' => "Ó nei!",
8.0 => "Þetta er það sem ég bjóst við",
};
//> Þetta er það sem ég bjóst við
$land = $fundur?->notandi?->fáHeimilisfang()?->land;
enum Status
{
case Draft;
case Published;
case Archived;
}
function acceptStatus(Status $status) {...}
class BlogData
{
public readonly Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
}
$foo = $this->foo(...);
$fn = strlen(...);
class Service
{
private Logger $logger;
public function __construct(
Logger $logger = new NullLogger(),
) {
$this->logger = $logger;
}
}
function count_and_iterate(Iterator&Countable $value) {
foreach ($value as $val) {
echo $val;
}
count($value);
}
$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];
PHP 8.2 Kynnir frekari breytingar sem miða að því að auðvelda forritaranum lífið og hámarka vinnu hans enn frekar. Hér að neðan er listi yfir nýja eiginleika.
Ein af stærstu umbótunum í nýrri útgáfu af PHP er að hægt sé að búa til beint a Aðeins lesanlegt class. Flokkur sem er lýst með þessari eiginleika mun sjálfkrafa miðla honum til breyta sinna. DTO-flokkar munu nú líta snyrtilegir og hreinir út!
readonly class InvoiceDTO
{
public function __construct(
public UUID $uuid,
public Issuer $issuer,
public DateTime $issuedAt,
) {}
}
Önnur stórbreytingin er úrelding dýnamískra breyta í flokkum. Eftirfarandi innleiðing mun kasta úreldingaviðvörun í PHP 8.2 og Villuundantekning í framtíðarútgáfu af PHP.
class MyUser
{
public string $name;
}
(...)
$myUser->name = 'Name'; // OK
$myUser->surname = 'Surname'; // úrelt / villuundantekning
Það er þess virði að nefna að flokkar sem innleiða __fá og __setja aðferðir og flokkar sem erfa beint frá staðlaður flokkur getur enn innleitt töfraaðferðir án hindrana.
Hér vísa ég einnig til einn Áhugaverð umræða á GitHub, þar sem forritarar PHP-CS ræða þessa breytingu og þörfina á að breyta vinsæla tóli sínu fyrir nýju útgáfuna af forritunarmálinu.
Að lokum, en ekki síður mikilvægt, geturðu slökkt á þessu atferli með athugasemd.
#[AllowDynamicProperties]
class MyUser
{
public string $name;
}
$myUser->surname = 'Surname'; // OK
Ekkert gildi, sannur, og rangtÞangað til núna hafa fall sem alltaf skiluðu a sannur eða rangt gildi þurfti að vera lýst með a Búll tegund.
function alwaysTrue(): bool { return true; }
Frá og með nú getum við notað sannur og rangt sem einföld gerðir í gildum sem falla frá fallum.
function alwaysTrue(): true { return true; }
(DNF) er staðlað sniðmát til að skipuleggja boolska tjáningar. Nánar tiltekið felur það í sér að byggja boolska tjáningu upp sem röð af AND-skilyrðum sem eru tengd með OR. Þegar það er notað við gerðartilkynningar gerir það kleift að skrifa sameinaðar Union- og Intersection-gerðir á staðlaðan hátt sem greinarinn getur meðhöndlað.
Þetta er stór breyting, því við getum nú haft null-gildisgengil skurðpunkta, til dæmis:
function getFullName((HasName&HasSurname)|null $user) { ... }
Ég er ekki mikill talsmaður þess að nota Traits og slík breyting er mér eingöngu útlitsleg, sérstaklega þar sem hún leyfir þér ekki að nota gildi Traits án þess að frumstilla hlutinn.
trait Foo {
public const FLAG_1 = 1;
protected const FLAG_2 = 2;
private const FLAG_3 = 2;
public function doFoo(int $flags): void {
if ($flags & self::FLAG_1) {
echo 'Fékk fánann 1';
}
if ($flags & self::FLAG_2) {
echo 'Fékk fánann 2';
}
if ($flags & self::FLAG_3) {
echo 'Fékk fánann 3';
}
}
}
Ein af mikilvægustu breytingunum sem ég hlakka til. Í nýjustu útgáfunni af PHP munum við geta merkt breytur sem NæmurBreytugildi. Hvers vegna ættum við?
Stack-traces í undantekningum hjá PHP eru mjög gagnleg við villuleit, en þau gera þér kleift að skoða gildi breyta fyrirfram. Til dæmis skulum við ímynda okkur PDO. kóði var notað til að tengjast gagnagrunni. Villusporið myndi líta svona út:
PDOException: SQLSTATE[HY000] [2002] Engin slík skrá eða skráarvisti í /var/www/html/test.php:3
Stafsröð:
#0 /var/www/html/test.php(3): PDO->__construct('mýs-kú:host=loca...', 'root', 'password')
#1 {main}
Eftir að hafa notað athugasemd #[NæmurParámétur] Stakksporið okkar mun ekki lengur sýna gildi breytunnar.
function test(
$foo,
#[SensitiveParameter] $bar,
$baz)
{
throw new Exception('Error');
}
test('foo', 'bar', 'baz');
/*
Banvæn villa: Ekki tekin upp Exception: Error í test.php:8
Staplaga:
0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz')
1 {main}
kastað í test.php á línu 8
*/
Sem höfundur segir
, Aðalhvatinn að þessari breytingu er að gera kleift að sækja nafn- og gildiseiginleika á stöðum þar sem ekki er heimilt að nota enum-hluti, eins og í lyklum fylkja. Við gætum unnið að því að bæta fylki svo þau gætu verið stækkuð til að leyfa enum eða alla hluti sem lykla, en það er einfaldara að leyfa að sækja eiginleika enum-hluta.
enum A: string {
case B = 'B';
const C = [self::B->value => self::B];
}
Áður en núverandi útgáfa var tekin upp virkuðu fastar aðferðir svona:
DateTime::createFromImmutable(): DateTime
DateTimeImmutable::createFromMutable(): DateTimeImmutable
Í PHP 8.2 Það verður breytt í:
DateTime::createFromImmutable(): static
DateTimeImmutable::createFromMutable(): static
Þetta er brottröskun fyrir bókasafnsgerendur og/eða allar sérsniðnar útfærslur á DateTime.
Þetta voru tvær fall sem þjónuðu ekki tilgangi sínum, þar sem þær umbreyttu aðeins á milli Íslenskur staðall ISO-8859-1 og UTF-8. Handbók PHP mælir með að nota mb_umbreyta_kóðun í staðinn.
Svæðisnæmi er best lýst af höfundi RFC-skjalsins:
Áður en PHP 8.0 kom út var staðfærsla PHP stillt úr umhverfinu. Þegar notandi setur upp Linux spyr það hvaða tungumál hann vill að það sé. Notandinn kann að meta ekki algerlega afleiðingar þessa valkosta. Það stillir ekki aðeins notendaviðmótsmálið fyrir innbyggðum skipunum, heldur breytir það einnig víðtækt hvernig stafræðisvinnsla í C-bókasafninu virkar. Til dæmis myndi notandi sem velur “tyrknesku” við uppsetningu Linux finna að forrit sem kalla toupper(‘i’) myndu fá punktstóruðu stóru I-ið (U+0130, “İ”).
Í tímum staðlaðra textamiðaðra samskiptaprótókolla er náttúrulegt mál minnihlutaforrit til stórbokksbreytingar. En jafnvel þótt notandinn vildi nota náttúrulegt mál til stórstafaumbrots, myndi hann ólíklega ná árangri með strtolower(). Þetta er vegna þess að hún vinnur strenginn einn bita í einu og sendir hvern bita til tolower() í C-bókasafninu. Ef inntakið er UTF-8, sem er langvinsælasta nútímavalkosturinn, mun strtolower() skemma strenginn og yfirleitt framleiða ógilda UTF-8 sem útkomu.
PHP 8.0 hætti að virða umhverfibreytur locale. Þannig er locale alltaf “C” nema notandinn kalli sérstaklega á setlocale(). Þetta þýðir að meirihluti ósamrýmanlegra breytinga er þegar að baki. Öll forrit sem treysta á kerfis-locale til stórstafa-/smástafa umbreytingar á gömlum 8-bita stafasettum hefðu brotnað með PHP 8.0.
Þetta þýðir að allar aðgerðir hér að neðan munu framkvæma ASCII-stafahæðarbreytingu frá PHP.8.2:breyta stafi í lágstafi, strtoupper, stristr, strípós, strripos, lcfirst, ucfirst, háskólaorð, str_ireplace
Við höfum margar leiðir til að innlimma breytur í strengi í PHP:
– Beint innlimun breyta (“$foo”)
– Setta utan um breytuna (“{$foo}”)
– Braces eftir dollartákninum (“${foo}”)
– Breytilegar breytur (“${expr}”, sem jafngildir (string) ${expr})
Til að forðast rugling og misnotkun munu þær ekki virka lengur:
"Halló ${heimurinn}";
Úrelt: Notkun ${} í strengjum er úrelt
"Halló ${(heimurinn)}";
Úrelt: Notkun ${} (breytilegra breyta) í strengjum er úrelt
Þetta eru ekki allar breytingarnar sem PHP 8.2 mun bjóða okkur. Því miður fengum við enn ekki stuðning við almenn gerðir, samkvæmt því sem Nikita sagði að monómorfuðu almennu gerðirnar myndu bæta of mikið við afköst og að endurmynduð almenn gerðir krefðust margra breytinga í allri kóðagrunninum. Það sem þó ber að athuga er aga og sýn hjá vara. Breytingarnar sem hafa verið innleiddar í hverri nýrri útgáfu tungumálsins verða sífellt skýrari, og áhugasamir munu taka eftir því að PHP er að færast í rétta átt bæði hvað varðar einfaldaða setningagerð og stuðning við nýjungar. Ég geri ráð fyrir að þegar á næsta ári munum við sjá kallanlegur sem gildur tegund.
