La maggior parte delle risorse su PHP non toccano mai la gestione della memoria perché il linguaggio stesso è abbastanza buono per farlo. Tuttavia, in PHP si finisce spesso per gestire risorse esterne che non sono memoria: handle di database, sessioni, transazioni di database, ecc. Queste risorse esterne possono essere gestite in modo più pulito utilizzando una qualche forma di oggetto RAII.PHP supporta il pattern RAII? Come?
Inizialmente pensavo che PHP usasse uno schema di garbage collection simile alla JVM o al CLR, dove il concetto di un distruttore non esiste. (Ricorda: Everyone thinks about garbage collection the wrong way - i finalizzatori non sono distruttori!) C'è il metodo speciale __destruct
, ma ho pensato che fosse un "finalizzatore" simile a un finalizzatore Java o C#. Per questo motivo, non puoi utilizzare RAII su JVM o CLR (i blocchi using
di C# ti danno circa il 95% del tempo, ma è un po 'diverso ...).
Tuttavia, Google seems to indicate that PHP supports the RAII pattern, anche se non riesco a trovare la verifica di questo nei documenti PHP. La lingua supporta questo e sta mettendo la logica di pulizia in __destruct
sufficiente per eseguire le attività RAII?
Un altro avvertimento: quando più voci lasciano portata, allo stesso tempo, l'ordine di loro i distruttori sono chiamati è ufficialmente definito, e di solito in ordine FIFO (esattamente la opposto di ciò che è necessario per il RAII corretto). Questo è un dealbreaker per il mio particolare caso d'uso. – Brilliand
@Brilliand potresti aggiungere artificialmente delle parentesi per far rispettare l'ordine? :) – hobbs
Le parentesi non lo faranno - solo una funzione può introdurre un nuovo ambito. Ancora possibile, suppongo, ma quello potrebbe ammontare a molto standard. – Brilliand