我正在写一个我只打算静态调用的类,我注意到了一些我没想到的事情。请考虑以下代码。
<?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();
?>这就像我期待的那样,“你好,世界!”只输出一次。对于这里发生了什么,是否有更多的技术解释,reset()方法是否是模仿我所期望的最好的方法?
发布于 2020-01-23 17:02:21
我理解这是因为对类
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!关于这一点,需要注意的是:
setMessage().
Greeting类有一个构造函数,它允许您在创建实例时设置消息,或者您可以创建一个空白的消息,并在稍后使用
Greeting实例之后,重复第一个Greeting对象的消息仍然给出了它之前的相同值,因为它仍然没有被更改。发布于 2020-01-23 17:45:48
$greetingMSG属性是静态的,意味着它的内容与问候类的所有实例共享。让我们通过以下步骤:
第一步:
greeting::greet();这将输出一个空字符串,对吗?$greetingMSG值的Beucase还没有定义。
第二步:
greeting::setGreeting('Hello World!')->greet();在此步骤中,您将为$greetingMSG静态属性定义一个值,然后打印它,并再次将一个空字符串定义为它的值。也就是说,输出结果将是“你好,世界!”。
第三步:
greeting::greet();最后,这将再次输出一个空字符串,因为您刚刚定义了$greetingMSG是一个空字符串。
https://stackoverflow.com/questions/59883034
复制相似问题