설정 파일을 클래스에서 사용할 때 슈퍼 글로벌 변수를 사용하는 것에 대하여

2 년 전

1202명이 읽음

PHP Config는 무엇을 사용해야할까? 글에 보면 config를 php 파일로 준비해두고 이를 require 해서 사용하는 방식이 나옵니다.

<?php
return [
    'database' => [
        'username' => 'hello',
        'password' => 'hello pass',
    ],
];
<?php
$configPhp = require './configs/config.php';

클래스에서 이 설정값을 사용하고자 할 때 $GLOBALS에 넣어서 사용해도 상관 없을까요? 예를들면 아래와 같이 프론트컨트롤러에서 config 파일을 불러들여 $GLOBALS에 넣어두고 모든 클래스에서 사용하는 것입니다.

//index.php
<?php
$GLOBALS['config'] = require './configs/config.php';
?>
// SomeClass.php
<?php
class SomeClass()
{
    public function someFunction()
    {
        $username = $GLOBALS['config']['username'];
        $password = $GLOBALS['config']['password'];
    }
}
?>

PHP dotenv 도 설정 파일에 있는 값들을 $_ENV 와 $_SERVER 에 저장해주는 방식을 사용하는 걸로 보아 크게 문제가 없을 것 같긴한데요, 슈퍼 글로벌 변수를 사용하는 것이 나쁜 습관이라는 말을 얼핏 들은 것 같아서 좀 찝찝하네요.

smartbos
2 년 전

Comments0

2 Answers

$GLOBAL 에 일부러 넣었다 꺼내서 사용하는 이유가 있으신가요? 질문을 $GLOBAL에 뭔가를 넣었을 때 사이드 이팩트가 생겨 다른 문제가 생기지 않느냐로 이해했는데 그것과는 별개로 그러면 일부러 $GLOBAL 에 넣으셔야 했던 이유가 궁금합니다. 장점이나 편리함이나 어쩔 수 없는 이유가 있는 것인가요?

이런 부수 효과를 고민하기 싫으셨던 것이라면 이런 구현이 가능할 것으로 생각 됩니다.

function config($key) {
    $config = require './configs/config.php';
    return $config[$key];
}

config 가 필요한 경우 시스템의 다른 부분에서 위 펑션을 호출하면 되겠고요, $GLOBAL 이 등장하지 않으니 질문하신 고민은 여기선 문제되지 않겠습니다.

$GLOBAL 사용 회피보다 $GLOBAL 에 뭔가를 넣는 것이 문제가 되느냐가 더 궁금하신 거라면 제가 정확히 답은 모르는데 별 문제 있을까 싶습니다. 일반적인 변수에 뭔가를 넣고 빼는 것이 문제가 되지 않는 것처럼 마찬가지가 아닐까 싶습니다.

그러나 갖고계신 로직의 복합적인 상황에 의해 문제가 생길 가능성이 있긴 있지 않을까 싶기도 하네요. 예를 들어, 사용하는 외부 패키지가 $GLOBAL 변수를 출력하는 기능이 있는데 config.php 에서 db 설정 정보가 기록되어 있어 $GLOBAL에 담긴 패스워드가 출력된다던지 하는 시나리오입니다. 넣는 것에 있어서도 $GLOBAL 변수에 'config' 설정으로 사용하는 다른 외부 라이브러리가 있다면 그 값을 덮는 문제가 발생할 수 있겠습니다. 길게 설명했지만 모두 전역 스테이트를 사용하는 문제와 마찬가지 입니다.

위와 같은 상황이 쉽게 발생하지는 않겠지만 $GLOBAL은 PHP 사용자들이 모두 사용(이해)하는 변수이기 때문에 이 상태를 사용하는 것은 상태를 사용하지 않는 것보다 문제 발생 가능성이 높겠죠.

koojunho
2 년 전

Comments1

  • smartbos 2 년 전

    아 헬퍼 스타일로 처리하면 훨씬 간단하게 처리가 되네요. 클래스 변수 범위만 생각하다가 '어? 클래스 외부에서 require 해서 변수에 담으면 클래스에서 어떻게 쓰게 하지?'라고 생각해서 '전역 변수를 쓰면 되나? 근데 전역 변수 쓰지 말라던데 써도 되나?' 라는 식으로 생각이 흘러갔었어요. -_-;;

구준호님이 아주 훌륭한 방식을 설명해주셨고, 저는 위 소스를 조금 더 개선해보았습니다.

function config($key, $defualt = null) {
    static $config;
    if (!isset($config)) {
        $config = require './configs/config.php';
    }
    return array_key_exists($key, $config) ? $config[$key] : $default;
}
wan2land
2 년 전

Comments0