-1
我有一個類加載我的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] =>
)
更新:我已經更新了基於給出的評論我的代碼,但我遇到了兩個問題。 ..
1:在__get
如果我回到return $this->_data->$name;
我可以修改它的類之外......我解決了這個與添加clone
- return clone $this->_data->$name;
2:我現在不能設置或一方$config->database->server = 'test';
或$config->_data->database->server = 'test';
更新值但是...沒有報告錯誤/異常,我甚至試圖用__set
迴應一些東西,但沒有什麼...
我認爲@lonesomeday提供的鏈接是過於複雜。只需使屬性受到保護,然後爲只讀訪問提供公共getter函數。如果外部代碼嘗試寫入它的值,則不需要拋出錯誤 - PHP將爲您執行此操作。 – halfer
我在查看評論後更新了我的問題,但現在我還有一些其他問題。 – cmorrissey
你有沒有考慮過使用常量? – Jonast92