PHP静态类自动重置
我正在写一个我只打算静态调用的类,我注意到了一些我没有预料到的东西。考虑下面的代码。PHP静态类自动重置,php,class,static,Php,Class,Static,我正在写一个我只打算静态调用的类,我注意到了一些我没有预料到的东西。考虑下面的代码。 <?php class Greeting { public static $greetingMSG; public static function setGreeting(string $greeting){ self::$greetingMSG = $greeting; return new static; } public static function greet
<?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();
?>
这就像我期待的一样,“Hello World!”只输出一次。关于这里发生的事情,是否有更技术性的解释,reset()
方法是否是模仿我期望的最好方法
我理解这一定是因为每次调用类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!
关于这一点,需要注意以下几点:
通过这种方式,您可以使用不同的消息创建多个问候语实例
我们可以从我的代码中推断,Greeting
类有一个构造函数,它允许您在创建实例时设置消息,或者您可以创建一个空的实例,稍后使用setMessage()
设置消息
为了说明我的观点,即变量的值在修改之前如何保持不变,请注意,在创建第二个Greeting
实例后,回显第一个Greeting
对象的消息仍然会给出与之前相同的值,因为它仍然没有被更改
我理解这一定是因为每次调用类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!
关于这一点,需要注意以下几点:
通过这种方式,您可以使用不同的消息创建多个问候语实例
我们可以从我的代码中推断,Greeting
类有一个构造函数,它允许您在创建实例时设置消息,或者您可以创建一个空的实例,稍后使用setMessage()
设置消息
为了说明我的观点,即变量的值在修改之前如何保持不变,请注意,在创建第二个Greeting
实例后,回显第一个Greeting
对象的消息仍然会给出与之前相同的值,因为它仍然没有被更改
$greetingMSG属性是静态的,这意味着它的内容与greeting类的所有实例共享。让我们完成以下步骤:
第一步:
greeting::greet();
这将输出一个空字符串,对吗?b因为$greetingMSG值尚未定义
第二步:
greeting::setGreeting('Hello World!')->greet();
在这一步中,您将为$greetingMSG静态属性定义一个值,打印它,然后再次定义一个空字符串作为其值。也就是说,输出将是“你好,世界!”
第三步:
greeting::greet();
最后,这将再次输出空字符串,因为您刚刚定义$greetingMSG再次是空字符串。$greetingMSG属性是静态的,这意味着它的内容与greeting类的所有实例共享。让我们完成以下步骤:
第一步:
greeting::greet();
这将输出一个空字符串,对吗?b因为$greetingMSG值尚未定义
第二步:
greeting::setGreeting('Hello World!')->greet();
在这一步中,您将为$greetingMSG静态属性定义一个值,打印它,然后再次定义一个空字符串作为其值。也就是说,输出将是“你好,世界!”
第三步:
greeting::greet();
最后,这将再次输出一个空字符串,因为您刚刚定义$greetingMSG再次是一个空字符串。我可能缺少一些基本知识,但这个示例greetings类并没有真正传达我想要实现的内容。实际上,我正在尝试构建一个静态数据访问类,这样我就可以查询数据,比如$qResult=data::table('something')->select('column1')->where('column2','=','somevalue')代码>。后来,当我试图运行一个没有Where子句的查询时,出现了困惑,因为我将Where子句存储在一个静态属性中,所以仍然使用前面的Where子句进行过滤。我的印象是,每次我使用数据时,它的属性都会被重置。@MatthewGoheen,我明白了。不,如果你想重置属性,你必须自己重置它们,不管它是静态的还是非静态的