전역 변수를 사용하지 않고 PHP에서 함수 간에 변수를 공유합니다.

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

  •  23-08-2019
  •  | 
  •  

문제

Memcache 서버와 상호작용하는 클래스가 있습니다.데이터를 삽입, 삭제, 검색하는 다양한 기능이 있습니다.원래 각 함수는 다음을 호출했습니다. memcache_connect(), 그러나 이는 불필요했습니다. 예:

mc->insert()  
mc->get()  
mc->delete() 

세 개의 Memcache 연결을 만듭니다.나는 클래스에 대한 구성을 만들어 이 문제를 해결했습니다.

function __construct() {
    $this->mem = memcache_connect( ... );
}

그런 다음 사용하여 $this->mem 리소스가 필요한 곳마다 세 가지 기능이 각각 동일한 것을 사용합니다. memcache_connect 자원.

괜찮습니다. 그러나 다른 클래스 내부에서 클래스를 호출하면 다음과 같이 됩니다.

class abc
{
    function __construct() {
        $this->mc = new cache_class;
    }
}    
class def
{
    function __construct() {
        $this->mc = new cache_class;
    }
}

그럼 아직 두 개를 만드는 중이군요 memcache_connect 전화할 때만 필요 하나.

전역 변수를 사용하여 이 작업을 수행할 수 있지만 꼭 필요하지 않다면 사용하지 않는 것이 좋습니다.

전역 구현 예시:

$resource = memcache_connect( ... );

class cache_class
{
    function insert() {
        global $resource;
        memcache_set( $resource , ... );
    }
    function get() {
        global $resource;
        return memcache_get( $resource , ... );
    }

}

그러면 클래스가 몇 번 호출되더라도 한 번만 호출됩니다. memcache_connect.

이를 수행할 수 있는 방법이 있습니까? 아니면 전역 변수를 사용해야 합니까?

도움이 되었습니까?

해결책

나는 Memcache의 유일한 인스턴스를 얻기 위해 싱글 톤 패턴을 사용하여 다른 클래스를 코딩 할 것입니다. 이와 같이 -

class MemCache 
{ 
  private static $instance = false;   
  private function __construct() {}

  public static function getInstance()
  { 
    if(self::$instance === false)
    { 
      self::$instance = memcache_connect(); 
    } 

    return self::$instance; 
  } 
}

그리고 사용 -

$mc = MemCache::getInstance();
memcache_get($mc, ...)
...

다른 팁

MC 인스턴스에서 통과 :

class abc
{
    function __construct($mc) {
        $this->mc = $mc;
    }
}    
class def
{
    function __construct($mc) {
        $this->mc = $mc;
    }
}

$mc = new cache_class;
$abc = new abc($mc);

등.

나는 당신이 여기서 정적 특성을 찾고 있다고 생각합니다.

class mc {
    private static $instance;

    public static function getInstance() {
        if (self::$instance== null) {
            self::$instance= new self;
        }
        return self::$instance;
    }

    private function __construct() {
        $this->mem = memcache_connect(...);
    }
}

이것은 기본 싱글 톤 패턴을 구현합니다. 객체 호출을 구성하는 대신 mc::getInstance(). 살펴보십시오 싱글 톤.

의존성 주입을 사용해야 합니다.싱글톤 패턴과 정적 구성은 본질적으로 전역적이기 때문에 나쁜 습관으로 간주됩니다(그리고 타당한 이유 때문에 인스턴스화하는 클래스를 다른 클래스와 반대로 사용하도록 강화합니다).

손쉬운 유지 관리를 위해 수행해야 할 작업은 다음과 같습니다.

class MemCache {
    protected $memcache;

    public function __construct(){
        $this->memcache = memcache_connect();
    }
}

class Client {
    protected $MemCache;

    public function __construct( MemCache $MemCache ){
        $this->MemCache = $MemCache;
    }

    public function getMemCache(){
        return $this->MemCache;
    }
}

$MemCache = new MemCache();
$Client = new Client($MemCache);
$MemCache1 = $Client->getMemCache();

// $MemCache and $MemCache1 are the same object. 
// memcache_connect() has not been called more than once.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top