首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP静态类自动复位

问PHP静态类自动复位
EN

Stack Overflow用户
提问于 2020-01-23 16:25:06
回答 2查看 251关注 0票数 1

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

代码语言:javascript
复制
<?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()方法使类模仿我所期望的。

代码语言:javascript
复制
<?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();

?>

这就像我期待的那样,“你好,世界!”只输出一次。对于这里发生了什么,是否有更多的技术解释,reset()方法是否是模仿我所期望的最好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-23 17:02:21

我理解这是因为对类greeting的每次调用都不是创建类的新实例。

我想你对一些基本面有一个基本的误解。

这与$greetingMSG是否是静态无关。一旦设置了类成员变量,它的值将保持不变,直到您更改它。所有后续的回显变量调用都会一直回显您在前一次设置的值。不管它是静态的还是非静态的,它的行为都是一样的。

是的,您可以有一个重置方法,如果您愿意的话,可以清除这个值,而且您实际上只是在做与setGreeting('');相同的工作。

无论如何,我不知道这个类充满静态方法的目的首先是什么,或者为什么您会有一个私有的重置方法。在我看来,这不是一门精心设计的课程。

为什么不只是一个没有静态方法的普通类呢?这样会更灵活,更有意义。下面是一组用法的示例:

代码语言:javascript
复制
$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();

这张印刷品,按照这个顺序:

代码语言:javascript
复制
Hello World!
Goodbye World!
Goodbye World!
Finished
Goodbye World!

关于这一点,需要注意的是:

setMessage().

  • To

  • 您可以使用不同的消息来创建多个问候语实例。

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

  • 来设置该消息。请注意,在我们创建了第二个Greeting实例之后,重复第一个Greeting对象的消息仍然给出了它之前的相同值,因为它仍然没有被更改。
票数 1
EN

Stack Overflow用户

发布于 2020-01-23 17:45:48

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

第一步:

代码语言:javascript
复制
greeting::greet();

这将输出一个空字符串,对吗?$greetingMSG值的Beucase还没有定义。

第二步:

代码语言:javascript
复制
greeting::setGreeting('Hello World!')->greet();

在此步骤中,您将为$greetingMSG静态属性定义一个值,然后打印它,并再次将一个空字符串定义为它的值。也就是说,输出结果将是“你好,世界!”。

第三步:

代码语言:javascript
复制
greeting::greet();

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59883034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档