모든 단일 PHP 클래스의 생성자에서 글로벌을 선언하지 않고도 전 세계적으로 변수를 볼 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1234445

문제

데이터베이스 클래스가 있으며 인스턴스가 메인에 선언됩니다. index.php ~처럼

$db = new Database();

방법이 있습니까? $db 선언하지 않고 다른 모든 클래스에서 전 세계적으로 인식되는 변수

global $db;

각 클래스의 생성자에서?

도움이 되었습니까?

해결책

아닙니다. 모든 클래스의 생성자에서 Global $ DB를 선언해야합니다.

또는 글로벌 배열을 사용할 수 있습니다 : $ _globals [ 'vars'];

이것을 둘러 볼 수있는 유일한 방법은 정적 클래스를 사용하여 그것을 래핑하는 것입니다. 싱글 톤 방법 (보다 여기 설명을 위해). 그러나 이것은 매우 나쁜 연습입니다.

  class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    // Then create regular class functions.
   }

싱글 톤 방법은 모든 클래스의 인스턴스 만 있는지 확인하기 위해 만들어졌습니다. 그러나 사람들은 그것을 글로벌링하는 방법으로 사용하기 때문에 게으른/나쁜 프로그래밍으로 알려지게됩니다.

stackoverflow 지식
PHP 글로벌 객체 사용을 피하는 방법
글로벌을 사용하지 않고 PHP의 함수간에 변수를 공유합니다
클래스 내의 모든 기능에 대해 글로벌 변수에 액세스 할 수 있도록
데이터베이스 연결을위한 글로벌 또는 싱글 톤

다른 팁

나는 조금 다르게한다. 나는 보통 글로벌 애플리케이션 객체 (APP)가 있습니다. 그 객체 내에서 나는 DB 객체 만들기, 캐싱 객체 등과 같은 기본 초기화를 수행합니다.

또한 앱 객체를 반환하는 전역 기능이 있습니다 .... 따라서 (응용 프로그램 객체 정의는 표시되지 않음) :

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

function app() {
    return $GLOBALS[APPLICATION_ID];
}

따라서 모든 코드의 어느 곳에서나 다음과 같은 것을 사용하여 글로벌 객체 내에서 객체를 참조 할 수 있습니다.

app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();

완벽하지는 않지만 많은 상황에서 일을 더 쉽게 만들 수 있습니다.

당신은 사용할 수 있습니다

$GLOBALS['db']->doStuff();

또는 대안 적으로 일종의 싱글 톤 액세스 방법을 사용합니다

Database::getInstance()->doStuff();

왜 포함 된 클래스를 만들지 않겠습니까? global $db; 생성자에서 다른 모든 클래스를 이것에서 확장합니까?

당신은 a를 사용할 수 있습니다 Registry 수업을 저장하고 검색 할 수 있습니다 Database 사례.

class Registry
{
    protected static $_data = array();

    public static function set($key, $value)
    {
        self::$_data[$key] = $value;
    }

    public static function get($key, $default = null)
    {
        if (array_key_exists($key, self::$_data)) {
            return self::$_data[$key];
        }

        return $default;
    }
}

Registry::set('db', new Database());
$db = Registry::get('db');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top