class
Config {
private
$config
;
private
$map
=
array
();
function
__construct(
$conf
,
$map
) {
$config
=
$this
->parseIni ( ( object ) parse_ini_string (
$conf
, true ) );
if
(
array_key_exists
(
'production'
,
$map
)) {
$production
=
$map
[
'production'
];
unset (
$map
[
'production'
] );
$map
=
array_merge
(
array
(
'production'
=>
$production
),
$map
);
}
else
{
throw
new
ErrorException (
'production section not found in config'
);
}
$section
=
'production'
;
$hostname
= gethostname ();
foreach
(
$map
as
$k
=>
$v
) {
if
(
is_array
(
$v
)) {
foreach
(
$v
as
$v1
) {
if
(
$v1
==
$hostname
) {
$section
=
$k
;
break
2;
}
}
}
elseif
(
is_callable
(
$v
)) {
if
(true == call_user_func (
$v
)) {
$section
=
$k
;
break
;
}
}
else
{
throw
new
ErrorException (
'Wrong map value in '
.
__CLASS__
);
}
}
$this
->config =
$config
->
$section
;
}
function
__get(
$key
) {
if
(isset (
$this
->config->
$key
)) {
return
$this
->config->
$key
;
}
}
private
function
split(
$v
,
$k1
,
$v1
) {
$keys
=
explode
(
'.'
,
$k1
);
$last
=
array_pop
(
$keys
);
$node
=
$v
;
foreach
(
$keys
as
$v2
) {
if
(! isset (
$node
->
$v2
)) {
$node
->
$v2
=
new
stdClass ();
}
$node
=
$node
->
$v2
;
}
$node
->
$last
=
$v1
;
if
(
count
(
$keys
) > 0) {
unset (
$v
->
$k1
);
}
}
private
function
parseIni(
$conf
) {
$confObj
=
new
stdClass ();
foreach
(
$conf
as
$k
=>
$v
) {
if
(
is_array
(
$v
)) {
$confObj
->
$k
= ( object )
$v
;
foreach
(
$v
as
$k1
=>
$v1
) {
call_user_func (
array
(
$this
,
'split'
),
$confObj
->
$k
,
$k1
,
$v1
);
}
}
else
{
call_user_func (
array
(
$this
,
'split'
),
$confObj
,
$k
,
$v
);
}
}
unset (
$conf
);
foreach
(
$confObj
as
$k
=>
$v
) {
if
(false !==
strpos
(
$k
,
':'
)) {
if
(0 ===
strpos
(
$k
,
':'
)) {
throw
new
ErrorException (
'config '
.
$k
.
' is invalid, '
:
' can'
t be the first char' );
}
elseif
(1 < substr_count (
$k
,
':'
)) {
throw
new
ErrorException (
'config '
.
$k
.
' is invalid, '
:
' can appear only once'
);
}
else
{
$keys
=
explode
(
':'
,
$k
);
if
(! isset (
$confObj
->
$keys
[1] )) {
throw
new
ErrorException (
'parent section '
.
$keys
[1] .
' doesn'
t exist in config file' );
}
else
{
if
(isset (
$confObj
->
$keys
[0] )) {
throw
new
ErrorException (
'config is invalid, '
.
$keys
[0] .
' and '
.
$k
.
' conflicts'
);
}
else
{
$confObj
->
$keys
[0] =
$this
->deepCloneR (
$confObj
->
$keys
[1] );
$this
->objectMergeR (
$confObj
->
$keys
[0],
$v
);
unset (
$confObj
->
$k
);
}
}
}
}
}
return
$confObj
;
}
private
function
deepCloneR(
$obj
) {
$objClone
=
clone
$obj
;
foreach
(
$objClone
as
$k
=>
$v
) {
if
(
is_object
(
$v
)) {
$objClone
->
$k
=
$this
->deepCloneR (
$v
);
}
}
return
$objClone
;
}
private
function
objectMergeR(
$obj1
,
$obj2
) {
foreach
(
$obj2
as
$k
=>
$v
) {
if
(
is_object
(
$v
) && isset (
$obj1
->
$k
) &&
is_object
(
$obj1
->
$k
)) {
$this
->objectMergeR (
$obj1
->
$k
,
$v
);
}
else
{
$obj1
->
$k
=
$v
;
}
}
}
}