eden / core
Eden Core组件,充满神秘配方
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的核心包含一些最出色的功能,以及开箱即用的支持网络服务。核心的目的是让最终开发者在面向对象编程和设计模式方面获得更简单的体验,同时解决当今网络开发中存在的许多复杂问题。
实例化您的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
- 必需 - 方法定义。如果传递了数组可调用对象,则该方法的范围将如可调用数组中定义。否则,将使用当前实例的范围。
调用数组
调用_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
- 必需 - 保存的状态的名称。
循环
一个可链式的语句。使用此方法可能会产生无限循环,因此请谨慎测试。
用法
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
- 必须的 - 如果条件测试评估为 true,将调用此函数。
callable $fail
- 可选 - 如果条件测试评估为 false,将调用此函数。
====
这并不是一个上帝对象
#####你需要在简单的迭代器上执行多少操作?
这个问题可以通过查看任何给定语言的 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上的您的分支版本,提交一个拉取请求。
- 一位伊甸园开发者将审查您的代码,并在它被认为合适时将其合并。