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

时间:2013-10-07 12:57:38

标签: php codeigniter oop

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

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

class Villa extends CI_Model
{
  // Cache
  protected $cacheOwner;

  ...   

  public function owner()
  {
   if ( ! empty($this->cacheOwner))
        return $this->cacheOwner;

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

2 个答案:

答案 0 :(得分:1)

  

我正在用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();
  

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

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

所以,尽量避免使用static,最后,没有人可以告诉你课程中你真正需要的是什么,因为你知道你将要做什么以及你的课程与你的申请有什么关系?你需要保持属性/数据的相同状态一直到你的应用程序的生命周期然后你可以使用但不确定。另外,检查this search result并阅读一些好的答案,你会从这里学到很多东西,至少我做了很多,我发现this article有一些例子,也可以提供帮助。

答案 1 :(得分:0)

通常,如果方法不使用包含方法的给定类的实例化对象的局部变量,则将使用静态方法。