OO PHP从另一个类访问公共变量

时间:2013-07-10 17:12:06

标签: php oop

我有一个如下课程:

class game {

    public $db;
    public $check;
    public $lang;

    public function __construct() {

        $this->check = new check();

        $this->lang = DEFAULT_LANG;
        if (isset($_GET['lang']) && !$this->check->isEmpty($_GET['lang']))
            $this->lang = $_GET['lang'];
    }

}

如您所见,我有一个公共变量$lang,它也是通过构造函数定义的。

问题是我想从其他与这个类没有直接关系的类中访问这个变量的结果,因为我不想为每个不同的类重新声明它。

例如,我如何从另一个类调用该变量的结果,让我们调用它class Check

4 个答案:

答案 0 :(得分:30)

如果您将public $lang;标记为静态:

public static $lang;

您可以通过game::$lang;

访问它

如果不是静态的,你需要创建一个游戏实例并直接访问它:

$game = new game;
$game->lang;

(当前)类中的静态调用:

self::$lang;

late static bound调用(继承静态变量):

static::$lang;

从子类调用父类:

parent::$lang;

实例内部的正常调用(实例是当您使用new Obj();时):

$this->lang;

<强>顺便说一句:define('DEFAULT_LANG', 'en_EN');定义的变量是GLOBAL范围,意思是,可以随处访问!

<?php
define('TEST', 'xxx');

class game {
    public function __construct() {
        echo TEST;
    }
}

//prints 'xxx'
new game;

答案 1 :(得分:5)

你可以把它变成静态变量,这样你就可以随时随地调用它,而不是

$this->lang;

编辑时(仅限课堂游戏)你可以:

self::$lang;

当您从另一个类中调用/编辑它(无处不在)时,您可以:

game::$lang

静态类的想法是它只存在于一个实例中,因此程序中只存在一个$ lang。但是没有必要加载整个课程以获得它。

答案 2 :(得分:1)

  

如何从另一个类调用该变量的结果,让我们称之为类Check?

变量没有结果。如果您要在类$obj的特定对象game上检索该变量的状态,那么您可以这样做:

$obj->lang

另外,如果$lang仅公开阅读,则应通过定义privateprotected并创建 getter方法来保护它。

如果你的意思是你想在另一个类中使用相同的变量名,我建议你考虑继承

class Check extends game { /* now Check has $lang */ }

但两个对象的变量会有所不同。

答案 3 :(得分:0)

由于该属性是公共属性,因此您可以从类外部以$objInstance->property的形式访问该属性。如果你从一个函数,程序脚本,在另一个对象中调用它并不重要。只要您拥有该实例,就可以将其称为公共属性。例如:

function foo($c) {
    echo $c->lang;
}
foo($check);

另外,关于使用对象等的一些建议:如果你不在其他对象中创建对象的实例,而是以某种方式传递它们(无论是setter方法还是通过构造函数),它被认为是更好的代码。这样可以使类松散耦合,从而使代码更易于重用且更易于测试。所以:

class Game
{

...
public function __construct($check, $defaultLang, $get) {

    $this->check = $check;

    $this->lang = $defaultLang;
    if (isset($get['lang']) && !$this->check->isEmpty($get['lang']))
        $this->lang = $get['lang'];
}
...

$game = new Game(new Check(), DEFAULT_LANG, $_GET);
echo $game->check;

this article的前半部分是对所谓的依赖注入的可访问解释。