Het komt neer op het 'Boxing based' voorbeeld uit nikic's Scalar type hinting is harder than you thinkScalar type hinting is harder than you think blog post. Maar dan zonder het automatische unboxing.
https://github.com/Darsstar/php-src/tree/wrap-scalars-on-object-typehint
De volgende code
<?php
use SPL\Type\Hint;
class Number implements Hint\Long, Hint\Double
{
private $value;
public function __construct($value)
{
$this->value = $value;
}
public function wrap($value)
{
if ( ! is_long($value) && ! is_double($value))
{
throw InvalidArgumentException('Parameter 1 must be a long of double');
}
$this->value = $value;
}
public function unwrap()
{
$this->value;
}
}
function foo(Number $bar = 2.0) {
var_dump($bar);
}
echo '<pre>' . PHP_EOL;
foo(42);
foo(3.1415);
foo();
foo(new Number(12358));
?>Geeft de volgende output:
<pre>
object(Number)#1 (1) {
["value":"Number":private]=>
int(42)
}
object(Number)#1 (1) {
["value":"Number":private]=>
float(3.1415)
}
object(Number)#1 (1) {
["value":"Number":private]=>
float(2)
}
object(Number)#1 (1) {
["value":"Number":private]=>
int(12358)
}De volgende stap is een 2 of 3 standaard implementaties in de namespaces SPL\Type\Strict, SPL\Type\Cast en mogelijk SPL\Type die niets forceerd maar wel E_STRICT errors gooit?
Ik vroeg me af wat anderen er van vinden, en of jullie grappige use cases kunnen bedenken.