永久设置私有类变量PHP

Dav*_*vin 4 php class global-variables objectinstantiation getter-setter

问题:我想在类中永久设置私有变量,然后使用类外部的getter函数访问它们.问题是每次我实例化一个新的类并创建一个对象时它会破坏先前设置的变量.在提供的示例中,我不想通过调用函数"getAgain"传递对象.我想简单地访问globalVars类而不破坏任何设置变量.我知道通过创建一个'新对象'本质上会破坏当前不是静态的变量.所以:

  • 你如何在一个类中永久设置私有变量?
  • 要么
  • 如何在不重新实例化类的情况下调用函数(getter/setter)(以免破坏当前设置的var(s)).

我担心我不会以正确的方式接近这一点,或者我的方法论存在缺陷.

<?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);

?>
Run Code Online (Sandbox Code Playgroud)

Jon*_*uhn 6

首先,当你重新实例化类时,你设置的变量不会被破坏.这就是封装,意味着类的每个实例都有自己的一组属性,这对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.
Run Code Online (Sandbox Code Playgroud)

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