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,我明白了。不,如果你想重置属性,你必须自己重置它们,不管它是静态的还是非静态的