【问题标题】:Being able to access a property with and without class instantiation?能够在有和没有类实例化的情况下访问属性吗?
【发布时间】:2016-11-01 18:27:24
【问题描述】:

我有一个具有特定属性的类,我需要在没有和使用类实例化的情况下访问它。
在阅读了互联网之后,我觉得自己很聪明,并将其声明为公共静态,瞧,我能够使用 :: 访问该值,而无需实际创建该类的对象。

现在,几个小时后我需要访问相同的值,但这次是在循环一个包含该类的实际实例的数组的过程中,我无法访问它......

请指教

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 作为非静态访问

和

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

【问题讨论】:

    标签: php oop properties


    【解决方案1】:

    value 仍然是类的一部分,因为它是一个静态属性。您可以通过$ships[$i]::$value 访问它。

    【讨论】:

    • 你确定?因为它不适合我。 prntscr.com/d1sx71 顶部错误,左侧类,调用右侧代码。
    • 我确定。 + 不是 php 的连接运算符。它是.。另外,删除它们后面的;。
    • 该死的。很抱歉打扰你。谢谢。
    • 作为说明,我修复了我的错误,但我只能使用 $ships[$i]::$value 而不是 $ships[$i]::value 访问道具!
    【解决方案2】:

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

    代码错误:Class Omega(){ => class Omega {, $ships[i$]-&gt;value => $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
    

    【讨论】:

    • 这很有趣。谢谢。
    【解决方案3】:

    注意,你想做的,是通过construct和__toString方法完成的。静态方法无需在类外实例化即可调用。

    如果您想完成任务,请尝试使用 __toString() 方法来完成此操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2022-12-03
      • 2018-04-02
      • 1970-01-01
      • 2015-07-19
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多