php / php/php-src

[8.4] Widening property hook's type for promoted property does not work

Offen
#16,638 10 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Feature Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

The following code:

<?php

declare(strict_types=1);

class Foo
{
    public function __construct(
        public int $baz { set (int|string|stdClass $value) {
            if (is_int($value)) {
                $this->baz = $value;
            } else if ($value instanceof stdClass
                && property_exists($value, 'baz')
                && is_int($value->baz)
            ) {
                $this->baz = $value->baz;
            } else if (is_numeric($value)) {
                $this->baz = (int) $value;
            } else {
                throw new InvalidArgumentException('Invalid value');
            }
        } },
    ) {}
}

$obj = new stdClass();
$obj->baz = 123;

var_dump(new Foo($obj));

Resulted in this output:

Fatal error: Uncaught TypeError: Foo::__construct(): Argument #1 ($baz) must be of type int, stdClass given, called in /in/2mZY5 on line 29 and defined in /in/2mZY5:7
Stack trace:
#0 /in/2mZY5(29): Foo->__construct(Object(stdClass))
#1 {main}
  thrown in /in/2mZY5 on line 7

But I expect this to work instead, just like when property is not promoted.

Originally encountered when preparing Twitter thread.

PHP Version

8.4 (current master)

Operating System

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Beispiel für die promoted property im Issue zu reproduzieren, und vergleiche es mit dem dort verlinkten Beispiel für die nicht-promoted property. Verfolge, wo das Konstruktorargument typgeprüft wird und wo der Property-Hook die Zuweisung verarbeitet; als erledigt gilt die Aufgabe, wenn der promoted-Fall wie erwartet den erweiterten Eingabetyp des Hooks akzeptiert und einen Regressionstest hat.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.