vyamak/eden-core

充满神秘配方的Eden核心组件

4.0.4 2018-03-24 05:48 UTC

This package is not auto-updated.

Last update: 2024-09-23 06:51:55 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

====

安装

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 {}

这样做将允许您以以下方式在类中访问 whenloop 等功能。

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 - 可选 - 如果条件测试不评估为真,将调用此函数。

====

这并不是一个上帝对象。

God Object

#####在简单的迭代器上需要多少操作?

通过查看给定语言的任何 Iterator API 可以轻松回答这个问题。您需要 3 个方法

  1. 获取当前值
  2. 将迭代器移动到下一个元素
  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\Eventnew Eden\Mysql\Factory。或者这样使用eden('mysql')

====

#为伊甸园做贡献

伊甸园的贡献遵循Github工作流程。请在贡献之前阅读。

##设置您的机器与伊甸园存储库和您的分支

  1. 分支存储库
  2. 在本地终端中启动,从您的分支的v4分支创建一个新的分支,分支名称描述您的更改。可能的分支名称类型
    • bugfix
    • feature
    • improvement
  3. 进行您的更改。始终确保在所有提交上签出(git commit -s -m "提交信息")

##制作拉取请求

  1. 请在制作拉取请求之前确保运行phpunit
  2. 将您的代码推送到您的远程分支版本。
  3. 回到您的GitHub上的分支版本,提交一个拉取请求。
  4. 伊甸园开发者将审查您的代码,并在它被分类为合适时合并。