@allpeople / site


En relisant des MR (ou PR ...) ou en exécutant l'outil Rector pour refactoriser le code sur des versions plus récente de PHP, je suis parfois supris par les propositions de changement, et du coup je me replonge dans la doc off PHP, par exemple :

1) Typage static

    Pourquoi le typage de retour d'une méthode est mis en static en remplacement de self ?
    
     - public function getInstance(): self {}
     + public function getInstance(): static {}
    

    En fait je suis passé à coté d'une évolution du langage sur la version 8.0 : type de retour statique

    Le type de retour statique suit le principe de substitution de Liskov. Une méthode de classe enfant peut renvoyer un objet de classe plus étroite que le type de retour de la méthode parent.
    Comme static fait toujours référence au nom de la classe de l'objet appelé (c'est-à-dire la même chose que get_class($object)), static est un sous-ensemble de self, qui à son tour est un sous-ensemble de parent.
    Il est possible qu'une classe enfant renvoie static, même si le type de retour des méthodes parent est self ou parent.

    Et en image :

Type de retour statique

    Toujours sur les statiques, les fonctions anonymes peuvent être déclarées statiquement. Ceci permet de ne pas lier automatiquement la classe courante à la fonction.     
Source : Les fonctions anonymes statiques

Fonctions anonymes statiques

    Si j'exécute online ce bout de code proposé en exemple dans la documentation PHP sur une version PHP 8.2, j'obtiens le résultat suivant :

Fatal error: Uncaught Error: Using $this when not in object context in /home/user/scripts/code.php:8
Stack trace:
#0 /home/user/scripts/code.php(10): Foo::{closure}()
#1 /home/user/scripts/code.php(13): Foo->__construct()
#2 {main}
thrown in /home/user/scripts/code.php on line 8

    Trop fort, Trop fun !


2) Paramètre par défaut instancié

    PHP 8.0 a introduit les paramètres nommés en plus des paramétres positionnels, et PHP 8.1 propose d'utiliser des objets comme valeur par défaut :

Objet comme paramètre par défaut

Résultat :

Faire du café.Créer un beau café rien que pour vous.
    
Source : Utilisation d'objets comme valeur par défaut

    En fait, je me suis mis à lire cette documentation de PHP et de noter certaines évolutions du langage car sur une relecture d'une MR j'ai eu dans la signature d'une méthode, le paramètre optionnel avec une valeur par défaut, en exemple :

function test(type required_parameter, type optional_parameter = 'value1' | 'value2' = 'value1') {}

    TS permet d'écrire ce code, la syntaxe est permise mais pas en PHP. Cependant, certaines fonctions a une syntaxe pouvant se rappocher avec des constantes, comme par exemple :

$array = ['data1' => 'value1', 'data2' => 'value2'];
$json = json_encode($array, JSON_FORCE_OBJECT | JSON_HEX_QUOT);


    Dans ce cas, la technique de bitmask permet d'activer les 2 options via l'opérateur de bits OR ('|'). Bien-sûr la finalité est très différente.


2024