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)