-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] => 
)

更新: 与えられたコメントに基づいてコードを更新しましたが、2 つの問題が発生しました ...

1:__get私が戻った場合return $this->_data->$name;、クラスの外でそれを変更することができます...追加してこれを解決しましたclone-return clone $this->_data->$name;

$config->database->server = 'test';2: どちらでも値を設定または更新することはできませんが$config->_data->database->server = 'test';...エラー/例外は報告されず、何かをエコーし​​てみました__set...

4

1 に答える 1