是否有必要在此类中使用静态方法和属性


Is it necessary to use static method and property in this class?

我正在用PHP学习OOP。我对使用static方法和属性感到困惑。

在此示例中,我将在服务器端使用一个小缓存示例。但我不确定是否使用静态方法和属性。

class Villa extends CI_Model
{
  // Cache
  protected $cacheOwner;
  ...   
  public function owner()
  {
   if ( ! empty($this->cacheOwner))
        return $this->cacheOwner;

我认为它会起作用,但使用"静态"更好?或者我必须仅在从父类继承属性或方法时才使用"static"?

我正在用PHP学习OOP。我对使用静态方法感到困惑 和属性。

在此示例中,我将在服务器端使用一个小缓存示例。但 我不确定是否使用静态方法和属性

那么,如何创建和使用静态方法/属性:

class Villa extends CI_Model
{
    protected static $cacheOwner = null;
    public static function owner()
    {
        if ( ! is_null(static::$cacheOwner) ) {
            return static::$cacheOwner;
        }
    }
}

将其用作

Villa::owner();

我认为它会起作用,但使用"静态"更好?或者我必须使用 仅当从父类继承属性或方法时才是"静态"?

不,这根本不对,因为静态被认为是harmfulanti-pattern.在术语object oriented programming中,Objects封装状态并提供转换此状态的方法,但是当您使用static属性和方法时,它违反了原则,因为它(静态(在所有实例化对象上保留相同的状态,因此它是一个class oriented programming,而不是OOP。在OOP类只是蓝图/数据类型,对象是发挥作用的东西。此外,静态方法/类由于硬依赖关系而不利于单元测试,并且难以扩展。在某些情况下,如单例设计模式,静态类方法/属性可能很有用,但它(单例(本身被认为是一个糟糕的设计模式并且不OOP。检查 SOLID 和(另请参阅(部分中提供的其他链接。

因此,尽量避免static最后,除了您之外,没有人可以告诉您类中实际需要什么,因为您知道要做什么以及您的类与应用程序的关系,如果您需要在应用程序的生命周期中一直保持属性/数据的相同状态,那么您可以使用它但不确定。另外,查看此搜索结果并阅读一些好的答案,您会从这里学到很多东西,至少我做了很多,我发现这篇文章带有一些示例,也可能有所帮助。

通常,如果该方法不使用该方法包含在其中的给定类的实例化对象的本地变量,则将使用静态方法。