16

我有一个像下面这样的类:

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

4 回答 4

36

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

public static $lang;

您可以通过以下方式访问它game::$lang;

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

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

(当前)类内部的静态调用:

self::$lang;

后期静态绑定调用(对继承的静态变量):

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;
于 2013-07-10T17:22:21.853 回答
5

您可以将其设为静态变量,因此您可以随时随地调用它,不同之处在于

$this->lang;

编辑时(仅适用于课堂游戏),您可以:

self::$lang;

当你从另一个类调用/编辑它(随处可用)时,你会这样做:

game::$lang

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

于 2013-07-10T17:25:04.550 回答
2

我怎样才能从另一个类调用该变量的结果,让我们称之为类检查?

变量没有结果。如果您的意思是在特定$obj的类对象上检索该变量的状态,game那么您可以简单地执行以下操作:

$obj->lang

附带说明一下,如果$lang是公开只读的,您应该通过定义它来保护它,private或者改为protected创建一个getter 方法

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

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

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

于 2013-07-10T17:17:31.160 回答
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;

本文的前半部分是对所谓的依赖注入的一种易于理解的解释。

于 2013-07-10T17:16:12.353 回答