Serveur Debian

Administration con centré . com !

Serveur Debian : DOCKER

Référence POO PHP – mots-clés & constructions

Liste (quasi) exhaustive pour PHP 8.x. Les exemples sont volontairement minimalistes.

Mot-clé / Construction Explication Exemple
class Déclare une classe.

class User {}
$u = new User();
interface Contrat de méthodes publiques (sans implémentation).

interface Loggable { public function log(string $m): void; }
trait Réutilisation d’implémentations entre classes.

trait TLog { public function log($m){ echo $m; } }
class A { use TLog; }
extends Héritage de classe / d’interface.

class Admin extends User {}
interface B extends Loggable {}
implements Une classe s’engage à appliquer l’interface.

class FileLogger implements Loggable {
  public function log(string $m): void {}
}
abstract Classe/méthode incomplète à spécialiser.

abstract class Repo { abstract public function all(): array; }
final Empêche l’héritage (classe) ou la surcharge (méthode).

final class UUID {}
class A { final public function id(){} }
public / protected / private Visibilités des membres.

class C { public $a; protected $b; private $c; }
static (membre) Membre de classe (sans instance).

class C {
  public static int $n = 0;
  public static function v(){ return self::$n; }
}
static (retour) Retourne le type appelant (liaison tardive).

class F { public function with(): static { return $this; } }
$this Instance courante.

class C { function me(){ return $this; } }
self Référence la classe où le code est écrit.

class A { public static function who(){ return __CLASS__; } }
parent Accède aux membres de la classe parente.

class B extends A { public static function who(){ return parent::who(); } }
new Instancie une classe (ou une classe anonyme).

$svc = new class { public function run(){} };
clone Duplique un objet (appelle __clone()).

$u2 = clone $u;
instanceof Teste le type objet.

if ($u2 instanceof User) { /* ... */ }
const (de classe) Constante liée à la classe.

class C { public const VER = '1.0'; }
::class Nom qualifié de la classe en chaîne.

$name = User::class; // "App\User" selon namespace
readonly (prop.) Propriété assignable une seule fois (8.1+).

class C { public readonly int $id;
  function __construct(int $id){ $this->id = $id; }
}
readonly class Toutes les propriétés sont readonly (8.2+).

readonly class D { public int $id; }
use (trait) Impor­te un trait dans une classe.

class L { use TLog; }
insteadof (trait) Résout les conflits de méthodes entre traits.

trait A{ function x(){echo 'A';} }
trait B{ function x(){echo 'B';} }
class C{ use A,B { A::x insteadof B; } }
as (trait) Alias (et changement de visibilité possible).

class C{ use A { x as public xAlias; } }
enum Type énuméré orienté objet (8.1+).

enum Status:string { case Ok='ok'; case Ko='ko'; }
__construct() Constructeur.

class U { function __construct(public string $n) {} }
__destruct() Nettoyage à la destruction.

class U { function __destruct(){ /* cleanup */ } }
__get() / __set() Accède/assigne des props. inaccessibles.

function __get($n){ /* ... */ }
function __set($n,$v){ /* ... */ }
__isset() / __unset() Support de isset() / unset().

function __isset($n){ return false; }
function __unset($n){ /* ... */ }
__call() Appel d’une méthode d’instance inexistante.

function __call($name, $args){ /* proxy */ }
__callStatic() Appel d’une méthode statique inexistante.

public static function __callStatic($n,$a){ /* ... */ }
__toString() Conversion en chaîne.

function __toString(){ return 'User#1'; }
__invoke() Rend l’objet appelable comme une fonction.

function __invoke($x){ return $x + 1; }
__sleep() / __wakeup() Ancienne API de sérialisation (préférez __serialize()).

function __sleep(){ return ['id']; }
function __wakeup(){ /* ... */ }
__serialize() / __unserialize() API moderne de (dé)sérialisation.

function __serialize(){ return ['id' => $this->id]; }
function __unserialize($d){ $this->id = $d['id']; }
__set_state() Reconstruction via var_export().

public static function __set_state($a){ return new self(); }
__debugInfo() Personnalise var_dump().

function __debugInfo(){ return ['id' => $this->id]; }
namespace Organisation des classes.

namespace App;
class User {}
use (namespace) Import d’un nom qualifié / alias.

use App\User as U;
$u = new U();
type object Type-hint générique « un objet ».

function f(object $o): object { return $o; }
Promotion de propriétés Déclare + type + visibilité dans le constructeur.

class P { function __construct(public int $id) {} }
Classe anonyme Définie à la volée.

$svc = new class { public function run(){} };
__clone() Personnalise le clonage.

function __clone(){ $this->id = null; }
Constantes magiques Métadonnées utiles.

__CLASS__, __METHOD__, __TRAIT__, __NAMESPACE__
(object)[] / stdClass Cast d’un tableau (ou null) en objet : crée une instance de stdClass (objet « sac de propriétés », props dynamiques autorisées).

$a = (object)[]; <=>  $a = new stdClass();
$a->foo = 'bar';

Opérateur nullsafe ?-> Accède à une propriété/méthode uniquement si l’objet n’est pas null, sinon retourne null.

$city = $user?->profile?->address?->city ?? 'N/A';
static:: (liaison statique tardive) Résout vers la classe **réelle** appelée (pas la classe où c’est écrit), utile pour héritage.

class A { public static function who(){ return static::class; } }
class B extends A {}
echo B::who(); // "B"
JsonSerializable Contrôle le JSON produit par json_encode().

class U implements JsonSerializable {
  public function __construct(private int $id) {}
  public function jsonSerialize(): mixed { return ['id' => $this->id]; }
}
echo json_encode(new U(1)); // {"id":1}
ArrayAccess Permet d’accéder à l’objet **comme un tableau**.

class Bag implements ArrayAccess {
  private array $d = [];
  public function offsetSet($k,$v):void{ $this->d[$k]=$v; }
  public function offsetGet($k):mixed{ return $this->d[$k]??null; }
  public function offsetExists($k):bool{ return isset($this->d[$k]); }
  public function offsetUnset($k):void{ unset($this->d[$k]); }
}
$b = new Bag; $b['foo']='bar';
Countable Autorise count($obj) sur votre objet.

class C implements Countable { public function count(): int { return 42; } }
echo count(new C); // 42
IteratorAggregate Autorise foreach sur votre objet (plus simple qu’implémenter Iterator).

class Collection implements IteratorAggregate {
  public function __construct(private array $items){}
  public function getIterator(): Traversable { yield from $this->items; }
}
foreach (new Collection([1,2,3]) as $v) {}
Stringable Type-interface pour « conver­tible en string » (implémenté si __toString() existe).

class U { public function __toString(){ return 'U#1'; } }
function f(Stringable $s){ echo (string)$s; }
f(new U());
WeakMap / WeakReference Associe des métadonnées à des objets sans empêcher leur GC (évite les fuites).

$wm = new WeakMap();
$o = new stdClass();
$wm[$o] = 'meta';
unset($o); // l'entrée disparaît automatiquement
Attributs PHP #[...] Métadonnées déclaratives sur classes/propriétés/méthodes.

#[Attribute] class Table { public function __construct(public string $name){} }
#[Table('users')] class User {}
#[AllowDynamicProperties] Autorise (8.2+) les **propriétés dynamiques** sur une classe donnée (déconseillé).

#[AllowDynamicProperties]
class Legacy {}
$x = new Legacy; $x->foo = 'bar';
Closure::call() Lie temporairement une closure à un objet (accès à son $this privé/protégé).

$fn = function(){ return $this->secret; };
class Box { private string $secret='shh'; }
echo $fn->call(new Box()); // "shh"
ReflectionClass Introspection d’objets : méthodes, props, attributs, etc.

$r = new ReflectionClass(User::class);
$methods = array_map(fn($m)=>$m->getName(), $r->getMethods());
Constructeurs nommés (pattern) Remplace des new ambigus par des créateurs clairs.

final class Money {
  private function __construct(private int $cents) {}
  public static function fromCents(int $c): self { return new self($c); }
  public static function fromFloat(float $v): self { return new self((int)round($v*100)); }
}
$m = Money::fromFloat(12.34);
Objets immuables (pattern) Utilise readonly + méthodes with* qui retournent un **nouvel** objet.

readonly class Point { public function __construct(public int $x, public int $y){} 
  public function withX(int $x): self { return new self($x, $this->y); }
}
$p2 = (new Point(1,2))->withX(3);
Monostate : stockage static, accès via instance ($this) État partagé entre toutes les instances, mais exposé par un getter d’instance. Permet d’écrire $this->get() tout en gardant une seule valeur globale.

class A {
  private static ?int $madonnee = null;

  public function __construct() {
    if (self::$madonnee === null) {
      self::$madonnee = 123;
    }
  }

  public function get(): int {
    return self::$madonnee; // accès via $this->get()
  }
}
PDO partagé (static) + getter d’instance Connexion unique (lazy init) stockée en static, exposée via $this->getPDO() ; pratique pour $this->getPDO()->query($sql).

final class Database {
  private static ?PDO $pdo = null;

  public function getPDO(): PDO {
    return self::$pdo ??= new PDO(
      'mysql:host=localhost;dbname=xxx;charset=utf8mb4',
      'user','pass',
      [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
  }
}

// usage : $req = $this->getPDO()->query($statement);
Version 100% instance (sans static) Chaque objet gère son propre état (plus testable / injectable). Idéal si tu veux éviter le global et faciliter les mocks.

final class Database {
  private ?PDO $pdo = null;

  public function getPDO(): PDO {
    return $this->pdo ??= new PDO(
      'mysql:host=localhost;dbname=xxx;charset=utf8mb4',
      'user','pass',
      [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
  }
}
Pourquoi les interfaces (contrat & découplage) Définissent un contrat sans implémentation : permettent le polymorphisme, la substitution (remplacer une implémentation par une autre), le découplage (DIP/IoC), et des tests faciles (mocks/fakes).

interface Logger { public function log(string $m): void; }

class FileLogger implements Logger { public function log(string $m): void {/*...*/} }
class NullLogger  implements Logger { public function log(string $m): void {/* noop */} }

function run(Logger $log){ $log->log('hello'); } // n'accepte que le contrat
run(new FileLogger());
run(new NullLogger()); // interchangeable
Interface qui extends plusieurs interfaces Une interface peut hériter de plusieurs contrats.

interface A { public function a(): void; }
interface B { public function b(): void; }
interface C extends A, B {}            // héritage multiple d'interfaces

class X implements C {
  public function a(): void {}
  public function b(): void {}
}
Classe qui implements plusieurs interfaces Une classe peut satisfaire plusieurs contrats à la fois.

interface CsvExport { public function toCsv(): string; }
interface JsonExport{ public function toJson(): string; }

class Report implements CsvExport, JsonExport {
  public function toCsv(): string { return "a;b"; }
  public function toJson(): string { return '{"a":"b"}'; }
}
Constantes et méthodes static dans une interface Les interfaces peuvent définir des constantes et des signatures statiques.

interface Versioned {
  public const VER = '1.0';
  public static function build(): self; // signature statique
}

class Lib implements Versioned {
  public static function build(): self { return new self(); }
}
Types de retour self et static en interface self = l'implémentation; static = liaison tardive (fluent).

interface Fluent {
  public function with(string $k, mixed $v): static; // fluent
  public static function make(): self;               // fabrique
}

class Bag implements Fluent {
  public static function make(): self { return new self(); }
  public function with(string $k, mixed $v): static { return $this; }
}
Variance (retour covariant, paramètre contravariant) Retour peut être plus spécifique; paramètre peut être plus large.

// Retour covariant
interface Factory { public function make(): Traversable; }
class ItFactory implements Factory { public function make(): Iterator { return new ArrayIterator([]); } }

// Paramètre contravariant
interface Handler { public function handle(Traversable $it): void; }
class H implements Handler { public function handle(iterable $it): void {} } // plus large
Types union / intersection avec interfaces Composer les contrats en union (|) ou intersection (&) (PHP 8.0/8.1+).

interface A { public function a(): void; }
interface B { public function b(): void; }

function useEither(A|B $x): void { /* ... */ }   // union
interface Both { public function set(A&B $x): void; } // intersection
Dépendance sur interface (DI/IoC) Type-hint sur l’interface pour découpler et faciliter le test.

interface Cache { public function get(string $k): mixed; }
class Service {
  public function __construct(private Cache $cache) {}
}
Interface + Trait (implémentation par défaut) On déclare le contrat dans l’interface et on fournit une implémentation réutilisable via un trait.

interface Loggable { public function log(string $m): void; }
trait DefaultLog { public function log(string $m): void { /* write */ } }
class Svc implements Loggable { use DefaultLog; }
instanceof sur une interface Vérifie à l’exécution si un objet satisfait un contrat donné.

if ($obj instanceof Psr\Log\LoggerInterface) { $obj->info('ok'); }
Fabrique qui retourne une interface Masque le choix d’implémentation derrière un point d’entrée unique.

interface Transport { public function send(string $data): void; }
class HttpTransport implements Transport { public function send(string $d): void {} }
class AmqpTransport implements Transport { public function send(string $d): void {} }

final class TransportFactory {
  public static function create(string $dsn): Transport {
    return str_starts_with($dsn, 'amqp:') ? new AmqpTransport() : new HttpTransport();
  }
}
$t = TransportFactory::create($dsn); $t->send('payload');
Segregation des interfaces (ISP) Mieux vaut plusieurs petites interfaces ciblées qu’une grosse interface « god object ».

interface Reads  { public function read(): string; }
interface Writes { public function write(string $d): void; }

class FileIO implements Reads, Writes {
  public function read(): string {/*...*/}
  public function write(string $d): void {/*...*/}
}
Règles d’une interface (visibilité & contenu) Les méthodes sont implicitement publiques (pas de private/protected). Une interface ne peut pas définir de propriétés d’instance; elle peut définir des constantes et des signatures (y compris __construct()).

interface Port {
  public const VER = '1.0';
  public function open(): void;       // public implicite
  public function __construct(string $dsn); // OK (sera public)
}
Interface vs classe abstraite (quand choisir ?) Interface = contrat pur; abstraite = contrat + implémentation partielle + état possible. Si tu as du code commun/état → abstraite; sinon → interface.

interface Hash { public function make(string $v): string; }

abstract class BaseRepo {
  protected PDO $pdo;                   // état partagé
  public function __construct(PDO $pdo){ $this->pdo = $pdo; }
  abstract public function all(): array; // contrat
  protected function map(array $r): object {/*...*/} // implémentation partielle
}
Enums qui implémentent une interface Un enum peut satisfaire un contrat, idéal pour garantir un comportement sur chaque case.

interface Jsonable { public function toJson(): string; }

enum Status: string implements Jsonable {
  case Ok = 'ok'; case Ko = 'ko';
  public function toJson(): string { return json_encode($this->value); }
}
echo Status::Ok->toJson(); // "ok"
Standards d’interop (PSR) Les interfaces PSR facilitent l’échange entre libs (logger, container, cache, HTTP, events...).

use Psr\Log\LoggerInterface;

class Service {
  public function __construct(private LoggerInterface $log) {}
  public function run(): void { $this->log->info('ok'); }
}
Décorateur / Proxy basé sur interface Ajoute des comportements sans modifier l’implémentation d’origine (composition > héritage).

interface Repo { public function find(int $id): object; }

final class SqlRepo implements Repo { public function find(int $id): object {/*...*/} }

final class CachedRepo implements Repo {
  public function __construct(private Repo $inner) {}
  public function find(int $id): object { /* cache autour de $inner */ return $this->inner->find($id); }
}
Chaîne de responsabilité / Middleware Compose des traitements en pipeline en s’appuyant sur un contrat commun.

interface Middleware {
  public function handle(Request $r, callable $next): Response;
}

final class Auth implements Middleware {
  public function handle(Request $r, callable $next): Response { /* ... */ return $next($r); }
}
Tests unitaires : mocks sur interface Moquer une interface découple tes tests de l’implémentation concrète.

// PHPUnit
$logger = $this->createMock(Psr\Log\LoggerInterface::class);
$logger->expects($this->once())->method('info');
$svc = new Service($logger); $svc->run();
Génériques (docblocks) avec interfaces Simule des types génériques pour l’analyse statique (Psalm/PHPStan) via @template/@implements.

/** @template T */
/** @implements IteratorAggregate<T> */
interface ReadonlyList extends IteratorAggregate {}

/** @template T */
final class ArrayList implements ReadonlyList {
  /** @param list<T> $items */ public function __construct(private array $items) {}
  /** @return Traversable<T> */ public function getIterator(): Traversable { yield from $this->items; }
}
Intersection & union avec interfaces (rappel) Exiger plusieurs contrats à la fois (intersection) ou en accepter plusieurs (union).

interface A { public function a(): void; }
interface B { public function b(): void; }

function needsBoth(A&B $x): void { $x->a(); $x->b(); } // intersection
function useEither(A|B $x): void { /* ... */ }          // union
Fluent & constructeurs nommés typés sur interface Contrats plus expressifs avec static (fluent) et self (fabrique).

interface Builder {
  public static function create(): self;
  public function with(string $k, mixed $v): static;
}
Chaînage de méthodes (Fluent Interface) Chaque méthode retourne $this pour enchaîner plusieurs appels de façon lisible.

class Query {
  private array $where = [];
  private int $limit = 0;

  public function where(string $c): static { $this->where[] = $c; return $this; }
  public function limit(int $n): static   { $this->limit   = $n; return $this; }
  public function get(): array { /* ... */ return []; }
}

$rows = (new Query())->where('a=1')->limit(10)->get();
Typage de retour pour le chaînage : static vs self vs interface static préserve le type réel (héritage), self fige la classe courante, retourner une interface garde la souplesse.

interface Builder { public function with(string $k, mixed $v): static; }

class Base {
  public function setA(int $a): static { return $this; } // <-- mieux pour sous-classes
}
class Child extends Base {
  public function setB(int $b): static { return $this; }
}
$o = (new Child())->setA(1)->setB(2); // OK grâce à static
Chaînage immuable (méthodes with*) Au lieu de modifier l’objet, chaque appel retourne une nouvelle instance (sécurise l’état).

readonly class Money {
  public function __construct(public int $cents) {}
  public function withCents(int $c): self { return new self($c); }
}
$m2 = (new Money(100))->withCents(250); // $m original inchangé
Pattern Builder (chaînage jusqu’à build()) Accumule des options via chaînage puis produit un objet final valide.

final class HttpRequest {
  public function __construct(public string $url, public array $headers = []) {}
}

final class RequestBuilder {
  private string $url = '';
  private array $headers = [];

  public static function create(): self { return new self(); }
  public function url(string $u): static { $this->url = $u; return $this; }
  public function header(string $k, string $v): static { $this->headers[$k] = $v; return $this; }
  public function build(): HttpRequest { return new HttpRequest($this->url, $this->headers); }
}

$req = RequestBuilder::create()
  ->url('https://api.local')
  ->header('Accept','application/json')
  ->build();
function_exists() Vérifie si une fonction est définie.

if (function_exists('mb_strtolower')) {
  $s = mb_strtolower($s);
}
method_exists() Vérifie si une méthode existe sur un objet ou une classe.

if (method_exists($obj, 'run')) {
  $obj->run();
}
property_exists() Teste l’existence d’une propriété (même si null).

if (property_exists($obj, 'id')) {
  echo $obj->id;
}
class_exists() Vérifie si une classe est déclarée (option d’autoload).

if (class_exists(App\Service::class)) {
  $s = new App\Service();
}
interface_exists() Vérifie si une interface est déclarée (option d’autoload).

if (interface_exists(Psr\Log\LoggerInterface::class)) {
  // ...
}
trait_exists() Vérifie si un trait est déclaré.

if (trait_exists(App\TLog::class)) {
  // ...
}
enum_exists() (8.1+) Vérifie si un enum est déclaré.

if (enum_exists(App\Status::class)) {
  $st = App\Status::Ok;
}
is_callable() Teste si une valeur est appelable (closure, [$obj,'meth'], etc.).

$cb = [$obj, 'handle'];
if (is_callable($cb)) {
  $cb('data');
}
is_a() Vérifie si un objet (ou nom de classe) est d’un type donné.

if (is_a($obj, App\User::class)) { /* ... */ }
is_subclass_of() Vérifie qu’un type est une sous-classe d’un autre.

if (is_subclass_of(App\Admin::class, App\User::class)) { /* ... */ }
get_class() Retourne le nom de la classe d’un objet.

echo get_class($obj); // "App\User"
get_parent_class() Retourne la classe parente d’un objet/nom de classe.

echo get_parent_class(App\Admin::class); // "App\User"
get_class_methods() Liste les méthodes d’une classe/objet.

$methods = get_class_methods($obj);
get_class_vars() Retourne les propriétés par défaut d’une classe.

$defaults = get_class_vars(App\User::class);
get_object_vars() Retourne les propriétés accessibles d’un objet (contexte courant).

$props = get_object_vars($obj);
class_parents() Renvoie toutes les classes parentes (tableau associatif).

$parents = class_parents($obj);
class_implements() Renvoie les interfaces implémentées.

$ifaces = class_implements($obj);
class_uses() Renvoie les traits utilisés par une classe/objet.

$traits = class_uses(App\Service::class);
get_declared_classes() Liste toutes les classes déclarées.

$classes = get_declared_classes();
get_declared_interfaces() Liste toutes les interfaces déclarées.

$ifaces = get_declared_interfaces();
get_declared_traits() Liste tous les traits déclarés.

$traits = get_declared_traits();
get_declared_enums() (8.1+) Liste tous les enums déclarés.

$enums = get_declared_enums();
get_defined_functions() Retourne les fonctions définies (internes & utilisateur).

$fns = get_defined_functions();
Parcours simple (foreach) Itérer sur un tableau d’objets et accéder aux propriétés/méthodes.

class User{ public function __construct(public int $id, public string $name){} }
$users = [new User(1,'Ana'), new User(2,'Bob')];

foreach ($users as $u) {
  echo $u->id.' '.$u->name.PHP_EOL;
}
Filtrage (array_filter) Garder uniquement les objets qui satisfont un prédicat. Penser à array_values() pour réindexer.

$adults = array_values(array_filter($users, fn($u) => $u->age >= 18));
Filtrage avec clés (ARRAY_FILTER_USE_BOTH) Le callback reçoit la valeur et la clé (index).

$keepOddIdx = array_filter($users, fn($u,$i)=>$i%2===1, ARRAY_FILTER_USE_BOTH);
Mapping (array_map) Transformer un tableau d’objets (extraction d’une propriété ou DTO).

$names = array_map(fn($u) => $u->name, $users);
$rows  = array_map(fn($u) => ['id'=>$u->id,'name'=>$u->name], $users);
Recherche (trouver le premier) Récupérer le premier objet correspondant (sans double boucle).

function findFirst(array $items, callable $pred): ?object {
  foreach ($items as $it) if ($pred($it)) return $it;
  return null;
}
$bob = findFirst($users, fn($u)=>$u->name==='Bob');
Indexation par clé (lookup O(1)) Construire un tableau associatif indexé par une propriété (ex: id).

$byId = [];
foreach ($users as $u) { $byId[$u->id] = $u; }
$user2 = $byId[2] ?? null;
Groupement (groupBy) Regrouper les objets selon une propriété (ex: âge).

function groupBy(array $items, callable $key): array {
  $out = [];
  foreach ($items as $it) { $out[$key($it)][] = $it; }
  return $out;
}
$byAge = groupBy($users, fn($u)=>$u->age);
Tri (usort + <=>) Ordonner par propriété (et tie-breaker secondaire).

usort($users, fn($a,$b) => ($a->age <=> $b->age) ?: strcasecmp($a->name,$b->name));
Réduction (somme/moyenne) Aggréger des valeurs dérivées des objets.

$totalAge = array_reduce($users, fn($acc,$u)=>$acc+$u->age, 0);
$avgAge   = count($users) ? $totalAge / count($users) : 0;
Unicité par propriété Dédupliquer sur une clé dérivée (ex: email).

function uniqueBy(array $items, callable $key): array {
  $seen=[]; $out=[];
  foreach ($items as $it) {
    $k=$key($it);
    if (isset($seen[$k])) continue;
    $seen[$k]=true; $out[]=$it;
  }
  return $out;
}
$unique = uniqueBy($users, fn($u)=>$u->email);
Partition Séparer en deux groupes selon un prédicat (ex: actifs/inactifs).

function partition(array $items, callable $pred): array {
  $yes=[]; $no=[];
  foreach ($items as $it) { ($pred($it) ? $yes : $no)[] = $it; }
  return [$yes, $no];
}
[$active,$inactive] = partition($users, fn($u)=>$u->active);
Pagination / segment (array_slice) Récupérer une page d’objets (offset/limit).

$page = 2; $per = 20; $offset = ($page-1)*$per;
$items = array_slice($users, $offset, $per);
Découpage fixe (array_chunk) Découper en lots de taille N (batch processing).

foreach (array_chunk($users, 100) as $batch) {
  // traiter 100 objets à la fois
}
Transformations paresseuses (générateurs) Itérations lazy pour gros volumes sans charger tout en mémoire.

function filter(iterable $it, callable $p): iterable { foreach ($it as $x) if ($p($x)) yield $x; }
function map(iterable $it, callable $f): iterable { foreach ($it as $x) yield $f($x); }

$names = map(filter($users, fn($u)=>$u->age>=18), fn($u)=>$u->name);
foreach ($names as $n) { /* stream */ }
Identité objet (set/map) : SplObjectStorage Unicité basée sur l’identité (pas une propriété) + métadonnées associées.

$set = new SplObjectStorage();
foreach ($users as $u) { $set->attach($u, ['seen'=>true]); }
$exists = $set->contains($users[0]); // true
Extraction de colonnes (objets → tableau) array_column() ne gère pas les objets; utiliser array_map().

$ids = array_map(fn($u)=>$u->id, $users);
Clonage en masse Dupliquer des objets (superficiel; prévoir __clone() pour deep copy).

$copies = array_map(fn($u)=>clone $u, $users);
Sérialisation JSON Encoder un tableau d’objets; implémenter JsonSerializable pour contrôler la sortie.

echo json_encode($users, JSON_THROW_ON_ERROR); // appelle jsonSerialize() si dispo
Nettoyage des vides Éliminer null/false en conservant les 0 valides (préciser un callback).

$clean = array_values(array_filter($users, fn($u)=>$u !== null));