定义PHP类时的良好实践

定义PHP类时的良好实践,php,oop,Php,Oop,我见过一些PHP类定义,其中包含许多看起来与实际类无关(或至多松散相关)的方法。例如: class Dog { public $var; public function __construct() {} public function eat() { // Code here is relevant to dog. } public function sleep() { // Code here is relevant

我见过一些PHP类定义,其中包含许多看起来与实际类无关(或至多松散相关)的方法。例如:

class Dog {
    public $var;

    public function __construct() {}

    public function eat() {
        // Code here is relevant to dog.
    }

    public function sleep() {
        // Code here is relevant to dog.
    }

    public function play() {
        // Code here is relevant to dog.
    }

    public function pay_milkman() {
        // The code here isn't really related to the life of a dog but is useful in the rest of the project.
    }

    public function go_to_work() {
        // The code here isn't really related to the life of a dog but is useful in the rest of the project.
    }

    etc...
}
让一个类做所有事情是一种好的做法,还是应该编写更模块化的代码


如果您能在您可能提供的任何答案中解释原因,我将不胜感激。

狗不给挤奶工付钱,也不(通常)工作,因此这些功能不应该在狗类中。这些功能将属于类似于
Person
的类,通过这两个类之间的关系,Person可能拥有一只或多只狗,即:

class Person {
  public $dogs;
  public function buy_dog() {
    $dog = new Dog;
    $this->dogs[] = $dog;
  }
}

据我所知,你问在一个类中使用大量函数是否是一种糟糕的方法。依我看,这要看情况而定。在开发面向对象的应用程序时,我总是想到所有可能用于该类的函数/方法

还有更多。例如,有些鸟会飞,有些鸟不会,所以我的面向对象方法如下

class Bird
{
   public $canfly;

   public function __construct($canfly)
   {
       $this->canfly = $canfly;
   }

   public function canFly()
   {
       return $this->canfly;
   }
}
企鹅是一种鸟,但不会飞

class Penguin extends Bird
{
   public function canFly()
   {
      // return parent::canFly(); <- Original Property from parent.
      return false; // Override
   }
}

有很多例子。单击此处可获得非常好的教程。

我认为您的课程只需要一些专业案例:

class Dog {
    public $var;

    public function __construct() {}

    public function eat() {
        // Code here is relevant to dog.
    }

    public function sleep() {
        // Code here is relevant to dog.
    }

    public function play() {
        // Code here is relevant to dog.
    }
}

class ExtremelySmartAndWellTrainedDog extends Dog {
    public function pay_milkman() {
        // Code here is relevant to a well-trained dog
    }
}

class SheepDog extends Dog {
    public function go_to_work() {
        // Code here is what sheepdogs do
    }
}

当然,如果有可能养一只既聪明又训练有素的狗,那么我会在traits中实现这些方法。

编写更多的模块化代码。原因太多,无法在这里给出明确的答案。就这么做吧。你的问题很糟糕,请阅读OOP,因为正如我们所看到的,你不理解它。在这种情况下,您的示例代码完全没有意义。@kmlnvm我的示例不是我应该怎么做的。正如我在问题中提到的,我一直看到巨大的单片类定义,这让我质疑我自己的模块化方法。因此,我为什么要问这个问题。@kmlnvm:当你批评问题时,多说一些你认为离题的原因,少用一些可能被解释为粗鲁的语言,这会很有帮助(为避免疑问,“你的问题很糟糕”,“你的例子毫无意义”可能被合理地解释为敌意)。如果OP似乎不明白什么,那肯定是问问题的目的吗?(这个问题对这里来说可能太宽泛了,但我想我不会投票结束,因为这是edge案例)。是的,很抱歉整个月都在用Java编程,现在将对它进行编辑。而且,
Penguin
似乎没有覆盖任何内容。我想您可能会重写
canFly
并返回
false
,也许吧?这个示例只是为了演示继承同一类型的类如何继承其父属性等。我将再次编辑我的问题以使其更易于理解。当然,我只是添加了另一个想法
:-)
。谢谢这个示例。我认为在
ExtremelySmartAndWellTrainedDog
SheepDog
的情况下,扩展类是有意义的。你是对的,代码与牧羊犬(以及训练有素的狗)的行为有关。但也许我可以举一个真实情况的例子。在WordPress插件目录中,有许多插件包含的方法,如
load\u textdomain()
enqueue\u styles()
都在同一个类定义中。这些方法与类没有直接关系,而且(在我看来)最好编码为独立函数。我认为这取决于主观观点,即什么属于什么,@henrywright。我对WP只稍微熟悉一点,但由于插件需要呈现样式,我可以理解为什么
enqueue_styles()
可能与插件类相关。作为插件样式类会更好吗?可能,我真的看不见。我当然大体上同意你的观点——不相关的东西不应该出现在同一堂课上。谢谢@halfer,我感谢你花时间讨论这些问题,这很有帮助!
class Dog {
    public $var;

    public function __construct() {}

    public function eat() {
        // Code here is relevant to dog.
    }

    public function sleep() {
        // Code here is relevant to dog.
    }

    public function play() {
        // Code here is relevant to dog.
    }
}

class ExtremelySmartAndWellTrainedDog extends Dog {
    public function pay_milkman() {
        // Code here is relevant to a well-trained dog
    }
}

class SheepDog extends Dog {
    public function go_to_work() {
        // Code here is what sheepdogs do
    }
}