能够访问有和没有类实例化的属性?

时间:2016-11-01 18:27:24

标签: php oop properties

我有一个具有某种属性的类,我需要在没有类实例化的情况下访问它们 我觉得很聪明,并在阅读互联网后将其宣布为公共静态,我可以使用::访问该值,而无需实际创建该类的对象。

现在,在接下来的几个小时里我需要访问相同的值,但是这次循环遍历一个包含类的实际实例的数组并且我无法访问它....

请告知

Class Omega{
   public static $value = 500;
}

$name = "Omega";
$prop = "value";
$cost = $name::$$prop // 500 yay it works


$omega = new Omega();
$ships[] = $omega;

$totalCost = 0;

for ($i = 0; $i < sizeof($ships); $i++){
   $totalCost = $totalCost + $ships[i$]->value; // UGH    
}

我收到以下通知:

  

注意:在第44行的C:\ xampp \ htdocs \ fire \ test.php中访问静态属性Omega :: $ value为非静态

  

注意:未定义的属性:第44行的C:\ xampp \ htdocs \ fire \ test.php中的Omega :: $值

3 个答案:

答案 0 :(得分:1)

value仍然是该课程的一部分,因为它是一个静态属性。您可以使用$ships[$i]::$value访问它。

答案 1 :(得分:1)

这不是正确使用静态属性,因为只存在一个实例,因此每个$ships[$i]::$value具有完全相同的值。

代码错误:Class Omega(){ =&gt; class Omega {$ships[i$]->value =&gt; $ships[$i]::$value

考虑一下:

class Omega {
   public static $value = 500;
}

$arr = [new Omega(), new Omega()];
echo $arr[0]::$value . "\n";
echo $arr[1]::$value . "\n";

$arr[0]::$value = 400;

echo $arr[0]::$value . "\n";
echo $arr[1]::$value . "\n";

输出:

500
500
400
400

答案 2 :(得分:0)

注意,您要执行的操作是由construct和__toString方法完成的。调用静态方法而不在类外实例化。

如果您希望完成任务,请尝试__toString()mehtod以获得此任务