Kategorien
- webdev (97)
- php (62)
- Javascript (20)
- Datenbanken (20)
- Software Engineering (11)
- Performance (7)
- Security (18)
- PHP-WTF (7)
- Best of the Web (8)
- Quicktips (23)
- Linux (4)
- Java (3)
- misc IT (7)
- Persönlich (7)
- webdev (97)
Was geht hier ab?
Hi! Ich heiße David, studiere an der Hochschule Darmstadt Informatik und blogge über webdev-related Themen mit Fokus auf PHP
Oft gelesen
Blogroll
Archiv der Kategorie: PHP-WTF
PHP WTF #7
Direkt entliehen von hier und ein schönes Beispiel für PHPs Handling mit Unicode-Zeichen:
1 2 3 4 5 | <meta charset="utf8"> <?php $a = 'äa'; echo "with space: " . $a[0] . " " . $a[1] . "<br />"; //� � echo "without space: " . $a[0] . $a[1] . "<br />"; //ä |
bzw. analog dazu:
1 2 3 4 5 |
Klar: Das ä belegt 2 Byte:
1 2 3 4 |
Schon besser:
1 2 3 4 5 |
Mir war das zwar im Prinzip schon alles klar, durch so ein Beispiel wird aber nochmal deutlich, dass man die nicht-mb_* – Funktionen partout meiden sollte.
Veröffentlicht unter php, PHP-WTF, webdev
3 Kommentare
PHP WTF #6
Heute inkrementieren wir mal Strings.
1 2 3 4 5 6 | $string = 'Iteration number 0'; $i = 10; while ($i--) echo $string++ . "<br />"; |
Output:
1 2 3 4 5 6 7 8 9 10 | Iteration number 0 Iteration number 1 Iteration number 2 Iteration number 3 Iteration number 4 Iteration number 5 Iteration number 6 Iteration number 7 Iteration number 8 Iteration number 9 |
Das war ja schonmal ganz nett zum warmwerden. Aber jetzt: fasten your seatbelts.
1 2 3 4 | for ($i = 'a'; $i <= 'z'; $i++) { echo $i . " "; } |
Output:
1 | a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz |
Wow! Und allemal cooler als der hier:
Output:
1 | a b c d e f g h i j k l m n o p q r s t u v w x y z |
Wem langweilig ist, kann damit gern ein bisschen rumspielen (ASCII-Tabelle gefällig?). Siehe dazu auch den Manual-Eintrag bei php.net:
PHP follows Perl’s convention when dealing with arithmetic operations on character variables and not C’s. For example, in Perl ‘Z’+1 turns into ‘AA’, while in C ‘Z’+1 turns into ‘[‘ ( ord(‘Z’) == 90, ord(‘[‘) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.
Veröffentlicht unter php, PHP-WTF, webdev
3 Kommentare
PHP WTF #5
…oder: Bei magischen Funktionen gut aufpassen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class TestingEmpty { public function __get($var) { if ($var == "test_empty") return "Hi there!"; } } $t = new TestingEmpty(); echo $t->test_empty; //Hi there! var_dump(strlen($t->test_empty)); //int(9) var_dump(empty($t->test_empty)); //bool(true) $externalvar = $t->test_empty; var_dump(empty($externalvar)); //bool(false) |
Aha, also empty, aber mit String-Length von 9 Zeichen. Nach dem Zuweisen zu einer “wirklichen” Variable dann auch nicht mehr empty.
Zur Abwechslung wollen wir aber nicht nur meckern, sondern noch konstruktiv zeigen, wie man diesen WTF (der vielleicht garkeiner ist?) behebt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class TestingEmpty { public function __get($var) { if ($var == "test_empty") return "Hi there!"; } public function __isset($var) { echo "__isset triggered"; if ($var == "test_empty") return true; return false; } } $t = new TestingEmpty(); echo $t->test_empty; //Hi there! var_dump(strlen($t->test_empty)); //int(9) //__isset triggered var_dump(empty($t->test_empty)); //bool(false)... endlich |
Durchs Überschreiben der magischen Funktion __isset, die implizit von empty bei __get aufgerufen wird, können wir das Verhalten so korrigieren, wie es uns gefällt.
Auch wenn man das nicht als “Bug” bezeichnen kann und das Verhalten genau betrachtet auch logisch ist, wäre es trotzdem schön wenn darauf im Manual zu empty besser hingewiesen werden würde.
Veröffentlicht unter php, PHP-WTF, webdev
9 Kommentare
PHP WTF #4
…oder warum man überall wo möglich 3 Gleichheitszeichen verwenden sollte ;).
1 2 3 4 5 6 7 |
Womit dann schlussendlich true == false gilt. qed
Veröffentlicht unter php, PHP-WTF, webdev
7 Kommentare
PHP WTF #3
Und ein neuer WTF-Teil (Teil 1, Teil 2)!
1 |
Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das “Phänomen” nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.
Und noch einer:
1 |
Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.
Veröffentlicht unter php, PHP-WTF, Quicktips, webdev
2 Kommentare
PHP WTF #2
Und weiter gehts mit den Kuriositäten (Teil 1).
1 2 3 |
Wenn 123123 rauskommen würde, wärs langweilig oder? Kommts auch nicht. 123122 lautet das Ergebnis.
Da ich unmöglich schöner erklären, was da intern vor sich geht als Herr Schlüter, sei an dieser Stelle elegant zu ihm übergeleitet.
Veröffentlicht unter php, PHP-WTF, webdev
1 Kommentar
PHP WTF #1
Ohne viel Worte: was kommt bei dem Code raus?
1 2 3 4 5 6 7 8 9 10 11 12 13 | class çåèäßäöü { public static function weird() { function stuff() { return 123; } } } echo çåèäßäöü::wEiRd().sTuFf(); echo çåèäßäöü::weird().stuff(); |
Geballte “weirdness”. Wenn man jemandem so einen Schnippsel vorlegt und ihn laut nachdenken lässt (Bewerbungsgespräch), stellen sich folgende Fragen
- Unicode in Klassennamen? Kann das gehen?
- Sind Funktionsnamen case sensitive?
- Nested Functions?
- Warum sind es 2 Calls?
Und nun zu Auflösung:
- Das geht! Klassen, Funktionen und Variablen
dürfen unicode-Zeichen beinhalten. (Richtigstellung: Wie Fabian per Kommentar angemerkt hat, ist es kein “wirklicher” unicode, denn die verwendbaren Zeichen beschränken sich auf den regulären Ausdruck1[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*Natürlich ist das nicht empfehlenswert, aber prinzipiell möglich)
Veröffentlicht unter php, PHP-WTF, webdev
7 Kommentare