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

PHP能够访问具有或不具有类上下文的属性,php,class,oop,Php,Class,Oop,我使用了搜索功能,但我无法找到问题的答案,因此它是: 我正在制作一个小游戏。这个游戏是关于星际飞船互相射击的。每艘星际飞船都是一个具有如下继承点值的类 class Ship { $public value; function __construct($value){ $this->value = $value; } } $value需要多次,在过去的一段时间里,只要服务器解决了游戏性问题,并且每个飞船都被正确实例化($Ship->value) 然而

我使用了搜索功能,但我无法找到问题的答案,因此它是:

我正在制作一个小游戏。这个游戏是关于星际飞船互相射击的。每艘星际飞船都是一个具有如下继承点值的类

class Ship {
    $public value;

    function __construct($value){
       $this->value = $value;
    }
}
$value
需要多次,在过去的一段时间里,只要服务器解决了游戏性问题,并且每个飞船都被正确实例化(
$Ship->value
) 然而,有时我也需要各种船舶的价值,而不需要先对它们进行实例化

这就是我的问题。我知道我可以通过将道具设置为静态(Ship:$value)来访问道具,而无需实例化,但是通过这样做,我不再能够从类内部访问道具(“将静态道具作为非静态访问”)

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

  • 多谢各位
我知道我可以通过使道具成为静态(Ship:$value)来访问道具,而无需实例化,但是这样做,我就无法再从类内部访问道具(“以非静态方式访问静态道具”)

您仍然可以从类内部访问静态属性。 你所要做的就是像这样调用它们
self::$value
,而不是
$this->value

我知道我可以通过使道具成为静态(Ship:$value)来访问道具,而无需实例化,但是这样做,我就无法再从类内部访问道具(“以非静态方式访问静态道具”)

您仍然可以从类内部访问静态属性。 你所要做的就是像这样调用它们
self::$value
,而不是
$this->value

我知道我可以通过使道具保持静态(Ship:$value)来访问道具,而无需实例化,但是通过这样做,我不再能够从类内部访问道具

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

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

$值需要几次,在过去的一段时间里,一旦服务器解决了游戏性问题,并且每个飞船都被正确实例化($Ship->value),然而,偶尔我也需要各种飞船的值,而不需要先实例化它们

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

如果船还不存在,如何定义它的价值

我想你的意思是所有船只的默认值。或者,可能有船舶类型,每种类型都有不同的值(但同一类型的所有船舶都有相同的值)

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

我知道我可以通过使道具保持静态(Ship:$value)来访问道具,而无需实例化,但是通过这样做,我不再能够从类内部访问道具

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

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

$值需要几次,在过去的一段时间里,一旦服务器解决了游戏性问题,并且每个飞船都被正确实例化($Ship->value),然而,偶尔我也需要各种飞船的值,而不需要先实例化它们

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

如果船还不存在,如何定义它的价值

我想你的意思是所有船只的默认值。或者,可能有船舶类型,每种类型都有不同的值(但同一类型的所有船舶都有相同的值)

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


如果您有关于飞船的任何信息,您可以使用静态函数从数据库中使用飞船的ID获取所需的值。如前所述,这个问题没有答案。你可能应该添加更多关于你到底想做什么的细节。如果你有关于飞船的任何信息,你可以使用静态函数从数据库中使用飞船的ID获取你需要的值。如前所述,这个问题没有答案。你可能应该添加更多关于你到底想做什么的细节。
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