PHP hacken/uitbereiden - feedback
Ik wilde wat meer weten over hoe PHP 'under the hood' werkt. Als projectje besloot ik een toevoeging voor type hinting te schrijven.
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
Geeft de volgende output:
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.
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.
Ziet er wel grappig uit :) HackPHP heeft ook al een typehinting van PHP gemaakt.
Waar kan ik de code hiervan vinden? Het enige wat ik van jouw in die repo kan vinden zijn 2 lege files...
Waar kan ik de code hiervan vinden? Het enige wat ik van jouw in die repo kan vinden zijn 2 lege files...
Als je op 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
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




