首页 > 解决方案 > PHP 链式类方法与其他类合并

问题描述

我从一个例子开始。

模具类

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

在行动

这按预期工作。

echo mold()->merge('sada', 'asdsa')->phone();

问题

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

插件类

class MyPlugin {
  function link() {
    // Code
  }

  function currency($number) {
    // Code
  }
}
class MyPlugin2 {
  // Other methods
}

梦想密码

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

echo mold()->merge('sada', 'asdsa')->currency(45)-link();

综上所述

标签: phpmergeappendaddchain

解决方案


从技术上讲,您可以使用__call()它。您的“主”类可以包含/跟踪一组插件实例,并且可以查找和委托任何未知的方法调用(如果在插件中可用)。

我不会推荐这个。Fluent API 通常很脆弱,即使只有一个类也会带来不便。在流利的调用中涉及多个类可能很快就会造成混乱。甚至 IDE 都无法帮助您(或其他使用代码的人)解决的混乱问题,因为它不知道发生的所有魔术。

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


推荐阅读