3

문제 : 클래스의 전용 변수를 영구히 설정 한 다음 클래스 외부의 getter 함수로 액세스하려고합니다. 이 문제는 새 클래스를 인스턴스화하고 이전에 설정 한 변수를 파괴하는 객체를 만들 때마다 발생합니다. 제공된 예제에서 "getAgain"호출 함수를 통해 객체를 전달하고 싶지 않습니다. 나는 단순히 설정 변수를 파괴하지 않고 globalVars 클래스에 액세스하고 싶습니다. 본질적으로 '새로운 대상'을 만들어 냄으로써 현재의 정적 병이 아닌 현재의 병을 파괴한다는 것을 알고 있습니다. 그래서 :개인 클래스 변수를 영구적으로 설정 PHP

  • 어떻게 클래스 내에서 개인 변수를 영구적으로 설정합니까?
  • 또는
  • 클래스를 다시 인스턴스화하지 않고 (현재 설정된 var (s)을 파괴하지 않음) 어떻게 함수 (getter/setter)를 호출합니까?

나는 올바른 방법으로 접근하지 않거나 내 방법론에 결함이있을 수 있습니다.

+2

왜 정적 var를 사용하지 않습니까? – Cooper

답변

5

먼저 변수를 다시 인스턴스화하면 설정 한 변수가 파괴되지 않습니다. 이것은 캡슐화라고하는 것으로, 클래스의 모든 인스턴스에는 OOP에있어 중요한 속성 집합이 있습니다. 값이 각 인스턴스화의 기본 클래스 정의에서 복사되는 것과 같이 기본값을 얻는다는 의미입니다. 클래스의 모든 인스턴스에서 변수를 사용할 수있게하려면 정적 변수를 사용해야합니다.

<?php 
class globalVars{ 

    private static $final = "Default Foo </br>"; 

    private $instance = "Some default value"; 

    public function setStatic($param){ 
     self::$final = $param; 
    } 

    public function setInstance($param){ 
     $this->instance = $param; 
    } 

    public function getStatic(){ 
     return self::$final; 
    } 

    public function getInstance(){ 
     return $this->instance; 
    } 
} 

$test = new globalVars(); 
$test->setStatic("Foo"); 
$test->setInstance("Bar"); 

$test2 = new globalVars(); 
$final = $test2->getStatic(); 
$instance = $test2->getInstance(); 

echo $final; 
//outputs "Foo" 

echo $instance; 
//outputs the default value for the instance property because in this 
//instance the value was never changed. 

echo $test->getInstance(); 
//outputs "Bar" because the instance property was changed in this instance. 

편집 : 정적 및 인스턴스 속성 간의 차이점을 표시하기 위해 클래스를 조금 변경했습니다.

1

단순히 변수 static을 사용할 수 있습니다.

또는 하나의 클래스에 전역으로 액세스하려는 경우 을 사용할 수 있습니다.이 경우 $_obj과 같은 정적 변수와 정적 getter를 추가하십시오. 이제 그 수업이 필요할 때마다 globalVars::getObj()으로 전화하면됩니다.

<?php 

class globalVars{ 
    private static $_obj; 
    public static getObj() 
    { 
     if(!isset(self::$_obj)) self::$_obj = new globalVars(); 
     return self::$_obj; 
    } 

    private $final = "Default Foo </br>"; 

    public function setter($param){ 
     $this->final = $param; 
    } 

    public function getter(){ 
     return $this->final; 
    } 

} 

class driver{ 

    function __construct($param){ 
     $globalVars = globalVars::getObj(); 
     $globalVars->setter($param); 

     $val = $globalVars->getter(); 
     echo $val; 

     $this->getAgain(); 
    } 

    function getAgain(){ 
     $globalVars = globalVars::getObj(); 
     $val = $globalVars->getter(); 
     echo $val; 
    } 
} 


$input = "Change to Bar </br>"; 

$driver = new driver($input); 
+1

그래서 본질적으로 싱글 톤 패턴을 만들고 있습니까? 그것은 일어나고있는 일에 대해 조금 더 잘 설명 될 수 있습니다. 또한'getObj'가 공개 될 필요가 없습니까? –

+0

@JonathanKuhn 네, 고칠 수 있습니다. 감사 – Cooper