모든 단일 PHP 클래스의 생성자에서 글로벌을 선언하지 않고도 전 세계적으로 변수를 볼 수 있습니까?
문제
데이터베이스 클래스가 있으며 인스턴스가 메인에 선언됩니다. 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');