Client: php
Update t_php_generator to emit native PHP parameter and return types on
all generated service-level code:
* Interface (*If.php): public methods now declare typed params and
return — `foo(?string $thing): ?string`.
* Client (*Client.php): typed constructor
`__construct(TProtocol $input, ?TProtocol $output = null)`; typed
`$input`/`$output`/`$seqid` properties; typed RPC methods, typed
`send_*` (synthetic t_function with g_type_void return), typed
`recv_*` (already synthetic; now inherits the parent
function_signature return-type machinery).
* Processor (*Processor.php): typed
`__construct(object $handler)`; typed
`protected ?object $handler_ = null`; typed
`process(TProtocol $input, TProtocol $output): bool` (changed the
early "method not found" `return;` to `return false;` to satisfy the
declared return type); typed
`process_NAME(int $seqid, TProtocol $input, TProtocol $output): void`.
* Rest (*Rest.php): typed `__construct(object $impl)`; typed
`protected object $impl;`; typed method signatures
`methodName(array $request): ?T`; emit `return` only when the
underlying impl method returns non-void.
Implementation
--------------
* New helper `type_to_return(t_type*)` renders `: void` or `: ?T` for
return-type clauses, sharing the existing `type_to_native()` mapping.
* `function_signature()` extended to append `type_to_return()` for the
return type; `argument_list()` extended to emit `?type_to_native()`
on every parameter (previously only struct/container types were
typed).
* `send_*` emission now constructs a synthetic
`t_function(g_type_void, ...)` so `function_signature()` produces
the correct `: void` for the writer half of the RPC.
Drive-by cleanup
----------------
`ThriftClassLoader::findFileInApcu()` (merged in THRIFT-6001) was
flagged by PHPStan: the trailing `$file !== false ? $file : null`
arm is unreachable because the if-branch reassigns `$file` to the
findFile() result (`?string`). Rewrote the body to a clear two-step
fetch-or-recompute and narrowed the return through `is_string()` to
satisfy the analyser without relying on a phantom else-arm.
Generated fixtures regenerate via `make stubs` in CI; nothing
checked in changes.
Part of umbrella THRIFT-5960 (PHP modernization).
Generated-by: Claude Opus 4.7