PHP hacken/uitbereiden - feedback
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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));
?>
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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)
}
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.
Waar kan ik de code hiervan vinden? Het enige wat ik van jouw in die repo kan vinden zijn 2 lege files...
10,000+ commits klikt zie je de andere commit in de lijst staan.
Edit: hmm... nog een commit toegevoegd. Vreemd dat die fix verdwenen was.
Edit 2: Voor die mensen die zich afvragen waarom ik dat een fix noem, het is ook echt een bugfix. Zoek naar uninitialized pointers als je meer wilt weten :p
Als je op Edit: hmm... nog een commit toegevoegd. Vreemd dat die fix verdwenen was.
Edit 2: Voor die mensen die zich afvragen waarom ik dat een fix noem, het is ook echt een bugfix. Zoek naar uninitialized pointers als je meer wilt weten :p
Gewijzigd op 17/11/2013 21:05:00 door Dos Moonen