2013-11-01 4 views
-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 : 나는 클래스의 외부 수정할 수 있어요 return $this->_data->$name; 내가 돌아 오면에서 __get ... 난 clone 추가로이 문제를 해결 - return clone $this->_data->$name;

2 : 지금 설정하거나 $config->database->server = 'test'; 또는 $config->_data->database->server = 'test'; 중 하나에 값을 업데이트 할 수 없습니다 그러나 ... 오류/예외가보고되지 않았습니다. 그리고 심지어 그냥 __set과 아무것도 사용하지 않으려 고 노력했습니다 ...

+2

내가 @lonesomeday에서 제공하는 링크가 지나치게 복잡하다 생각합니다. 그냥 속성을 보호하고 읽기 전용 액세스를위한 공개 게터 기능을 제공하십시오. 외부 코드가 값을 쓰려고하면 오류를 발생시킬 필요가 없습니다. PHP가이를 처리합니다. – halfer

+0

의견을 검토 한 후 내 질문을 업데이트했지만 지금은 몇 가지 추가 문제가 있습니다. – cmorrissey

+0

상수 사용을 고려 했습니까? – Jonast92

답변

2

회원은 비공개이어야합니다. get 함수 만 사용하여 값을 가져 오지만 클래스 외부에서는 수정할 수 없습니다. 예 :

class myClass{ 

    private $test; 

    public function getTest() 
    { return $this->test; } 

} 

방법은 전화 :

$classTest = new myClass(); 

$classTest->test NOT ALLOWED 
$classTest->getTest() -- Returns the value 
관련 문제