NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #3054 most downloaded on Packagist
SOAP encoding and decoding package
Last release 1 months ago
03 Sep 2026
Release timing varies
gaps range from 9 days to 3 months
Some releases are documented
notes for 11 of 39 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
39 releases · first in 2024
Allow the full php-soap/wsdl-reader 0.x range by @veewee in #69
Full Changelog: 0.34.0...0.35.0
Migrate to STAB optics (Iso<S,T,A,B> / Lens<S,T,A,B>) by @veewee in #64
Warning
Custom encoders need updating. Reflecta's optics moved from 2 type parameters to 4, the STAB form: Iso<S, T, A, B> and Lens<S, T, A, B>. If you wrote your own XmlEncoder, SoapMethodEncoder, or anything implementing the Provides*Lens or DecoratingEncoder features, widen your generic annotations from 2 to 4 parameters.
S and A keep their old meaning (the whole, and the focus). T and B are the write-side counterparts, used when a write changes the type. If yours never does, just repeat them: XmlEncoder<Data, Data, Xml, Xml>.
Nothing changes at runtime. Method signatures are the same, so any code without explicit Psalm/PHPDoc annotations keeps working as is. The Reflecta 1.0.0 upgrade guide walks through the rest.
Full Changelog: 0.33.0...0.34.0
One column per month.
GH-59 : Fix ObjectEncoder dropping attributes with falsy values by @ademarco in #60
Deprecated Document::configure(loader(...)) replaced with Document::fromLoader()
This release migrates the package to PHP 8.4's spec-compliant DOM API via veewee/xml ^4.10.
veewee/xml ^4.10php-standard-library/php-standard-library)Element::fromDOMElement() and Element::element() now accept/return Dom\Element instead of DOMElementXsiTypeDetector::detectXsdTypeFromXmlElement() and detectEncoderFromXmlElement() accept Dom\Element instead of DOMElementElementValueReader methods accept Dom\Element instead of DOMElement| Package | From | To |
|---|---|---|
php-soap/engine |
^2.19 | ^2.20 |
php-soap/wsdl |
^1.18 | ^1.19 |
php-soap/xml |
^1.9 | ^1.10 |
php-soap/wsdl-reader |
^0.31 | ^0.32 |
php-soap/psr18-transport |
^1.8 | ^2.0 |
php-soap/engine-integration-tests |
^1.10 | ^1.12 |
DOMDocument, DOMElement, DOMNode, DOMAttr type hints replaced with Dom\ namespace equivalentsDocument::configure(loader(...)) replaced with Document::fromLoader()getAttribute() / getAttributeNS() now return null instead of '' for missing attributes (handled throughout)textContent is now ?string (null-guarded in fault encoders)ownerDocument access uses assert_document() (returns ?Dom\Document, not ?Dom\XMLDocument)psalm.xml for static analysis supportEncoding (PHP values to XML) is 12-16% faster, and memory usage dropped ~7% across the board.
Decoding (XML to PHP values) shows a small regression in SOAP encoded mode:
| Benchmark | Change |
|---|---|
| Literal decode | unchanged (+0.4%) |
| Encoded decode | +7-9% |
The encoded decode regression is caused by PHP 8.4's new Dom\ implementation being marginally slower per-operation on XPath queries (+22%), node iteration (+11%), and XML parsing (+2%). These small differences compound through the encoded decode path, which performs ~2x more DOM interactions than literal mode (xsi:type attribute reads, namespace resolution on every element). This is a PHP engine characteristic, not something fixable at the library level, and may improve in future PHP releases. (/cc @ndossche)
In real-world usage, the encoded decode overhead translates to roughly 15-20 microseconds per decoded message, which is negligible compared to network latency.
Full Changelog: 0.31.0...0.32.0
Backport: Fix ObjectEncoder dropping attributes with falsy values by @veewee in #62
Full Changelog: 0.31.0...0.31.1
This release focuses entirely on encoding/decoding performance. No breaking changes.
This release focuses entirely on encoding/decoding performance. No breaking changes.
A series of targeted caching improvements were introduced across the encoder pipeline. Each fix eliminates redundant object construction on repeated calls to iso() within a single request.
| PR | Change |
|---|---|
| #52 | Cache inner Iso in XsiTypeEncoder to avoid redundant iso() calls |
| #53 | Cache type Iso in ElementEncoder; refactor ElementValueBuilder and ElementValueReader |
| #55 | Cache type Iso in AttributeValueEncoder |
| #56 | Cache FixedIsoEncoder per xsi:type in XsiTypeDetector; introduce ScopedCache; refactor EncoderDetector |
| #57 | Cache ObjectAccess::forContext() by type+namespace+bindingUse (largest single win) |
Bumping veewee/reflecta to ^0.17 also contributes a small improvement via a properties_set clone-once optimization (reflecta#26).
Benchmarks run with phpbench on PHP 8.4, using a complex SOAP type with nested objects. WSDL parsing is excluded from measurements (@BeforeMethods). The baseline is the commit where benchmarks were introduced (before any optimizations).
| Benchmark | Baseline | Optimized | Improvement |
|---|---|---|---|
| Literal — 1 item | 126.2 μs | 91.1 μs | -28% |
| Literal — 500 items | 62.3 ms | 44.7 ms | -28% |
| Encoded — 1 item | 174.4 μs | 140.0 μs | -20% |
| Encoded — 500 items | 86.6 ms | 69.1 ms | -20% |
| Benchmark | Baseline | Optimized | Improvement |
|---|---|---|---|
| Literal — 1 item | 178.7 μs | 132.4 μs | -26% |
| Literal — 500 items | 90.0 ms | 68.5 ms | -24% |
| Encoded — 1 item | 250.5 μs | 167.6 μs | -33% |
| Encoded — 500 items | 129.5 ms | 83.0 ms | -36% |
For context, ext-soap (C extension) measured on the same machine:
| Operation | ext-soap | php-soap/encoding | Ratio |
|---|---|---|---|
| Encode literal — 1 item | 7.6 μs | 91.1 μs | ~12x slower |
| Encode encoded — 1 item | 12.5 μs | 140.0 μs | ~11x slower |
| Decode literal — 1 item | 11.3 μs | 132.4 μs | ~12x slower |
| Decode encoded — 1 item | 16.3 μs | 167.6 μs | ~10x slower |
The gap vs ext-soap is expected: php-soap/encoding operates at the PHP level and provides full type-safety and WSDL-driven encoding as a pure PHP implementation.
veewee/reflecta version bumped to ^0.17.ScopedCache class (Soap\Encoding\Cache\ScopedCache) is @internal.Full Changelog: 0.30.0...0.31.0
Fix duplicate xmlns attributes on qualified elements with xsi:type by @veewee in #50
Full Changelog: 0.29.0...0.30.0
Fix xsi:type namespace resolution for server-side prefixes by @veewee in #49
Full Changelog: 0.28.0...0.29.0
Replace azjezz/psl with php-standard-library/php-standard-library by @veewee in #45
Full Changelog: 0.27.0...0.28.0
feat: Update azjezz/psl requirement to include version 5.0 by @EJTJ3 in #44
Allow configuration of libxml options for decoding XML by @veewee in #43
Full Changelog: 0.25.0...0.26.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →