2013-11-01 50 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:在__get如果我回到return $this->_data->$name;我可以修改它的類之外......我解決了這個與添加clone - return clone $this->_data->$name;

2:我現在不能設置或一方$config->database->server = 'test';$config->_data->database->server = 'test';更新值但是...沒有報告錯誤/異常,我甚至試圖用__set迴應一些東西,但沒有什麼...

+2

我認爲@lonesomeday提供的鏈接是過於複雜。只需使屬性受到保護,然後爲只讀訪問提供公共getter函數。如果外部代碼嘗試寫入它的值,則不需要拋出錯誤 - 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 
相關問題