在PHP中永久设置私有类变量

在PHP中永久设置私有类变量,php,class,global-variables,getter-setter,objectinstantiation,Php,Class,Global Variables,Getter Setter,Objectinstantiation,问题是:我想在类中永久设置私有变量,然后从类外部使用getter函数访问它们。问题是每次我实例化一个新的类并创建一个对象时,它都会破坏以前设置的变量。在提供的示例中,我不想通过调用函数“GetReach”传递对象。我只想访问globalVars类,而不破坏任何设置变量。我知道,通过创建一个“新对象”,本质上破坏了当前而非静态变量。因此: 如何在类中永久设置私有变量 或 如何在不重新实例化类的情况下调用函数(getter/setter)(以避免破坏当前设置的变量) 我担心我的方法不对,或者我的

问题是:我想在类中永久设置私有变量,然后从类外部使用getter函数访问它们。问题是每次我实例化一个新的类并创建一个对象时,它都会破坏以前设置的变量。在提供的示例中,我不想通过调用函数“GetReach”传递对象。我只想访问globalVars类,而不破坏任何设置变量。我知道,通过创建一个“新对象”,本质上破坏了当前而非静态变量。因此:

  • 如何在类中永久设置私有变量
  • 如何在不重新实例化类的情况下调用函数(getter/setter)(以避免破坏当前设置的变量)
我担心我的方法不对,或者我的方法有缺陷

<?php

class globalVars{

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

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

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

}

class driver{

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

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

        $this->getAgain();
   }

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


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

$driver = new driver($input);

?>

首先,在重新实例化类时,设置的变量不会被销毁。这就是所谓的封装,意味着类的每个实例都有自己的一组属性,这对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.

您只需使用
静态
变量即可

或者,如果您想全局访问一个类,您可以使用,为此添加一个静态变量,例如
$\u 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);

为什么不使用静态var?那么您实际上是在创建一个单例模式?关于正在发生的事情,可以更好地解释一下。另外,
getObj
是否需要公开?