0

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

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

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

  ...   

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

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

4

2 回答 2

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();

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

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

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

于 2013-10-07T16:47:13.143 回答
0

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

于 2013-10-07T17:08:31.423 回答