定义PHP类时的好习惯

时间:2015-02-23 22:32:53

标签: 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 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...
}

让一个班级做一切或者我应该编写更模块化的代码是一种好习惯吗?

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

3 个答案:

答案 0 :(得分:1)

狗不支付牛奶,也不支付(通常)工作,因此这些功能不应该属于Dog类。这些功能会出现在像Person这样的类中,它可能通过两类之间的关系拥有一只或多只狗,即:

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

答案 1 :(得分:1)

我认为你的班级只需要一些专门的案例:

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
    }
}

当然,如果有可能让智能/训练有素的狗工作,那么我会在特征中实现这些方法。

答案 2 :(得分:0)

根据我的理解,你在询问是否在课堂上使用大量功能是一种不好的方法。在我看来,这取决于。在开发面向对象的应用程序时,我总是想到我可以用于该类的所有可能的函数/方法。

还有更多。例如,有飞行的鸟类和其他没有飞行的鸟类,因此我的面向对象的方法如下:

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 = new Penguin(false);
if($class->canFly() == false)
{
   print("Bird can't Flye");
}

那里有很多例子。点击here获取非常好的教程。