Nou programmeer ik alweer een aantal jaren PHP, en ik dacht dat ik meeste toch al wel onder de knie had.

Toch blijft PHP verrassen.
Zo heeft PHPHulp mij helpen herinneren aan een verschil in werking tussen de operatoren "&&" en "and".
En vandaag ben ik er achter dat namen van klassen ongevoelig zijn voor hoofd- en kleine letters (autoloaders?).

Wat is het meest opmerkelijke wat jij bent tegengekomen, en hoe heb je dat opgelost?
Sommige keuzen in PHP verbazen me vooral.

Bijvoorbeeld dat je, vereenvoudigd, dit ontwerp ...

<?php
declare(strict_types=1);

class User
{
    public ?string $firstName = null;
}
?>


... zo kunt gebruiken ...


<?php
$user = new User();
$user->firstName = 'John';
$user->lastName = 'Doe';
?>
Ik kwam laatst iets tegen: als je twee grote gehele getallen optelt, gebeurt er iets vreemds:
<?php
$v = PHP_INT_MAX;  // $v is een integer
var_dump($v);
$v++;              // $v wordt een float?
var_dump($v);
?>
Strings als array's behandelen.

<?php
$string="PHPhulp for teh win";
echo $string[3]; // geeft 'h'
?>
Ad Fundum op 26/04/2021 09:48:47

Ik kwam laatst iets tegen: als je twee grote gehele getallen optelt, gebeurt er iets vreemds:
<?php
$v = PHP_INT_MAX;  // $v is een integer
var_dump($v);
$v++;              // $v wordt een float?
var_dump($v);
?>


Dit is daadwerkelijk gedefinieerd gedrag van PHP. Zodra nummers erg groot worden (groter dan in een INT past) maakt de interpreter er automatisch een float van.

- Ariën - op 26/04/2021 09:53:52

Strings als array's behandelen.

<?php
$string="PHPhulp for teh win";
echo $string[3]; // geeft 'h'
?>

Dit is omdat PHP op C is gebouwd waar een String niets meer is dan een array van chars ;)

Er zijn heel veel leuke (en minder leuke) truukjes mogelijk met PHP, grotendeels omdat het loose-typed is (denk aan de werking van autoloaders bijvoorbeeld).
Zo kun je on-the-fly een HATEOAS API uitlezen en intreperteren, met Reflection code genereren om deze af te handelen en de resulterende code naar het filesystem schrijven om bij een volgend request te hergebruiken (soort van "caching" dus). Of je dat moet willen is een tweede natuurlijk.
Nou, uitgerekend geldt het dan weer niet voor autoloaders, want namen van classes zijn case insensitive. En bij voorgedefineerde defines als true en TRUE. Maar als je ze zelf wilt defineren met define(), dan moet je juist case sensitive declareren. Want: "Defining case-insensitive constants is deprecated as of PHP 7.3.0."
Gelukkig is de rest, zoals variabele namen wel case sensitive.

En die chars moet je ook even goed bij stilstaan. Wat als je je .php-bestand opslaat als UTF-8, en je doet dit:
<?php
$naam = 'cliënt';
print $naam[3];  // print ë... toch? of niet?
?>

Leuk om te lezen over HATEOAS! Ik wist niet dat wat ik aan het doen was een naam had en al sinds 2008 bestond.

Reageren