perchè sbagli ad usarli quei metodi:

Codice PHP:

<?php

class Environment {
  protected 
$server_var = [];


    
/**
     *
     */
    
public function __get($key) {


      if (empty(
$this->server_var[$key])) {
        if (isset(
$_SERVER) && count($_SERVER) && !empty($_SERVER[$key]) && !is_array($_SERVER[$key])) {
          
$this->server_var[$key] = $_SERVER[$key];
        }
        elseif (isset(
$_ENV) && count($_ENV) && !empty($_ENV[$key]) && !is_array($_ENV[$key])) {
          
$this->server_var[$key] = $_ENV[$key];
        }
        else {
          
$this->server_var[$key] = @getenv($key);
        }
      }
      return 
$this->server_var[$key];
    }


    
/**
     *
     */
    
public function __set($key$value) {
      
      
$this->server_var[$key] = $value;
    }


}

$environment = new Environment();

echo 
$environment->USERNAME//QUESTO RICHIAMA __get($key)

echo "\n";

$environment->USERNAME "New Username";

echo 
$environment->USERNAME//QUESTO RICHIAMA __set($key)


//versione 2
class Environment2{
    
    protected 
$server_var = [];
    
    public function 
__construct()
    {
        
//ACCEDERE A $_ENV e $_SERVER dentro la classe è una pratica scorretta
        // sarebbe meglio passarli come argomento al costruttore o con setter specifici
        
$this->server_var array_merge(
            isset(
$_ENV) && count($_ENV) ? $_ENV : [],
            isset(
$_SERVER) && count($_SERVER) ? $_SERVER : []
        );
        
        
//l'ordine del merge è importante: le chiavi definite in $_SERVER sovrascrivono le chiavi definite da $_ENV
    
}
    
    public function 
__get($key)
    {        
        return 
array_key_exists($key$this->server_var) ? $this->server_var[$key] : null;
        
    }
    
    public function 
__set($key$value)
    {        
        
$this->server_var[$key] = $value;
    }
    
    public function 
debug()
    {
        
var_dump($this->server_var);
    }
    
}


$env2 = new Environment2();

echo 
$env2->USERNAME;

echo 
"\n";

$env2->USERNAME "New Username";
echo 
$env2->USERNAME;
cmq visto che ci sono variabili tipo "SCRIPT_FILENAME" etc, ovvero con l'underscore, scrive $env->SCRIPT_FILENAME a me fa venire i brividi, per non parlare di dover scrivere tutto in maiuscolo. piuttosto quindi che usare __get e __set, userei __call e quindi farei tipo $env->getScriptFilename() ed $env->setScriptFilename($value) ovviamente andando a giocare con il primo paramentro che viene passato a __call (vedi manuale)