为了账号安全,请及时绑定邮箱和手机立即绑定

PHP静态类自动重置

PHP静态类自动重置

PHP
有只小跳蛙 2022-07-29 15:14:28
我正在写一个我打算只静态调用的类,我注意到了一些我没想到的东西。考虑以下代码。<?phpclass 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()我可以通过添加一个方法使该类模仿我所期望的。<?phpclass 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()方法是模仿我所期望的最佳方法吗?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

我知道这一定是因为对类的每次调用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!

Finished

Goodbye World!

对此有几点需要注意:

  1. 通过这种方式,您可以拥有多个带有不同消息的问候语实例。

  2. 我们可以从我的代码中推断出Greeting该类有一个构造函数,它允许您在创建实例时设置消息,或者您可以创建一个空白并稍后使用setMessage().

  3. 为了说明变量的值在您更改它之前如何保持不变,请注意,在我们创建第二个Greeting实例之后,回显第一个Greeting对象的消息仍然会给出与之前相同的值,因为它仍然没有被更改。


查看完整回答
反对 回复 2022-07-29
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

$greetingMSG 属性是静态的,这意味着它的内容与所有 greeting 类的实例共享。让我们通过步骤:

第一步:

greeting::greet();

这将输出一个空字符串,对吧?因为尚未定义 $greetingMSG 值。

第二步:

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

在这一步中,您为 $greetingMSG 静态属性定义一个值,打印它并再次定义一个空字符串作为它的值。也就是说,输出将是“Hello, World!”。

第三步:

greeting::greet();

最后,这将再次输出一个空字符串,因为您刚刚定义 $greetingMSG 又是一个空字符串。


查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信