Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#175 0 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@simon-mundy ya está trabajando en esto.

Desde el 24/8/2026.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

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.

Lenguaje dominante
PHP
Estrellas
18
Forks
8
Merge medio
6 d 11 h
PR fusionados (30 d)
14

Preparar el entorno

  • Incluye un Dockerfile o un archivo de Docker Compose
  • Sin plantilla de pull request
  • Sin guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de php-db/phpdb

Todos los issues de php-db/phpdb

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.