PHP静态类自动重置

我正在写一个我打算只静态调用的类,我注意到了一些我没想到的东西。考虑以下代码。


<?php

class Greeting {

  public static $greetingMSG;


  public static function setGreeting(string $greeting){

    self::$greetingMSG = $greeting;

    return new static;

  }


  public static function greet() {

    echo self::$greetingMSG;

  }

}


Greeting::greet();


Greeting::setGreeting('Hello World!')->greet();


Greeting::greet();


?>

我原以为第一次和第三次调用Greeting::greet();会给出相同的结果。相反,第二次和第三次调用给出了相同的结果。我知道这一定是因为对类的每次调用Greeting都没有创建类的新实例。reset()我可以通过添加一个方法使该类模仿我所期望的。


<?php

class Greeting {

  public static $greetingMSG;


  public static function setGreeting(string $greeting){

    self::$greetingMSG = $greeting;

    return new static;

  }


  public static function greet() {

    echo self::$greetingMSG;

    self::reset();

  }


  private static function reset() {

    self::$greetingMSG = '';

  }

}


Greeting::greet();


Greeting::setGreeting('Hello World!')->greet();


Greeting::greet();


?>

这表现得像我所期待的“Hello World!” 只输出一次。关于这里发生的事情是否有更技术性的解释,该reset()方法是模仿我所期望的最佳方法吗?


有只小跳蛙
浏览 211回答 2
2回答

梦里花落0921

我知道这一定是因为对类的每次调用greeting都没有创建类的新实例我认为你对这里的一些基本原理有一个基本的误解。这与是否$greetingMSG静态无关。一旦你设置了一个类成员变量,它的值将保持不变,直到你改变它。所有后续调用回显该变量将继续回显您之前已经设置的值。无论它是否是静态的,这将表现相同。是的,如果你愿意,你可以有一个重置方法来清除值,而且你实际上只是在做与setGreeting('');.无论如何,我不确定这个类充满静态方法的目的是什么,或者为什么你会有一个私有的重置方法。在我看来,这不是一个精心设计的课程。为什么不只是一个没有静态方法的普通类?它会更灵活,更有意义。这是一堆用法的示例:$greeting = new Greeting('Hello World!');$greeting->greet();$greeting->setMessage('Goodbye World!');$greeting->greet();$greeting->greet();$greeting2 = new Greeting();$greeting2->setMessage('Finished');$greeting2->greet();$greeting->greet();这按以下顺序打印:Hello World!Goodbye World!Goodbye World!FinishedGoodbye World!对此有几点需要注意:通过这种方式,您可以拥有多个带有不同消息的问候语实例。我们可以从我的代码中推断出Greeting该类有一个构造函数,它允许您在创建实例时设置消息,或者您可以创建一个空白并稍后使用setMessage().为了说明变量的值在您更改它之前如何保持不变,请注意,在我们创建第二个Greeting实例之后,回显第一个Greeting对象的消息仍然会给出与之前相同的值,因为它仍然没有被更改。

芜湖不芜

$greetingMSG 属性是静态的,这意味着它的内容与所有 greeting 类的实例共享。让我们通过步骤:第一步:greeting::greet();这将输出一个空字符串,对吧?因为尚未定义 $greetingMSG 值。第二步:greeting::setGreeting('Hello&nbsp;World!')->greet();在这一步中,您为 $greetingMSG 静态属性定义一个值,打印它并再次定义一个空字符串作为它的值。也就是说,输出将是“Hello, World!”。第三步:greeting::greet();最后,这将再次输出一个空字符串,因为您刚刚定义 $greetingMSG 又是一个空字符串。
打开App,查看更多内容
随时随地看视频慕课网APP