php - 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();
mold()
创建类的新实例的调用Mold
。merge()
从Mold
类中使用的链。currency()
或类link()
中不存在方法Mold
。相反,它们应该从插件之一加载。
综上所述
- 我知道我可以扩展一个类,但它并不能真正解决问题,因为可以有多个插件类。
- 我知道我可以创建插件类的实例,但它们需要以某种方式被
Mold
类知道。 - 想到将方法附加到类以及合并类。
解决方案
从技术上讲,您可以使用__call()
它。您的“主”类可以包含/跟踪一组插件实例,并且可以查找和委托任何未知的方法调用(如果在插件中可用)。
我不会推荐这个。Fluent API 通常很脆弱,即使只有一个类也会带来不便。在流利的调用中涉及多个类可能很快就会造成混乱。甚至 IDE 都无法帮助您(或其他使用代码的人)解决的混乱问题,因为它不知道发生的所有魔术。
我强烈建议研究这样的 API 的替代模式。
推荐阅读
- r - 将字符中的最后一个逗号替换为“&”
- python - CHECK 约束解决方法中禁止的 SQLAlchemy 子查询
- python-3.x - 如何使用函数式编程方法实现 Google Cloud Function?
- c# - 使用 REST API 的设计模式
- r - 自动将 R-Code 与解决方案脚本进行比较
- java - 替换其他声明但不存在其他声明?
- javascript - 使用 Angular 在具有多个数组的 td 中显示特定数据
- python-3.x - 使用谷歌分析 api 检查有多少会话低于 10 秒?
- xml - XML:格式不正确(无效令牌)
- scala - 火花数据框旋转正在抛出 AssertionError: assertion failed: unsafe symbol Unstable