vyamak / eden-core
充满神秘配方的Eden核心组件
Requires
- php: >=5.4.1
README
====
安装
composer install eden/core
====
启用Eden
以下文档使用示例中 eden()
。启用此功能需要额外步骤,如本节所述,如果使用以下方式访问此包则不需要。
Eden\Core\Control::i();
当使用composer时,没有简单的方法可以访问包中的函数。作为解决方案,在您的代码中添加此常量将允许在之后使用 eden()
。
Eden::DECORATOR;
例如
Eden::DECORATOR;
eden()->inspect('Hello World');
====
简介
Eden的一些最伟大的功能,以及开箱即用的支持网络服务,都源于其核心。核心的目的是让最终开发者在OOP和设计模式方面有更轻松的体验,同时解决当今网络开发中的一些最复杂的问题。
实例化您的PHP类
Eden提供了一种简单实例化您的类并在链式方式中使用的机制。
eden('YOUR_CLASS_NAME');
eden('YOUR\\CLASS\\NAME');
eden('YOUR\\CLASS_NAME');
您可以通过以下方式向构造函数传递参数,其中 123, array('foo' => 'bar'), 'abc'
是您想要传递到您的 __construct
的内容。
eden('YOUR\\CLASS\\NAME', 123, array('foo' => 'bar'), 'abc');
可选实例化模式可以表达如下。
eden()->Your_Class_Name(123, array('foo' => 'bar'), 'abc'));
注意 _
自动被替换为 \\
。这也适用于未使用命名空间的类,但上述模式在实例化包含 _
和 \\
的同一类名时不起作用。
扩展您的PHP类
如果您想利用Eden的核心功能,可以按以下方式操作。
class Foo extends \Eden\Core\Base {}
这样做将允许您以以下方式在类中访问 when
和 loop
等功能。
class Foo extends \Eden\Core\Base
{
protected $zoo = 4;
public function bar()
{
$this
->loop(function($i) {
if($i === 5) {
return false;
}
$this->zoo += $i;
})
->when($this->zoo > 10, function() {
echo $this->zoo;
});
}
}
Eden使用PHP 5.4中可用的特殊模式,允许在循环和回调中访问类属性和方法。
NOTE: You cannot access private methods or properties inside of a callback method
您还可以按以下方式在类中实例化其他类,而不是使用 eden()
函数。
class Foo extends \Eden\Core\Base
{
public function bar()
{
$this('bar');
}
}
====
API
更高级的示例可以在 test
文件夹中找到。建议您也查看该文件夹。
添加方法
向现有的实例添加一个虚拟方法。
用法
eden()->addMethod(string $name, callable $callback);
示例
eden()->addMethod('output', function($string) {
echo $string;
return $this;
});
eden()->inspect('Hello World');
参数
string $name
- 必需 - 方法的名称。
callable $callback
- 必需 - 方法定义。如果传递了数组可调用,则该方法的范围将定义为可调用数组。否则,将使用当前实例的作用域。
调用数组
用于调用当前方法的垂直版本的可链式版本的 call_user_func_array()。
用法
eden()->callArray(string $method[, array $args]);
示例
eden('core_event')->callArray('inspect', array('observers'));
参数
string $method
- 必需 - 方法的名称。
array $args
- 可选 - 将水平传递到指定方法的参数数组。
检查
用于调试目的,这将输出指定的原始值。
用法
eden()->inspect([mixed $property = $this]);
示例
eden('core_event')->inspect('observers');
参数
mixed $property
- 可选 - 如果提供字符串并且确实是您的类中属性的名字,则将输出原始值。如果没有提供值,此方法将输出当前类中的所有属性。
加载状态
与 eden()->saveState()
一起使用时,此方法将重新调用先前保存的实例以进行进一步处理。
用法
eden()->loadState(string $name);
示例
eden()->loadState('foobar');
参数
string $name
- 必需 - 保存状态的名称。
循环
一个可链式的 for 语句。使用此方法可能有无限循环,因此请谨慎测试。
用法
eden()->loop(callable $callback, int $incrementor = 0);
示例
eden()->loop(
function($i) {
if($i < 4) {
return;
}
return false;
}, 2);
参数
callable $callback
- 必需 - 循环回调。
int $incrementor
- 可选 - 默认值 0 - 作为可选的附加功能,每次调用上面的回调函数后,它会自动增加 1。
关闭
与 eden()->on()
和 eden()->trigger()
一起使用,此功能用于移除特定事件的监听器。事件是在全局范围内存储的。
用法
eden()->off([string $event, callable $handler]);
示例
eden()->off('complete');
参数
string $event
- 可选 - 如果提供了字符串,将移除所有与该字符串匹配的事件。如果没有提供事件,将移除所有事件处理器。
callable $handler
- 可选 - 添加此参数将移除指定事件中特定的事件处理器。
开启
与 eden()->off()
和 eden()->trigger()
一起使用,此功能添加了特定事件的监听器。事件是在全局范围内存储的。
用法
eden()->on(string $event, callable $handler);
示例
eden()->on('complete', function($string, $number) {
echo $string . ' ' . $number;
});
参数
string $event
- 必需 - 事件的名称。只要它是一个有效的字符串,您可以使用任何名称。
callable $handler
- 必需 - 如果触发事件,将被调用的处理器。
保存状态
与 eden()->loadState()
一起使用,此方法将保存当前实例,以便稍后再次调用。
用法
eden()->saveState(string $name);
示例
eden()->saveState('foobar');
参数
string $name
- 必需 - 保存的状态的名称。只要它是一个有效的字符串,您可以使用任何名称。
触发
与 eden()->off()
和 eden()->on()
一起使用,此功能触发事件,并传递提供的任何参数。
用法
eden()->trigger(string $event[, mixed $arg..]);
示例
eden()->trigger('complete', 'Foo', 123);
参数
string $event
- 必需 - 事件的名称。只要它是一个有效的字符串,您可以使用任何名称。
mixed $arg
- 可选 - 您希望传递给所有监听指定事件的处理器的任何参数。
当...
一个链式 if/else 语句。
用法
eden()->when(bool|callable $condition, callable $success[, callable $fail]);
示例
eden()->when(
function() {
return true;
},
function() {
//this is called if true
},
function() {
//this is called if false
});
参数
bool|callable $condition
- 必需 - 条件测试
callable $success
- 必需 - 如果条件测试评估为真,将调用此函数。
callable $fail
- 可选 - 如果条件测试不评估为真,将调用此函数。
====
这并不是一个上帝对象。
#####在简单的迭代器上需要多少操作?
通过查看给定语言的任何 Iterator API 可以轻松回答这个问题。您需要 3 个方法
- 获取当前值
- 将迭代器移动到下一个元素
- 检查迭代器是否有更多元素
这就是您需要的一切。如果您可以执行这三个操作,您就可以遍历任何元素序列。
但这并不是您通常想要对元素序列做的全部。通常,您有一个更高的目标要实现。您可能想要对每个元素执行某些操作,您可能希望根据某些条件过滤它们,或者使用其他几种方法之一。请参见 .NET LINQ 库中的 IEnumerable 接口以获取更多示例。
您看到有多少吗?这只是 IEnumerable 接口上可能放置的所有方法的子集,因为您通常将它们组合起来以实现更高的目标。
但是这里有个转折。这些方法不在 IEnumerable 接口上。它们是简单的实用方法,实际上接受 IEnumerable 作为输入并对它执行某些操作。因此,虽然在 C# 语言中,您感觉 IEnumerable 接口上有无数的方法,但 IEnumerable 并不是一个上帝对象。
jQuery 是一个上帝类吗?
让我们再次提出这个问题,这次是关于类过程。
在 DOM 元素上需要多少操作?
答案非常直接。您需要的所有方法都是读取/修改属性和子元素的方法。这就是全部。其他一切都是这些基本操作的组合。
但是,您想要用 DOM 元素做什么更高级的事情呢?嗯,就像迭代器一样:无数不同的事情。这就是 jQuery 的作用。本质上,jQuery 提供了两件事
这是一系列非常实用的方法集合,您可以在DOM元素上调用这些方法,并且;语法糖使得使用它的体验比使用标准DOM API要好得多。如果您去掉糖化形式,您会意识到jQuery可以很容易地写成一组选择/修改DOM元素的功能。例如
$("#body").html("<p>hello</p>");
...可以写成
html($("#body"), "<p>hello</p>");
从语义上看,两者完全相同。然而,第一种形式有一个很大的优点,即语句的左右顺序遵循操作执行的顺序。第二种形式从中间开始,如果将多个操作组合在一起,代码将非常难以阅读。
那么这意味着什么呢?jQuery(就像LINQ一样)不是上帝对象反模式。它实际上是一个非常受尊敬的模式,称为装饰器模式。
...
来源:(http://programmers.stackexchange.com/questions/179601/is-jquery-an-example-of-god-object-antipattern)
回归伊甸园
与jQuery类似,伊甸园遵循类似的装饰器模式。您可以使用伊甸园库中的类以常规方式,例如new Eden\Core\Event
或new Eden\Mysql\Factory
。或者这样使用eden('mysql')
====
对伊甸园的贡献遵循Github工作流程。请在贡献之前阅读。
##设置您的机器与伊甸园存储库和您的分支
- 分支存储库
- 在本地终端中启动,从您的分支的
v4
分支创建一个新的分支,分支名称描述您的更改。可能的分支名称类型- bugfix
- feature
- improvement
- 进行您的更改。始终确保在所有提交上签出(git commit -s -m "提交信息")
##制作拉取请求
- 请在制作拉取请求之前确保运行
phpunit
。 - 将您的代码推送到您的远程分支版本。
- 回到您的GitHub上的分支版本,提交一个拉取请求。
- 伊甸园开发者将审查您的代码,并在它被分类为合适时合并。