ファイルをロードし、config.ini
それらをオブジェクト/オブジェクト変数として設定するクラスがあります。これらをクラス外で読み取り可能にし、変更から保護したいですか? どうすればこれを達成できますか?
config.php
<?php
namespace app;
class config {
public $debug;
private $_data;
public function __construct(){
// parse config.ini
$data = (object) json_decode(json_encode(parse_ini_file(BASE_PATH . DS . 'inc' . DS . 'app' . DS . 'config.ini', true)));
// set debug
$this->debug = (bool) $data->debug;
// set data based on enviornment
foreach($data->{$data->environment} as $key => $value){
$this->_data->$key = (object) $value;
}
// turn on errors
if($this->debug == 1){
error_reporting(E_ALL ^ E_NOTICE);
ini_set("display_errors", 1);
}
// unset
unset($data);
}
public function __get($name) {
if (isset($this->_data->$name)) {
return clone $this->_data->$name;
} else {
//
}
}
public function __set($name, $value) {
//
echo 'ERROR';
}
}
?>
app.php
<?php
// load config
$config = new app\config();
echo '<pre>';
print_r($config);
echo '</pre>';
$config->database->server = 'test';
echo '<pre>';
print_r($config->database);
echo '</pre>';
$config->_data->database->server = 'test';
echo '<pre>';
print_r($config->database);
echo '</pre>';
?>
出力
app\config Object
(
[debug] => 1
[_data:app\config:private] => stdClass Object
(
[database] => stdClass Object
(
[server] => localhost
[database] =>
[username] =>
[password] =>
)
)
)
stdClass Object
(
[server] => localhost
[database] =>
[username] =>
[password] =>
)
stdClass Object
(
[server] => localhost
[database] =>
[username] =>
[password] =>
)
更新: 与えられたコメントに基づいてコードを更新しましたが、2 つの問題が発生しました ...
1:__get
私が戻った場合return $this->_data->$name;
、クラスの外でそれを変更することができます...追加してこれを解決しましたclone
-return clone $this->_data->$name;
$config->database->server = 'test';
2: どちらでも値を設定または更新することはできませんが$config->_data->database->server = 'test';
...エラー/例外は報告されず、何かをエコーしてみました__set
...