4

问题:我想在一个类中永久设置私有变量,然后从类外部使用 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);

?>
4

2 回答 2

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.

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

于 2015-01-28T22:03:32.860 回答
2

您可以简单地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);
于 2015-01-28T22:04:48.117 回答