Php 在这个类中是否需要使用静态方法和属性?

Php 在这个类中是否需要使用静态方法和属性?,php,codeigniter,oop,Php,Codeigniter,Oop,我正在学习PHP中的OOP。我对使用static方法和属性感到困惑 在这个示例中,我将在服务器端使用一个小的缓存示例。但我不确定是否使用静态方法和属性 class Villa extends CI_Model { // Cache protected $cacheOwner; ... public function owner() { if ( ! empty($this->cacheOwner)) return $this->ca

我正在学习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();
我认为它会起作用,但使用“静态”更好吗?或者我必须使用 仅当从父类继承属性或方法时才“静态”

不,这根本不对,因为静态模式被认为是有害的和反模式的。在术语
面向对象编程
中,其中
对象
封装状态并提供转换此状态的方法,但当您使用
静态
属性和方法时,它违反了原则,因为它是(静态的)在所有实例化对象上保持相同的状态,因此它是一种面向类的编程,而不是面向对象的编程。在
OOP
中,类只是蓝图/数据类型,而对象则是需要发挥作用的东西。此外,静态方法/类也不利于单元测试,因为它们具有很强的依赖性,而且很难扩展。在某些情况下,例如singleton,静态类方法/属性可能很有用,但它(singleton)本身被认为是一种糟糕的设计模式,并且不符合
OOP
。检查(另请参见)部分中提供的链接和其他链接


所以,尽量避免静态的,最后,除了你,没有人能告诉你你在课堂上真正需要什么,因为你知道你要做什么,你的类与你的应用程序有什么关系,如果你需要在应用程序的生命周期中一直保持相同的属性/数据状态,那么你可以使用它,但不能确定。另外,检查并阅读一些好的答案,你会从这里学到很多东西,至少我做了很多,我发现一些例子也会有帮助。

一般来说,如果静态方法未使用该方法所包含的给定类的实例化对象的局部变量,则将使用静态方法。

此问题似乎与主题无关,因为答案似乎主要基于观点。您是否了解静态和非静态属性和方法之间的区别?
I我认为它可以工作,但是使用“static”更好吗?
那么为什么更好呢?我正在尝试了解何时必须使用静态方法和属性您希望每个
Villa
row都有一个
cacheOwner
(假设这个类是ORM row类)?如果是这样,那么您不希望它是静态的。