<?php
// zryty system typów
$arr [ 5.40 ] = 'something' ;
var_dump ( $arr [ 5.90 ] === $arr [ 5.40 ] ) ; // true var_dump ( $arr [ 5.30 ] === 'something' ) ; // true
class Foo { public function __toString( ) { /* to i tak nic nie da */ return 'x' ; } }
$foo = new Foo( ) ;
$arr2 [ $foo ] = 123 ; // tak po prostu rzuci warning, żadnego błędu kompilacji :O
var_dump ( count ( $arr2 ) === 0 ) ; // w rzeczywistości żadna zmiana na tablicy nie zaszła :O
// koercja o której nie wie 99% programistów PHP i jest zrobiona najgłupiej jak się dało
$id = '1<script>alert(/xss/.source);</script>' ;
echo "Twój ID to: " . $id . "\n " ;
}
// kolejne przykłady
var_dump ( ( int
) ( bool
) 'foo' === 1 ) ; // true
// zajebista niekonsystencja API
class X implements ArrayAccess {
function offsetGet( $key ) { return 'foo' ; }
function offsetSet( $key , $value ) { /* just make this class immutable */ }
function offsetExists( $key ) { return $key === 'something' ; }
function offsetUnset( $key ) { /* just make this class immutable */ }
}
$x = new X( ) ;
var_dump ( array_merge ( $x , [ 1 , 2 , 3 ] ) ) ; // NULL(!), tutaj już dla odmiany rzuciło warning: array_merge(): Argument #1 is not an array
// i na dobry koniec
$fun = function ( ) {
return function ( ) {
return 'abc123' ;
} ;
} ;
// sensownej opcji nie ma, jest tylko taka:
$wynik = $fun ( ) ;
echo $wynik ( ) ;
// jak to odkomentujesz to będzie parse error:
// echo $fun()();
// w normalnych językach działa OK
PD9waHAKCi8vIHpyeXR5IHN5c3RlbSB0eXDDs3cKdmFyX2R1bXAoMDggPT09IDApOyAvLyB0cnVlCgokYXJyWzUuNDBdID0gJ3NvbWV0aGluZyc7CnZhcl9kdW1wKCRhcnJbNS45MF0gPT09ICRhcnJbNS40MF0pOyAvLyB0cnVlCnZhcl9kdW1wKCRhcnJbNS4zMF0gPT09ICdzb21ldGhpbmcnKTsgLy8gdHJ1ZQoKY2xhc3MgRm9vIHsgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKSB7IC8qIHRvIGkgdGFrIG5pYyBuaWUgZGEgKi8gcmV0dXJuICd4JzsgfSB9CiRmb28gPSBuZXcgRm9vKCk7CiRhcnIyID0gYXJyYXkoKTsKJGFycjJbJGZvb10gPSAxMjM7IC8vIHRhayBwbyBwcm9zdHUgcnp1Y2kgd2FybmluZywgxbxhZG5lZ28gYsWCxJlkdSBrb21waWxhY2ppIDpPCnZhcl9kdW1wKGNvdW50KCRhcnIyKSA9PT0gMCk7IC8vIHcgcnplY3p5d2lzdG/Fm2NpIMW8YWRuYSB6bWlhbmEgbmEgdGFibGljeSBuaWUgemFzesWCYSA6TwoKLy8ga29lcmNqYSBvIGt0w7NyZWogbmllIHdpZSA5OSUgcHJvZ3JhbWlzdMOzdyBQSFAgaSBqZXN0IHpyb2Jpb25hIG5hamfFgnVwaWVqIGphayBzacSZIGRhxYJvCiRpZCA9ICcxPHNjcmlwdD5hbGVydCgveHNzLy5zb3VyY2UpOzwvc2NyaXB0Pic7CgppZiAoaW5fYXJyYXkoJGlkLCBbMSwgMiwgM10pKSB7IC8vIHRydWUKCWVjaG8gIlR3w7NqIElEIHRvOiAiIC4gJGlkIC4gIlxuIjsKfQoKLy8ga29sZWpuZSBwcnp5a8WCYWR5CnZhcl9kdW1wKG1pbignZm9vJywgMCkpOyAvLyAnZm9vJwp2YXJfZHVtcChtaW4oMCwgJ2ZvbycpKTsgLy8gMAp2YXJfZHVtcCgoaW50KSdmb28nID09PSAwKTsgLy8gdHJ1ZQp2YXJfZHVtcCgoYm9vbCknZm9vJyA9PT0gdHJ1ZSk7IC8vIHRydWUKdmFyX2R1bXAoKGludCkoYm9vbCknZm9vJyA9PT0gMSk7IC8vIHRydWUKCi8vIHphamViaXN0YSBuaWVrb25zeXN0ZW5jamEgQVBJCmNsYXNzIFggaW1wbGVtZW50cyBBcnJheUFjY2VzcyB7CglmdW5jdGlvbiBvZmZzZXRHZXQoJGtleSkge3JldHVybiAnZm9vJzt9CglmdW5jdGlvbiBvZmZzZXRTZXQoJGtleSwgJHZhbHVlKSB7LyoganVzdCBtYWtlIHRoaXMgY2xhc3MgaW1tdXRhYmxlICovfQoJZnVuY3Rpb24gb2Zmc2V0RXhpc3RzKCRrZXkpIHtyZXR1cm4gJGtleSA9PT0gJ3NvbWV0aGluZyc7fQoJZnVuY3Rpb24gb2Zmc2V0VW5zZXQoJGtleSkgey8qIGp1c3QgbWFrZSB0aGlzIGNsYXNzIGltbXV0YWJsZSAqL30KfQoKJHggPSBuZXcgWCgpOwoKdmFyX2R1bXAoaXNzZXQoJHhbJ3NvbWV0aGluZyddKSk7IC8vIHRydWUKdmFyX2R1bXAoIWVtcHR5KCR4Wydzb21ldGhpbmcnXSkpOyAvLyB0cnVlCnZhcl9kdW1wKCR4Wydzb21ldGhpbmcnXSk7IC8vICdmb28nCnZhcl9kdW1wKGFycmF5X2tleV9leGlzdHMoJ3NvbWV0aGluZycsICR4KSk7IC8vIGZhbHNlKCEpLCBhbGUgd2FybmluZ2EgbmllIHJ6dWNpxYJvCnZhcl9kdW1wKGFycmF5X21lcmdlKCR4LCBbMSwgMiwgM10pKTsgLy8gTlVMTCghKSwgdHV0YWoganXFvCBkbGEgb2RtaWFueSByenVjacWCbyB3YXJuaW5nOiBhcnJheV9tZXJnZSgpOiBBcmd1bWVudCAjMSBpcyBub3QgYW4gYXJyYXkKCi8vIGkgbmEgZG9icnkga29uaWVjCiRmdW4gPSBmdW5jdGlvbigpIHsKCXJldHVybiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJ2FiYzEyMyc7Cgl9Owp9OwoKLy8gc2Vuc293bmVqIG9wY2ppIG5pZSBtYSwgamVzdCB0eWxrbyB0YWthOgokd3luaWsgPSAkZnVuKCk7CmVjaG8gJHd5bmlrKCk7CgovLyBqYWsgdG8gb2Rrb21lbnR1amVzeiB0byBixJlkemllIHBhcnNlIGVycm9yOgovLyBlY2hvICRmdW4oKSgpOwovLyB3IG5vcm1hbG55Y2ggasSZenlrYWNoIGR6aWHFgmEgT0s=