PHP能够访问具有和不具有类上下文的属性

时间:2016-12-29 08:47:37

标签: php class oop

我使用了搜索功能,但我无法找到问题的答案,所以这里是:

我正在建造一个小游戏。这场比赛是关于星舰相互射击的。每个Starship都是一个具有继承点值的类,如此

class Ship {
    $public value;

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

$value需要多次,一旦服务器解决了游戏玩法并且每个Ship都已正确实例化($ship->value) 然而,偶尔我也需要各种船只的价值,而不是先实例化它们。

这是我的问题。我知道我可以通过使它们静态(Ship::$value)来访问没有实例化的道具,但是通过这样做,我不再能够从类内部访问它(“访问静态道具和非静态”)< / p>

我的问题是:使用$ value属性设置我的类的最佳方法是什么,以便我可以尽可能普遍地访问它,即有和没有实例化类?

  • 谢谢

2 个答案:

答案 0 :(得分:2)

  

我知道我可以通过使它们静态化(Ship :: $ value)来访问没有实例化的道具,但是通过这样做,我不再能够从类内部访问它(&#34;访问静态道具,如同非静态&#34)

您仍然可以从类中访问静态属性。 您所要做的就是像self::$value而不是$this->value一样打电话给他们。

答案 1 :(得分:2)

  

我知道我可以通过使其静态化(Ship :: $ value)来访问没有实例化的道具,但是通过这样做,我无法再从类内部访问它。

静态属性类似于全局变量。当您更改它时,它会更改该类的所有对象,因为它只有一个实例。它不依赖于实例的存在,因为它是一个全局变量,可能只限于其类的对象。

object属性是类的每个实例的属性。在创建包含它的对象(类的实例)之前,不能使用它(get或set)。它不是单独存在的。

  

$ value需要多次,一旦服务器解决了游戏玩法并且每个Ship都被正确实例化($ ship-&gt; value),那么偶尔我也需要各种船只的价值而不需要先实例化它们。

你是什么意思“需要各种船只的价值而不实例化它们”

如果船舶不存在,又如何定义其价值?

我猜你的意思是所有船只的默认值。或者,也许,您有船型,每种类型都有不同的值(但所有相同类型的船具有相同的值)。

这可以通过定义一个(或多个)类变量(或常量)来轻松实现,这些变量存储所有船舶(或某种类型的所有船舶)的默认值。

class Ship {
    protected static $defaultValue = 42;

    public $value;

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

    public static function getDefaultValue()
    {
        return self::$defaultValue;
    }
}

// Use the default value (it's a class property, it always exists)
echo(Ship::getDefaultValue());        // 42
// Instantiate a ship, set a custom value to it
$ship = new Ship(51);
// Use its value
echo($ship->value);                   // 51
// You can also access the class property $defaultValue using an instance
echo($ship->getDefaultValue());       // 42