永久设置私有类变量 PHP


Set Private Class Variables Permanently PHP

问题:我想在类中永久设置私有变量,然后从类外部使用getter函数访问它们。 问题是每次我实例化一个新的类并创建一个对象时,它都会破坏以前设置的变量。 在提供的示例中,我不想通过调用函数"getAgain"传递对象。 我想简单地访问 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.

编辑:我稍微更改了类以显示静态属性和实例属性之间的区别。

您可以简单地为此使用static变量。

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