Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

Sql\Platform: decorator contract is incomplete and Platform's per-platform registry is unused

Offen
#175 0 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@simon-mundy arbeitet bereits daran.

Seit 24.8.2026.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Beschreibung

Summary

PlatformDecoratorInterface declares only setSubject(), but every caller of
AbstractPlatform::getTypeDecorator() immediately calls getSqlString() or
prepareStatement() on the result. Those methods are not on the contract, so the
calls are unprovable and the analyzer reports them as calls to non-existent methods.

Separately, Platform stores its decorators in a per-platform map
([platformName][class => decorator]) while AbstractPlatform — which every driver
package extends — stores a flat [class => decorator] map. The two shapes share one
property name, so the property cannot be typed.

Together these account for 26 of the 28 analyzer findings in src/Sql/Platform.

Proposed change

  1. PlatformDecoratorInterface extends SqlInterface, PreparableSqlInterface. Every
    decorator in the ecosystem already satisfies this — they all extend Select,
    Insert, Update, Delete, CreateTable or AlterTable.
  2. setSubject() no longer accepts null, matching the non-nullable $subject
    property it assigns to. Passing null is currently a TypeError.
  3. Remove the per-platform decorator registry from Platform. It has no callers: the
    three-argument setTypeDecorator() and two-argument getTypeDecorator() are never
    invoked anywhere in this repository or in any driver package, and no test registers
    decorators for more than one platform. Platform then inherits the flat map, like
    every driver.
  4. Mark Platform final.
  5. Remove the two now-unreachable guards in Sql::buildSqlString() and
    Sql::prepareStatementForSqlObject(), and the two tests covering them.

Compatibility

AbstractPlatform is unchanged in shape and signature, so phpdb-mysql and
phpdb-sqlite, which extend it and call the two-argument setTypeDecorator(), are
unaffected. phpdb-sqlite's reflection test on decorators still passes.

phpdb-pgsql instantiates Sql\Platform\Platform directly in
AdapterPlatform::getSqlPlatformDecorator(). It registers no decorators and calls none
of the removed methods. Verified by installing phpdb-pgsql against this branch and
against 0.6.x: both produce SELECT "users".* FROM "users" from the same probe.

phpdb-{ibmdb2,oci8,sql92,sqlsrv} will carry their own copy of
PhpDb\Sql\Platform\* and will have no runtime dependency on php-db/phpdb.

Breaking changes

Removed from Platform: the three-argument setTypeDecorator(), the two-argument
getTypeDecorator(), the getDecorators() override and the protected
resolvePlatformName(). Platform becomes final. No known caller uses any of them.

Notes

This addresses the @todo sat-migration block in Platform::__construct(). That approach has been
superseded by each driver shipping its own platform class.

Vorherrschende Sprache
PHP
Sterne
18
Forks
8
Ø Merge
6 T. 11 Std.
Gemergte PRs (30 T.)
14

Entwicklungsumgebung

  • Enthält ein Dockerfile oder eine Docker-Compose-Datei
  • Keine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus php-db/phpdb

Alle Issues in php-db/phpdb

Ähnliche Issues

Weitere Issues zu PHP

Neue Issues direkt in Ihr Postfach

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