Scope delle variabili e inclusione dei file in PHP

9 dicembre 2016

Scope di una variabile

Prima di introdurre le funzioni non ci siamo soffermati sullo scope di una variabile. Per scope si intende la visibilità di una variabile, ovvero la "porzione" di codice in cui essa è accessibile.

Immaginiamo di definire una variabile $a e di volerla utilizzare in una funzione. Richiamando direttamente $a all'interno della funzione essa non avrà valore dato che è diverso il contesto in cui è definita:

$a = 10;

function sum($b) {
    return $a + $b;
}

echo sum(10);

Finché non abbiamo introdotto il concetto di scope è abbastanza normale aspettarsi come risultato il valore 20. Nel nostro caso, invece, restituirà 10 e solleverà un Notice come il seguente:

PHP Notice:  Undefined variable: a in php shell code on line 2

Questo perché nel contesto della funzione $a non è stata definita. Le funzioni hanno un loro scope locale, quindi possiamo utilizzare al loro interno anche nomi di variabili già usate in altri punti del codice.

Ovviamente, se proprio fosse necessario passare quella variabile ad una funzione, ci sono delle soluzioni.

Passare la variabile come argomento della funzione

Se non è necessario modificare la variabile $a ma ci serve solo il suo valore, possiamo passarla come argomento della funzione:

$a = 10;

function sum($a, $b) {
    return $a + $b;
}

echo sum($a, 10); //in questo caso il risultato sarà 20

Usare la keyword global

Un'altra soluzione è dichiarare la variabile come globale così da poterla utilizzare anche all'interno di altri scope.

$a = 10;

function sum($b) {
    global $a;

    return $a + $b;
}

echo sum(10); //anche in questo caso il risultato sarà 20

Con la keyword global possiamo indicare a PHP che ogni riferimento alla variabile $a deve essere cercato nello scope globale e non in quello locale.

Accedere all'array $GLOBALS

L'array $GLOBALS contiene tutte le variabili dichiarate fino a quel momento comprese le variabili predefinite ($_GET, $_POST, $_SERVER..). Possiamo quindi utilizzarlo per accedere al valore della variabile:

$a = 10;

function sum($b) {
    return $GLOBALS['a'] + $b;
}

echo sum(10); //anche in questo caso il risultato sarà 20

Per quanto sia comodo accedere a variabili esterne, e quindi aggirare il problema dello scope, salvo in rari casi è sconsigliato utilizzare questo approccio.

Quando possibile è consigliabile invece strutturare il codice affinché esso abbia un proprio scope, così da evitare risultati indesiderati.

Includere file nel codice

È possibile inserire il contenuto di un file PHP in un altro file PHP con i costrutti include e require.

Per includere il file è sufficiente richiamarlo con il path completo:

include 'nomedelfile.php';

//oppure

require 'nomedelfile.php';

Il risultato è sostanzialmente identico tranne per come vengono gestiti gli errori. Se si verifica un errore all'interno del codice incluso con require l'esecuzione viene arrestata con un fatal error E_COMPILE_ERROR. Nel caso di errore con include l'esecuzione dello script prosegue e viene sollevato un E_WARNING.

Scope delle variabili con include e require

Una variabile definita prima di includere un file è sempre visibile all'interno di un file incluso.

Supponiamo di creare un file chiamato moltiplica.php con contenuto:

<?php
    $a = $a * 100;
?>

e di avere il nostro codice principale in un file index.php, nella stessa cartella dell'altro file, con contenuto:

<?php

    $a = 10;

    include 'moltiplica.php';

    echo $a;

?>

Eseguendo il codice di index.php verrà stampato il valore 1000 perché la variabile $a è visibile all'interno del file incluso.

Evitare inclusioni ripetute dello stesso file

Supponiamo di avere un codice in cui in base a determinate condizioni potrebbe capitare di includere più volte lo stesso file. Se nel file incluso vengono definite funzioni o modificati i valori di variabili, sicuramente si possono avere risultati inaspettati.

Per evitare tali situazioni esistono include_once e require_once. Entrambi consentono di includere una sola volta lo stesso file anche se il costrutto venisse richiamato più volte.

Riutilizzando moltiplica.php immaginiamo di avere un index.php come il seguente:

<?php

    $a = 10;

    include 'moltiplica.php';
    include 'moltiplica.php';

    echo $a;

?>

Il risultato non sarà 1000 ma 100000 perché la moltiplicazione viene eseguita due volte.

Modificando il codice con il costrutto appena introdotto, invece, il risultato continuerà ad essere 1000:

<?php

    $a = 10;

    include_once 'moltiplica.php';
    include_once 'moltiplica.php';

    echo $a;

?>
Tutte le lezioni

1 ... 30 31 32 ... 51

Se vuoi aggiornamenti su Scope delle variabili e inclusione dei file in PHP inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Scope delle variabili e inclusione dei file in PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy