全局变量而不必重新声明每个函数?

时间:2014-01-28 15:52:12

标签: php class-design

我希望能够访问全局变量,而无需重新声明每个函数。这是一个例子。

$mobile = 1;


class Database
{


    private $connect;


    function one($argumentarray)
    {
     global $mobile;
     echo $mobile;
    }

    function two($argumentarray)
    {
     global $mobile;
     echo $mobile;
    }

    function three($argumentarray)
    {
     global $mobile;
     echo $mobile;
    }
}

我有大约100个函数,我需要访问所有这些函数中的$mobile变量。有没有办法在不必在每个函数中执行global $mobile的情况下执行此操作?

6 个答案:

答案 0 :(得分:2)

最好的方法是 NOT 使用全局。以一种没有全局变量的方式设计你的程序。就是这样。

想到一个简单的设计,可能看起来像:

class Configuration {

    protected static $mobile = 1;

    // let's say it's write protected -> only a getter. 
    public static mobile() {
        return self::$mobile;
    }
}


class Database {

    // use the config value
    function one() {
        if(Configuration::mobile()) {
            ...
        }
    }
}

答案 1 :(得分:1)

使用$GLOBALS数组。

$GLOBALS["mobile"]

或者您可以将变量存储在您的班级中 - 我认为这更干净。

答案 2 :(得分:1)

嗯,你可以这样做:

class Database
{

    private $connect;
    private $mobile;

    function __construct() {
        #assign a value to $mobile;
        $this->mobile = "value";
    }

    function one($argumentarray)
    {
     echo $this->mobile;
    }

    function two($argumentarray)
    {
     echo $this->mobile;
    }

    function three($argumentarray)
    {
     echo $this->mobile;
    }
}

答案 3 :(得分:1)

已经有5个答案,没人提到静态类变量。

在构造函数中复制变量将是浪费,不切实际且会损害可读性。如果您稍后需要更改此全局的值,该怎么办?每个对象都会被一个过时的复制值所困扰。这太傻了。

由于您无论如何都需要前缀来访问此“全局”,因此请将其设为self::Database::而不是this->:)。

它会

  • 允许您直接从类定义
  • 设置变量
  • 不浪费内存为每个对象复制它
  • 如果您这样做,可以从外面访问它(如果您声明public

在你的例子中:

 class Database {
    static private $mobile = "whatever";

    function one($argumentarray)
    {
        echo self::$mobile;
    }

    function two($argumentarray)
    {
        echo self::$mobile;
    }

    function three($argumentarray)
    {
        echo self::$mobile;
    }
}

如果您想允许来自外部的修改:

static private $mobile;
static function set_mobile ($val) { self::$mobile = $val; }
static function get_mobile ($val) { return self::$mobile; }

static public $mobile;

答案 4 :(得分:0)

可能是一个class属性,并使用构造函数设置它?

class myClass {
    private $mobile;
    /* ... */
}

在构造函数中,执行:

public function __construct() {
    $this->mobile = $GLOBALS['mobile'];
}

然后使用:

$this->mobile
来自世界各地!

答案 5 :(得分:0)

将变量传递给构造函数,并设置类级变量。 然后可以使用$ this->

在varius方法中访问它
$mobile = 1;


class Database
{


    private $connect;
    private $mobile

    function __construct($mobile){
        $this->mobile=$mobile;
    }

    function one($argumentarray)
    {

     echo $this->mobile;
    }

    function two($argumentarray)
    {

     echo $this->mobile;
    }

    function three($argumentarray)
    {

     echo $this->mobile;
    }
}

$db = new Database($mobile);