gpt4 book ai didi

PHP:如何重用代码(oop)?

转载 作者:可可西里 更新时间:2023-11-01 00:37:53 24 4
gpt4 key购买 nike

我学过php oop,深谙可重用代码的概念。

我见过这样的例子

interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
And implement it:

// Implement the interface
class Template implements iTemplate
{
private $vars = array();

public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}

public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return $template;
}
}

我可以理解代码,但不确定为什么它可以重用。每次我想在 iTemplate 界面中添加一个新功能时,我的模板类也需要更改。我不明白“重用”的概念。我感谢任何帮助。谢谢。

最佳答案

接口(interface)不直接用于代码重用。它们是为了抽象。它们使使用模板的类能够检查接口(interface)而不是基模板类。这样它将实现与接口(interface)声明分开。

因此,如果您的方法对 template 类执行某些操作,检查实例 template 的对象将硬编码对该类的依赖。但实际上你并不关心你得到的是什么类,你只关心它是否遵循 iTemplate 接口(interface)(因为无论如何你都在调用它)。

public function foo(Template $template) {

对比:

public function foo(iTemplate $template) {

现在,就代码重用而言,接口(interface)并不是真正为此而设计的。继承通常是。基本上将继承视为扩展抽象。让我举个例子:

如果您要为鸟类创建一组类,您可以使用继承来处理它,也可以不使用它。让我们看看如果没有:

interface iBird {
public function fly();
public function speak();
public function swim();
public function walk();
}

class Duck implements iBird {
public function fly() {
//Fly here
}
public function speak() {
// Quack here
}
public function swim() {
//Swim here
}
public function walk() {
//Walk here
}
}

class Turkey implements iBird {
public function fly() {
//Fly here, but limited
}
public function speak() {
//Make turkey sound here
}
public function swim() {
throw new Exception('Turkeys can not swim!');
}
public function walk() {
//Walk here
}
}

现在,这是一个简单的示例,但您可以看到,在这两只鸟中,walk() 函数可能是相同的(因此违反了 DRY)...

让我们看看单层继承的情况:

abstract class Bird implements iBird {
public function fly() {
//Fly here
}
abstract public function speak();
public function swim() {
//Swim here
}
public function walk() {
//Walk here
}
}

class Duck extends Bird {
public function speak() {
//Quack here
}
}

class Turkey extends Bird {
public function speak() {
//Make turkey sound here
}
public function swim() {
throw new Exception('Turkeys can not swim!');
}
}

现在,您可以看到我们刚刚重新使用了其中的 3 个方法!我们没有声明 speak(),因为它总是会被覆盖(因为没有两只鸟的声音是一样的)。

听起来不错吧?好吧,根据我们的需要,我们可能想要添加其他抽象类型。假设我们正在制作很多不同类型的鸟......我们会有一些不会游泳的鸟,所以我们可以创建一个抽象类 NonSwimmingBird 来扩展 Bird,但会为我们抛出异常。或 NonFlyingBird,或 ShortRangeBird...

现在,就代码重用而言,我们确实走上正轨,但我们在另一个领域碰壁了。假设我们有一只既不会飞也不会游的鸟。我们从哪个类继承?无论哪种方式,我们都在复制代码。所以我们需要另谋出路。那么,我们该怎么做呢?通过Design Patterns ...我们可以使用装饰器模式动态添加这些特征,而不是直接继承。 (这里还有其他模式可以使用,关键是要表明仅继承并不能满足所有需求。而且模式本身也不会。您需要​​根据您的确切需求使用两个世界的良好架构) ...

重点是,这完全取决于您的需求。如果您只有 2 个“类”的对象,那么与计划拥有数千个对象相比,您将要构建一些更简单的东西。我在这里写的重点是演示如何使用直接继承来强制执行某些 DRY 原则(以及直接继承如何导致代码重复)。最重要的是,不要因为不想重复自己而试图坚持 DRY。坚持 DRY,但要确保在合理的地方进行组合和扩展,否则会给自己带来维护上的麻烦。坚持Single Responsibility Principal ,你应该没问题...

关于PHP:如何重用代码(oop)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3702248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com