首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP链接类方法与其他类合并

PHP链接类方法与其他类合并
EN

Stack Overflow用户
提问于 2019-02-21 15:54:20
回答 3查看 60关注 0票数 0

我从一个例子开始。

模具类

代码语言:javascript
复制
<?php
class Mold {
  public $current;

  function merge($first, $second) {
    $this->current = $first . $second;
    return $this;
  }

  function phone() {
    $this->current = '<a href="tel:' . $this->current . '">' . $this->current . '</a>';
    return $this;
  }

  function __toString() {
    return $this->current;
  }
}

function mold() {
  return new Mold();
}

In action

这如预期的那样起作用。

代码语言:javascript
复制
echo mold()->merge('sada', 'asdsa')->phone();

问题

我有一个或多个类的方法,希望也可用。

插件类

代码语言:javascript
复制
class MyPlugin {
  function link() {
    // Code
  }

  function currency($number) {
    // Code
  }
}
代码语言:javascript
复制
class MyPlugin2 {
  // Other methods
}

梦码

下面事件的确切变化可能没有任何意义。无论如何,我打算做的是以下几点。

代码语言:javascript
复制
echo mold()->merge('sada', 'asdsa')->currency(45)-link();
  • 调用mold(),它创建Mold类的一个新实例。
  • 链式merge(),它从Mold类中使用。
  • currency()link()方法不存在于Mold类中。相反,它们应该从其中一个插件中加载。

结论:

  • 我知道我可以扩展一个类,但是它并不能真正解决这个问题,因为可以有多个插件类。
  • 我知道我可以创建插件类的实例,但是它们需要通过Mold类来了解。
  • 除了合并类之外,还可以将方法附加到类中。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-22 15:25:26

有趣的想法。

解决问题的方法就像我脑子里想的那样,就是使用特征,就像@vivek_23在一条评论中建议的那样。

这里是它如何工作的一个完整的例子,

代码语言:javascript
复制
<?php
// Core methods
class MoldCore {
  public $current;

  function merge($first, $second) {
    $this->current = $first . $second;
    return $this;
  }

  function phone() {
    $this->current = '<a href="tel:' . $this->current . '">' . $this->current . '</a>';
    return $this;
  }

  function __toString() {
    return $this->current;
  }
}

// Plugin 1
trait Plugin1 {
  public function yaay() {
    $this->current .= ' Plugin1 yaay';
    return $this;
  }
}

// Plugin 2
trait Plugin2 {
  public function hello() {
    $this->current = str_replace('Plugin1', 'Modified', $this->current);
    return $this;
  }

  public function world() {
    $this->current .= ' Plugin2 world';
    return $this;
  }
}

// Glue plugins with MoldCore
class Mold extends MoldCore {
  use Plugin1, Plugin2;
}

$mold = new Mold();
echo $mold->merge('sada', 'asdsa')->phone()->yaay()->hello();
票数 -1
EN

Stack Overflow用户

发布于 2019-02-21 16:07:51

从技术上讲,你可以用__call()来完成这个任务。您的“主”类可以包含/跟踪一组插件实例,如果在插件中可用,则可以查找和委派任何未知的方法调用。

不过我不建议你这么做。Fluent API通常很脆弱,即使使用一个类也会变得不方便。在流利的调用中包含多个类可能很快就会导致混乱。甚至IDE也帮不了你(或者其他处理代码的人)的麻烦,因为它不知道发生了什么事情。

我强烈建议研究这种API的替代模式。

票数 1
EN

Stack Overflow用户

发布于 2019-02-21 16:07:39

您可以尝试应用的一个概念是组合重于继承

解决方案可以是组合当前的Mold对象并传递两个插件实例,以便在其方法上使用它们,如下所示:

代码语言:javascript
复制
<?php
class Mold {
  public $current;

  public function __construct(Plugin1 $plugin1, Plugin2 $plugin2) {
      $this->plugin1 = $plugin1;
      $this->plugin2 = $plugin2;
  }

  public function merge($first, $second) {
    $this->current = $first . $second;
    return $this;
  }

  public function phone() {
    $this->current = '<a href="tel:' . $this->current . '">' . $this->current . '</a>';
    return $this;
  }

  public function __toString() {
    return $this->current;
  }

  public function link() {
      $this->plugin1->link();
      return $this;
  }
}

function mold() {
  return new Mold(new Plugin1(), new Plugin2());
}

另一种解决方案可以是创建某种类型的MoldHandler类,它将Mold对象与其他插件一起作为属性,这些插件可以直接在其中使用。

代码语言:javascript
复制
public class MoldHanlder {

    protected $mold;
    protected $plugin1;
    protected $plugin2;

    public function __contruct($mold, $plugin1, $plugin2) {
        $this->mold    = $mold;
        $this->plugin1 = $plugin1;
        $this->plugin2 = $plugin2;
    }

    public function merge() {
        $this->mold = $this->mold->merge();
        return $this;
    }

    public function link() {
        $foo = $this->plugin1->method();

        return $this;
    }

    ...
}

您也可以在construct中实例化类,但是如果您计划编写单元测试,则依赖项注入是方法。

我认为第一种方法要好得多,因为您避免重新编写Mold类的一些代码,这是不必要的。

注:这是一个非常原始的解决方案,只是为了让你更好地理解我会选择欢呼的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54811164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档