[ 
https://issues.apache.org/jira/browse/THRIFT-5964?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Volodymyr Panivko updated THRIFT-5964:
--------------------------------------
    Description: 
Currently, Thrift enums are emitted as final classes with int
constants:

    final class Numberz {
        const ONE = 1;
        const TWO = 2;
        static public $__names = [1 => 'ONE', 2 => 'TWO', ...];
    }

PHP 8.1 supports native enums:

    enum Numberz: int {
        case ONE = 1;
        case TWO = 2;
    }

Native enums are stronger (type system enforces the value space) but
break callers that treat Numberz::ONE as a plain int. For example,
arithmetic, JSON encoding, and direct comparison with int all need
adjustments.

  was:
After lib/php/lib/ is fully typed, the C++ generator at
compiler/cpp/src/thrift/generate/t_php_generator.cc still emits PHP
without declare(strict_types=1), without native parameter or return
types, without typed properties. Generated structs work but look
archaic next to a fully-typed runtime library.

This ticket adds modern emission:

  * declare(strict_types=1) at the top of every emitted file.
  * Native return types on getName(), read(), write(),
    constructor-from-array, validators.
  * Native parameter types on read(TProtocol $input),
    write(TProtocol $output), validators.
  * Typed properties on struct fields where the Thrift type maps to a
    PHP scalar or class (string, int, bool, float, array, ClassName,
    nullable variants).
  * Constructor property promotion is intentionally NOT used — Thrift
    constructors do array-deserialization, not pure assignment.
  * Add a new helper type_to_native_signature() in the generator
    (alongside the existing type_to_phpdoc()).
  * Regenerate all golden test fixtures.

This is a breaking change for downstream code that:
  * Relied on PHP's loose-typing coercion on struct fields (e.g.,
    assigning a string to an int field).
  * Subclasses generated structs and overrides read/write with
    different signatures.

Plain users that follow the documented Thrift IDL types continue to
work.


> Emit native PHP 8.1 enums for Thrift enums (opt-in)
> ---------------------------------------------------
>
>                 Key: THRIFT-5964
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5964
>             Project: Thrift
>          Issue Type: New Feature
>          Components: PHP - Compiler, PHP - Library
>    Affects Versions: 0.24.0
>            Reporter: Volodymyr Panivko
>            Assignee: Volodymyr Panivko
>            Priority: Major
>
> Currently, Thrift enums are emitted as final classes with int
> constants:
>     final class Numberz {
>         const ONE = 1;
>         const TWO = 2;
>         static public $__names = [1 => 'ONE', 2 => 'TWO', ...];
>     }
> PHP 8.1 supports native enums:
>     enum Numberz: int {
>         case ONE = 1;
>         case TWO = 2;
>     }
> Native enums are stronger (type system enforces the value space) but
> break callers that treat Numberz::ONE as a plain int. For example,
> arithmetic, JSON encoding, and direct comparison with int all need
> adjustments.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to