khalyomede/piper-php

终结难以阅读的PHP代码。

0.0.5 2017-07-09 12:27 UTC

This package is auto-updated.

Last update: 2024-09-29 05:07:14 UTC


README

终结难以阅读的PHP代码。

use Khalyomede\Piper;
use You\PiperArrayFilterNumber as ArrayFilterNumber;
use Her\PiperArrayAverage as ArrayAverage;

Piper::set([12, 8, 'apple', 19, 16, 'kiwi', 'banana'])
  ->pipe( ArrayFilterNumber::do() )
  ->pipe( ArrayAverage::do() )
  ->pipe( 'intval' )
  ->pipe( 'addOne' ) // your previously created function
  ->pipe( function() { return Piper::input() + 3; } )
  ->echo();

// 17

特性

  • 级联输入输出管道逻辑
  • 输出或获取最终结果的可能性
  • 使用自定义函数或Piper社区类拥有巨大的可能性
  • 递归管道调用

为什么我应该使用Piper?

如果你想要使用一个全局类,它可以让你混合多种逻辑,从本地函数到自定义类,从自定义Piper类到PHP函数,并且你渴望构建美观、可读和可重用的代码,那么Piper-PHP正是为你量身打造的。如果你喜欢Gulp.js的方式,你也会喜欢Piper-PHP的!

我可以在其他语言中移植Piper-PHP吗?

当然可以,我们甚至鼓励这样做!我们希望构建更好的开发者体验(DX),因此请随意复制并适应这个概念!分享就是关爱。

谁启动了这个项目?

我和我的兄弟aminnairi

为什么创建Piper?

我们真的爱上了Gulp.js,这是一个以简化前端流程而闻名的任务自动化工具,如压缩、处理文件等。我们希望能够找到一个用于PHP的管道使用的仓库,但并没有找到符合我们需求的东西!所以我们想为你打造它:)

如何在不使用Composer的情况下安装它?

不用担心,Piper-PHP为你解决了这个问题。只需复制文件/src/piper.php的内容,删除namespace Khalyomede;,然后将此文件包含在你的项目中。你就可以开始了!

如何使用Composer安装它?

在你的项目文件夹中运行以下命令

$ composer require khalyomede/piper-php && composer update

示例

所有示例都将假设你具有以下目录结构

/
index.php
vendor/
composer.json
composer.lock

示例1:使用Piper PHP社区类

此示例包含一些假设的类以说明此示例

从另一位朋友那里下载Piper类(假设类)。在你的项目文件夹中执行以下命令

composer require someone/piper-array-average && composer update
require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;
use Someone\PiperArrayAverage as ArrayAverage;

Piper::set([5, 17, 12, 14, 9])
  ->pipe( ArrayAverage::do() )
  ->echo();

这将打印

11.4

示例2:使用自定义函数

require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;

function uppercase( $input ) {
  return strtoupper( $input );
}

Piper::set('text')
  ->pipe('uppercase')
  ->echo();

这将打印

TEXT

示例3:混合自定义函数、PHP函数和Piper社区类

此示例包含一些假设的类以说明此示例

从另一位朋友那里下载Piper类(假设类)。在你的项目文件夹中执行以下命令

composer require someone/piper-array-average && composer update

现在让我们开始吧

require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;
use Someone\PiperArrayAverage as ArrayAverage;

function convertInt( $input ) {
  return (int) $input;
}

Piper::set([5, 17, 12, 14, 9])
  ->pipe( ArrayAverage::do() )
  ->pipe( 'convertInt' )
  ->pipe( function() { return Piper::input() + 5; } )
  ->echo();

这将打印

16

示例4:没有初始set方法

require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;

Piper::pipe( function() { return 'test' } )
  ->pipe('strtoupper')
  ->echo();

这将打印

TEST

示例5:使用get而不是echo

require __DIR__ . '/vendor/autoload.php';

$uppercase = Piper::set('test')
  ->pipe( 'strtoupper' )
  ->get();

echo $uppercase;

这将打印

TEST

示例6:在管道外使用Piper::input()

require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;

function addOne() {
  return Piper::input() + 1; // Possible via static property (works like a Javascript's Promise)
}

Piper::set(2)
  ->pipe('addOne')
  ->echo();

这将打印

3

示例7:在管道逻辑中插入“工具”

require __DIR__ . '/vendor/autoload.php';

use Khalyomede\Piper;

Piper::set('TEST')
  ->pipe('strtolower') // all lowercase
  ->echo()
  ->pipe('ucfirst') // only first character uppercase
  ->echo()
  ->eol()
  ->echo()
  ->print_r();

这将打印

testTest
Test
Test

可用的Piper方法

  • mixed Piper::input():返回最后一个Piper::pipe()Piper::set()的输入。换句话说,获取你的Piper链中的最后一个项目。
  • void Piper::set( $variable ):使用变量设置输入(通过Piper::input()可用)。它可以是一个可能的任何变量。
  • void Piper::pipe( callable $function ):使用一个回调函数应用于输入(通过Piper::input()可用)。请参阅上面的示例。
  • void Piper::pipe( PiperContract $class ):使用实现了PiperContract接口的类(请参阅以下“构建我的Piper类”)。
  • void Piper::pipe( callable $string ):使用PHP函数或你之前创建的函数来调用输入(通过Piper::input()可用)。
  • void Piper::echo():输出最后一个输入(通过Piper::input()可用)。
  • mixed Piper::get() : 返回最后一个输入(通过 Piper::input() 获取)。
  • mixed Piper::$input : 获取表示输入的公共静态属性。

构建我的 Piper 类

按照以下步骤使用您的新鲜的 Piper Comunity 类并帮助人们做得更好。

Piper Comunity 类指南

我们将为您提供一些技巧,以制作最干净的 Piper Comunity 类。

1 在包名前使用 Piper

如果您处理数组平均值,而不是 me/array-average,请使用 me/piper-array-average。这将提高您的 SEO 并帮助社区了解哪些 Composer 包处理 Piper。

2. 在包名末尾添加 "-php"

您可能希望明确表示此 GitHub 包(以及很快的 Packagist 库)仅适用于 PHP 开发人员,因此您可能希望编写 me/piper-array-average-php 以清楚地设定此项目的目标。

3. 使用短横线命名法(kebab case)为包名

与其将包命名为 me/piperArrayAveragePHP,不如使用 me/piper-array-average-php 以提高可读性。

4. 使用大写和驼峰命名法(camel case)为类名和文件名

好的类名以大写字母开头,没有短横线。好的类名示例包括

class PiperArrayAverage {}

5. 使用驼峰命名法为类文件

如果我们假设您将类放在 src/ 文件夹中,请使用 src/piperArrayAverage.php 而不是 src/piperarrayaverage.php。这将提高可读性。

6. 在包描述中精确说明您正在处理 PHP

让用户知道,因为此描述可能从 Google 搜索结果中可见。

7. 使用 PHP 预先需求 >= 5.3.0

设置您的 composer.json require 属性至少为 5.3.0,因为类将使用命名空间。例如,您的 composer.json 可能如下所示

{
  "name": "me/piper-array-average",
  "description": "Piper Comunity class that returns the average of numeric values in an array.",
  "type": "library",
  "license": "MIT",
  "minimum-stability": "stable",
  "require": {
    "php": ">=5.3.0"
  },
  "autoload": {
    "psr-4": {
  	 "Me\\": "src/"
  	}
  }
}

8. 将示例文件命名为 getting-started.php

这将让用户立即知道他们可以依赖此文件来了解类的用法。

9. 更喜欢示例而不是长描述性方法文本

用户希望快速开始,在大多数情况下,如果描述太长或太广泛,他们将停止阅读。更倾向于简短而明确的示例,而不是简短描述性文本。

如何构建 Piper Comunity 类的逐步示例

首先,让我们创建一个文件夹,每当您需要时。让我们称它为 "piper-add"

mkdir piper-add

我们将进入这个文件夹

cd piper-add

接下来,我们将初始化 Git 仓库

git init

在初始化 Composer 之前执行 Git init 更方便,因为 Composer 将会建议我们从每次 git push 中排除 vendor 文件夹。

因此,接下来您可能想要初始化 Composer

composer init

一旦您填写了提示命令中的所有问题,Composer 将构建一个 composer.json 文件。

现在,我们将创建一个名为 src 的文件夹,它将包含 piperAdd.php 文件,您的下一个大型社区项目...

完成最后一步后,创建另一个文件夹,让我们尝试我们的代码。创建一个包含 test-pipe.php 文件的 test 文件夹。

您需要通知 Composer 这些文件存在。为此,更新文件夹根目录下的 composer.json 文件,并添加以下行

...
"require": {
	"php": ">=5.3.0"	
},
...
"autoload": {
	"psr-4": {
		"You\\": "src/"
	}
}

因此,您的最终 composer.json 文件应如下所示

{
    "name": "you/piper-add",
    "description": "Piper Comunity class that let you chain addition on your workflow.",
    "type": "library",
    "license": "MIT",
    "minimum-stability": "stable",
    "require": {
    	"php": ">=5.3.0"
    },
    "autoload": {
    	"psr-4": {
    		"You\\": "src/"
    	}
    }
}

重要 您的 minimum-stability 应设置为 stable 以使用此库。我们将努力确定对您和我们来说最佳的要求组合,但就目前而言,如果您想使用 Piper,您需要将其设置为 stable

现在,在你的项目文件夹中,再次使用命令行,并输入以下命令:

composer update

应该已经创建了一个新的文件夹:vendor。除了这个文件夹,还应该创建了一个文件:composer.lock,但不要在意(也不要更新它)。

是时候开始有趣的环节了:编写你的逻辑。前往你的文件 src/piperAdd.php,添加 PHP 开头标签 <?php,然后添加以下内容:

namespace You;

这一行将允许用户在自己的项目中导入你的类。这就是为什么自动加载器需要这一行(根据你在 composer.json 中的 autoload 属性设置的名称)。

然后添加你的类(空的)

class PiperAdd {
	
}

有一点要注意,为了正确工作,Piper 需要你实现 PiperContract 类。一个接口就像一份合同,你将它传递给我们(我和 Aminnairi,这个库的创建者)以及你。我们不会给你薪水(很遗憾),但更像是道德上的合同:你同意你即将构建的类应该包括并且必须包含两个重要的方法:public static function go( $parameter ) {}public static function execute( $input ) {}

do 方法是在我们的朋友使用你的类来管道逻辑时调用的。例如

use Khalyomede\Piper;
use You\PiperAdd as Add;

Piper::set(1)
	->pipe( Add::do(3) )
	->echo();
// echo "4"

但与你的想象相反,do 并不处理逻辑!它确实只返回你的类的一个实例。我们需要它来使 Piper 工作得更好,请相信我们;)。

所以,你将看到 Piper 社区的大多数类几乎有相同的代码

class PiperAdd {
  public static $parameter = 0;

  public static function do( $parameter ) {
    self::$parameter = $parameter;

    return new self;	
  }
}

然后,你的逻辑将位于 execute 方法中。这就是你可以发挥创意的地方

class PiperAdd {
  public static $parameter = 0;

  public static function execute( $input ) {
    return self::$parameter + $input; // The addition is here
  }

  public static function do( $parameter ) {
    self::$parameter = $parameter;

    return new self;
  }
}

就像你看到的,你需要再次相信我们,并假设 execute 方法的 $input 参数将是我们的 Piper::input(),换句话说,将是最后一个 ::set()::pipe() 的输入。这两个方法确保了管道逻辑。

当然,你可以修改这个基类,添加你喜欢的任意多的其他方法,但这两个方法应该仍然存在以确保正确工作。如果它们不存在,PiperContract 将抛出错误。

嘿,但亲爱的 PiperContract 呢?哎呀!让我们修复它

use Khalyomede\PiperContract;

class PiperAdd {
  public static $parameter = 0;

  public static function execute( $input ) {
    return self::$parameter + $input; // The addition is here
  }

  public static function do( $parameter ) {
    self::$parameter = $parameter;

    return new self;
  }
}

这样就好多了。但现在,因为你需要一个依赖,你需要通过 Packagist.org 来导入它。在你的项目文件夹中使用你的命令行,并执行以下命令:

composer require khalyomede/piper-contract-php

src/piper-add.php 文件的全貌应该如下所示

namespace You;

use Khalyomede\PiperContract;

class PiperAdd {
  public static $parameter = 0;

  public static function execute( $input ) {
    return self::$parameter + $input; // The addition is here
  }

  public static function do( $parameter ) {
    self::$parameter = $parameter;

    return new self;
  }
}

现在,是时候尝试我们的类了。为了这样做,创建一个包含以下内容的文件 test/test-pipe.php

require __DIR__ '/../vendor/autoload.php';

use Khalyomede\Piper;
use You\PiperAdd;

Piper::set(1)
  ->pipe( Add::do(2) )
  ->echo();

如果你测试这个文件,Composer 自动加载器会告诉你它不知道 Khalyomede\Piper。要修复它,你需要使用以下命令从 Packagist.org 导入它:

composer require Khalyomede\Piper --dev

注意 --dev 吗?这是因为你的开发朋友已经将 Piper 作为依赖项使用,所以你不想让你的库因无用的依赖项而变得臃肿(Piper 并不是无用的,但你知道在生产环境中使用自定义库……哦我的天哪,我刚才说了什么……请原谅我,我今天睡了3个小时)。

现在你应该准备好进行第一次测试了。让我们试试。在你的文件夹中,如果没有打开,打开一个命令行,并输入以下内容:

php test/test-pipe.php

你应该会在输出中看到

3

你看到这个结果是因为你将设置的变量(1)和你的 Pipe 社区类 Add(它将参数(2)添加到输入(1)中)进行了加法运算。

如果你看到任何问题或没有像本教程中提到的那样正确运行的内容,请填写一个 Issue,我们将尽力解决它。

恭喜!祝您玩得愉快,我们希望可以一起构建一个更优秀的PHP开发网络,让我们通过面向管道的方法变得更加高效,并避免重新编写类似的逻辑!

需要不带参数的示例吗?

查看Piper 数组平均值 社区类(PHP)并深入了解代码,了解如何快速去除参数需求。

需要带有共享属性的示例吗?

PiperPHP似乎使像在PDO逻辑中共享的变量变得复杂?并非如此!使用简单的全局变量逻辑,您可以构建强大的单连接PDO逻辑(或任何PDO以外的对象)。通过为您的全局Piper定义命名约定,这使得构建变得轻松(对于最终开发者)。查看Piper Pdo了解如何构建此类高级社区类。

还需要更多吗?

请随时提交Pull Request并让我们知道您最希望看到哪些功能。