나는 내 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 : 나는 클래스의 외부 수정할 수 있어요 return $this->_data->$name;
내가 돌아 오면에서 __get
... 난 clone
추가로이 문제를 해결 - return clone $this->_data->$name;
2 : 지금 설정하거나 $config->database->server = 'test';
또는 $config->_data->database->server = 'test';
중 하나에 값을 업데이트 할 수 없습니다 그러나 ... 오류/예외가보고되지 않았습니다. 그리고 심지어 그냥 __set
과 아무것도 사용하지 않으려 고 노력했습니다 ...
내가 @lonesomeday에서 제공하는 링크가 지나치게 복잡하다 생각합니다. 그냥 속성을 보호하고 읽기 전용 액세스를위한 공개 게터 기능을 제공하십시오. 외부 코드가 값을 쓰려고하면 오류를 발생시킬 필요가 없습니다. PHP가이를 처리합니다. – halfer
의견을 검토 한 후 내 질문을 업데이트했지만 지금은 몇 가지 추가 문제가 있습니다. – cmorrissey
상수 사용을 고려 했습니까? – Jonast92