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

OO PHP从另一个类访问公共变量,php,oop,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->che

我的课程如下:

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

因为属性是公共的,所以您可以从类外部以
$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;
本文的前半部分是对所谓依赖注入的一个易于理解的解释

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

变量没有结果。如果您想在类
游戏
的特定对象
$obj
上检索该变量的状态,则只需执行以下操作:

$obj->lang
另一方面,如果
$lang
是公共只读的,您应该通过定义它
private
protected
来保护它,并创建一个getter方法

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


但是这两个对象的变量将不同。

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

public static $lang;
您可以通过
游戏::$lang

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

$game = new game;
$game->lang;
(当前)类内部的静态调用:

调用(对继承的静态变量):

从子类调用父类:

parent::$lang;
实例内部的正常调用(实例是在使用
new Obj();
时):

顺便说一句:
define('DEFAULT_LANG','en_en')定义的变量是全局范围,意味着,可以访问任何地方

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

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

//prints 'xxx'
new game;

您可以将其设置为静态变量,这样您就可以随时随地调用它,区别在于

$this->lang;
编辑时(仅适用于课堂游戏),请执行以下操作:

当您从另一个类调用/编辑它(在任何地方都有效)时,您会执行以下操作:

game::$lang

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

正如我所说的,我想在另一个类中调用它,而不是在程序代码或简单函数中调用它,这正是我想要的!
$this->lang;
<?php
define('TEST', 'xxx');

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

//prints 'xxx'
new game;
$this->lang;
self::$lang;
game::$lang