PHP — Cheat Sheet

Tag: php, backend, oop, type-system, composer

Livello: intermedio

TL;DR: Linguaggio di scripting backend a tipizzazione graduale. Concetti chiave su lifecycle request/response, OOP moderna (PHP 8+), gestione memoria e standard PSR.

Concetti chiave

Modello di esecuzione "shared-nothing": ogni richiesta HTTP inizializza e distrugge l'intero ambiente applicativo.

Modalita strict_types=1 applicata per singolo file per abilitare il type checking rigoroso.

Constructor Property Promotion riduce il boilerplate dichiarando la visibilita direttamente negli argomenti del costruttore.

Tipi di unione e intersezione permettono definizioni di tipo complesse e controllate staticamente.

match expression sostituisce switch con controllo di identita stretta (===) e ritorno di valori.

Gestione delle dipendenze standardizzata tramite Composer e autoloading basato su convenzioni PSR-4.

OpCache compila lo script in bytecode in memoria condivisa evitando il parsing a ogni richiesta.

Garbage collection basata su reference counting con algoritmo circolare per liberare memoria da riferimenti ciclici.

Domande tipiche e risposte pronte

Q: Qual e la differenza tra == e === in PHP?R: == esegue il type juggling convertendo i tipi prima del confronto, mentre === verifica sia l'uguaglianza del valore sia l'identita del tipo senza conversioni implicite.

Q: Come funziona il ciclo di vita di un'applicazione PHP tradizionale rispetto a Node.js?R: In PHP tradizionale ogni richiesta HTTP ha il suo spazio di memoria isolato che si distrugge a fine risposta, mentre Node.js mantiene un processo server persistente con event loop condiviso.

Q: A cosa serve declare(strict_types=1)?R: Forza il motore a non convertire automaticamente scalari passati o restituiti da funzioni, sollevando un TypeError se il tipo non corrisponde esattamente a quello dichiarato.

Insidie e errori comuni

Omettere declare(strict_types=1) causa silenti conversioni implicite tra stringhe e interi durante il passaggio dei parametri.

Utilizzare array_merge dentro cicli lunghi crea copie continue dell'array degradando le prestazioni in modo esponenziale.

L'operatore ternario annidato senza parentesi prima di PHP 8 valutava da sinistra a destra generando comportamenti inattesi.

Dimenticare che empty("0") valuta a true, scambiando stringhe valide per valori vuoti.

Snippet e comandi

<?php

declare(strict_types=1);

namespace App\Services;

class UserService
{
    public function __construct(
        private readonly DatabaseInterface $db,
        private string $role = 'guest'
    ) {}

    public function process(int|string $id): string
    {
        return match (true) {
            is_int($id) && $id > 0 => "ID numerico: {$id}",
            default                => "Formato non valido",
        };
    }
}

Bash

```composer dump-autoload -o

php -d memory_limit=512M vendor/bin/phpunit

```

Da ripassare

[ ] Meccanismo di preloading introdotto con Opcache da PHP 7.4

[ ] Fibers e gestione asincrona nativa da PHP 8.1

[x] Principi di autoloading PSR-4 e namespace standard

[x] Nullsafe operator (?->) e match expression

Jarvis Interviews
Jarvis