ホームページ > バックエンド開発 > PHPチュートリアル > PHPのトランスデューサーは簡単になりました

PHPのトランスデューサーは簡単になりました

Christopher Nolan
リリース: 2025-02-15 11:36:11
オリジナル
920 人が閲覧しました

詳細なPHP機能プログラミング:トランスデューサーの探索

機能的なプログラミングと高度な機能について聞いたことがあるかもしれませんが、トランスデューサーを知っていますか?この記事では、この強力なデータ変換ツールを調査します。

Transducers in PHP Made Easy

コアポイント:

    Clojureに由来し、Michael DowlingによってPHPに移植されたトランスデューサーは、再利用可能なアルゴリズム変換を構築する強力な方法です。これらは、1つの削減関数を受け入れ、別の削減関数を返す関数です。
  • PHPのトランスデューサーパッケージを使用すると、名前のイニシャルを大文字にしたり、ユーザーリストから未成年者を削除したりするなど、さまざまな方法でデータを変換できます。変換は、再利用のために単一のトランスデューサーに結合することができます。
  • トランスデューサーの還元関数は、値をパラメーターとして受信し、「init」(init)、 "result"(最終結果)、および「ステップ」(縮小)ロジックを含む3つの要素を含む還元関数の配列を返します。
  • トランスデューサーの利点は、データ変換プロセスを実際のデータソースから分離し、コードをよりモジュールで維持しやすくすることです。これらは、任意のデータソースで使用できる再利用可能なソフトウェアコンポーネントの作成を可能にします。ただし、機能的なプログラミングのルートにより、従来のPHP関数よりも複雑な場合があります。
トランスデューサーの定義

トランスデューサーを理解するには、最初に還元剤を理解する必要があります。リッチなヒッキーを引用:

削減関数は、

- これまでに結果を受信し、新しい入力を受け取り、次の結果を返す機能のタイプです。 reduce

トランスデューサーは、1つの減少関数を受信し、別の削減関数を返す関数です。

トランスデューサーは、最初にリッチヒッキーによってClojureに紹介され、Michael DowlingによってPHPに移植されました。トランスデューサーは、さまざまな状況で再利用できるアルゴリズム変換を構築する強力な方法です。この記事では、一連の実用的な例を通じてその使用について説明します。

先に進む前に、コンポーザーを介してトランスデューサーパッケージをインストールする必要があります。

composer require mtdowling/transducers
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次の例では、シンプルなユーザークラスを使用します。

class User
{
    public $id;
    public $name;
    public $age;

    public function __construct($id, $name, $age)
    {
        $this->id = $id;
        $this->name = $name;
        $this->age = $age;
    }

    public function __toString()
    {
        return sprintf("\n%d - %s - %d", $this->id, $this->name, $this->age);
    }
}

// 示例数据
$data = [
    new User(1, "younes", 24),
    new User(2, "youssef", 26),
    new User(3, "hamza", 25),
    new User(4, "ismail", 17),
];
ログイン後にコピー
ログイン後にコピー
use Transducers as t;

$uppercase = t\map(function($user) { 
    return new User($user->id, ucfirst($user->name), $user->age); 
});

$result = t\xform($data, $uppercase);

var_dump($result);
ログイン後にコピー
ログイン後にコピー

関数は、PHPのmap関数に似ています。この場合、ユーザー名の初期を大文字にする呼び出し可能な関数を渡します。 array_map

関数を使用して、xformトランスデューサーを適用します。データを最初のパラメーターとして、トランスデューサーを2番目のパラメーターとして使用します。 uppercase

// 输出
array(4) {
  [0]=>
  object(User)#14 (3) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "Younes"
    ["age"]=>
    int(24)
  }
  [1]=>
  object(User)#15 (3) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(7) "Youssef"
    ["age"]=>
    int(26)
  }
  [2]=>
  object(User)#16 (3) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(5) "Hamza"
    ["age"]=>
    int(25)
  }
  [3]=>
  object(User)#17 (3) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(6) "Ismail"
    ["age"]=>
    int(17)
  }
}
ログイン後にコピー
ログイン後にコピー

データパラメーターと同じタイプの値を返します(この場合、配列)。アレイを厳密に出力する必要がある場合は、xformを使用することもできます。 to_array

// ...
$result = t\to_array($data, $uppercase);
// ...
ログイン後にコピー
ログイン後にコピー

を使用して出力を文字列に変換するか、to_stringを使用して出力を特定のタイプに変換することもできます。詳細については、ドキュメントをご覧ください。 into($target, $coll, callable $xf)

composer require mtdowling/transducers
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
class User
{
    public $id;
    public $name;
    public $age;

    public function __construct($id, $name, $age)
    {
        $this->id = $id;
        $this->name = $name;
        $this->age = $age;
    }

    public function __toString()
    {
        return sprintf("\n%d - %s - %d", $this->id, $this->name, $this->age);
    }
}

// 示例数据
$data = [
    new User(1, "younes", 24),
    new User(2, "youssef", 26),
    new User(3, "hamza", 25),
    new User(4, "ismail", 17),
];
ログイン後にコピー
ログイン後にコピー

トランスデューサーの最良の部分は、複数の変換を1つのトランスデューサーに結合できることです。たとえば、ユーザー名の最初の文字を大文字にして、マイナーを削除しましょう。

use Transducers as t;

$uppercase = t\map(function($user) { 
    return new User($user->id, ucfirst($user->name), $user->age); 
});

$result = t\xform($data, $uppercase);

var_dump($result);
ログイン後にコピー
ログイン後にコピー

filter関数は、phpのarray_filter関数に似ています。 comp関数は、トランスデューサーリスト(この場合はuppercaseを使用して)およびmapremoveMinorsを使用)からトランスデューサーを作成します。 filter

// 输出
array(4) {
  [0]=>
  object(User)#14 (3) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "Younes"
    ["age"]=>
    int(24)
  }
  [1]=>
  object(User)#15 (3) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(7) "Youssef"
    ["age"]=>
    int(26)
  }
  [2]=>
  object(User)#16 (3) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(5) "Hamza"
    ["age"]=>
    int(25)
  }
  [3]=>
  object(User)#17 (3) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(6) "Ismail"
    ["age"]=>
    int(17)
  }
}
ログイン後にコピー
ログイン後にコピー
この標準に基づいてデータを削減するためにいつでも使用できる再利用可能なトランスデューサーの組み合わせがあります。利用可能な削減関数のリストについては、ドキュメントを確認してください。

transducer

を作成します

削減関数はパラメーターとして値を受信し、3つの要素を含む必要がある一連の削減関数を返します。

    :トランスデューサーの初期値を返す関数。初期値が提供されていない場合、最初の呼び出しでのみ呼び出されます。
  • init
  • 関数は、コールスタックから最終結果を構築するために使用されます。 result result
  • :これは、削減ロジックを書く場所です。削減ロジックに応じてゼロまたは複数回呼び出すことができます。
  • step
  • これは実際のコードなしでは非常に混乱しているので、例として
トランスデューサー機能を取り上げましょう。データ配列の上部からnアイテムを取得します。

take

// ...
$result = t\to_array($data, $uppercase);
// ...
ログイン後にコピー
ログイン後にコピー
以下は、
use Transducers as t;

$uppercase = t\map(function($user) { 
    return new User($user->id, ucfirst($user->name), $user->age); 
});

$result = t\to_string($data, $uppercase);

var_dump($result);
ログイン後にコピー
削減関数のソースコードです。

take

// 输出
string(64) "
1 - Younes - 24
2 - Youssef - 26
3 - Hamza - 25
4 - Ismail - 17"
ログイン後にコピー
関数は、パラメーターと

およびtakeパラメーターを使用して複数回呼び出されます。呼び出されるたびに、result変数を減少させ、ゼロ未満であるかどうかをテストします。この場合、ストップポイントを表すAinputオブジェクトインスタンスを返します。 remaining Reducedトランスデューサー関数の例は、データから空の要素を削除します。 Transducerの仕組みの以前の説明を使用して、変数にアクセスして、次の

コールバックを呼び出すか、単に値を返すかどうかを決定できます。 $input step

これをテストすることができます
$uppercase = t\map(function($user) { 
    return new User($user->id, ucfirst($user->name), $user->age); 
});
$removeMinors = t\filter(function($user) { 
    return $user->age >= 18;
});

$comp = t\comp(
    $uppercase,
    $removeMinors
);

$result = t\to_string($data, $comp);

var_dump($result);
ログイン後にコピー
変数に空のアイテムを追加することができます。

$data

// 输出
string(48) "
1 - Younes - 24
2 - Youssef - 26
3 - Hamza - 25"
ログイン後にコピー
結論
// ....
$comp = t\comp(
    $uppercase,
    $removeMinors,
    t\take(2)
);

$result = t\to_string($data, $comp);

var_dump($result);
ログイン後にコピー
この記事では、トランスデューサーと呼ばれる機能プログラミングの世界の新しい側面を理解しています。データ変換が簡単であっても、トランスデューサーの目的を確認します。また、トランスデューサーの価値をよりよく実証するために、いくつかの例をレビューしました。開発者のツールボックスに新しいツールがあるか、少なくともトランスデューサーの概念をよりよく理解できるようになりました。

トランスデューサーについて質問がある場合は、以下に投稿できます。

php

のトランスデューサーに関する

FAQ

PHPのトランスデューサーの基本概念は何ですか?

PHPのトランスデューサーは、構成可能で再利用可能なソフトウェアコンポーネントを作成できるデータ処理テクノロジーです。それらは本質的に、還元剤を受け入れ、新しい還元剤を返す関数です。この概念は、ClojureとJavaScriptから借用されており、PHPに適応しています。トランスデューサーを使用すると、データ変換プロセスを実際のデータソースから分離し、コードをよりモジュール化し、維持しやすくします。

トランスデューサーは従来のPHP関数とどのように違いますか?

従来のPHP関数は、通常、データを取得および変換するプロセスを組み合わせて、維持と再利用が困難になる可能性があります。一方、トランスデューサーは2つのプロセスを分離します。つまり、特定の方法でデータを変換するトランスデューサーを作成し、任意のデータソースで使用して、コードをより柔軟で再利用可能にすることができます。

PHPでトランスデューサーの例を提供できますか?

もちろん、簡単な例を考えてみましょう。数字の配列があり、各番号に1を追加するとします。これを行うトランスデューサーを作成できます:

composer require mtdowling/transducers
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このトランスデューサーを任意の削減関数とデータソースで使用できます。

さまざまなデータソースでトランスデューサーを使用する方法は?

トランスデューサーは、任意のデータソースとともに使用するように設計されています。これは、データソースレベル全体ではなく、単一のデータアイテムレベルで実行されるためです。したがって、アレイ、データベースクエリの結果、ネットワーク接続からのデータストリームなどのトランスデューサーを使用できます。唯一の要件は、データソースが減少関数で動作できる必要があることです。

PHPでトランスデューサーを使用することの利点は何ですか?

トランスデューサーは多くの利点を提供します。データ変換プロセスを実際のデータソースから分離することができ、コードがよりモジュール式でメンテナンスを容易にすることができます。また、任意のデータソースで使用できる再利用可能なソフトウェアコンポーネントを作成することもできます。最後に、トランスデューサーは単一のデータ項目で動作するため、大規模なデータセットを扱うときに、従来のPHP関数よりも効率的になる場合があります。

PHPでトランスデューサーを使用することの欠点は何ですか?

トランスデューサーは多くの利点を提供しますが、従来のPHP関数よりも複雑な場合もあります。これは、一部のPHP開発者に馴染みのない機能的プログラミングの概念を伴うためです。しかし、トランスデューサーがどのように機能するかを理解すると、それらはクリーンで効率的で再利用可能なコードを書くための強力なツールになります。

トランスデューサーはPHPフレームワークで使用できますか?

はい、トランスデューサーは任意のPHPフレームワークで使用できます。これらは、特定のフレームワーク機能に依存しない一般的なデータ処理テクノロジーです。ただし、一部のフレームワークでは、トランスデューサーを処理するための独自のユーティリティを提供する場合があります。これにより、使いやすくなります。

PHPのトランスデューサーの詳細についてはどうすればよいですか?

PHPでトランスデューサーを学習するために利用可能な多くのリソースがあります。 SitePointの記事など、オンラインの記事やチュートリアルを読むことから始めることができます。また、トピックをより深くカバーする本やオンラインコースもあります。最後に、独自のトランスデューサーを書いて、PHPプロジェクトでそれらを使用してみてください。

トランスデューサーは他のプログラミング言語で使用されていますか?

はい、トランスデューサーの概念はClojureプログラミング言語に由来し、その後JavaScriptやPHPなど、他のいくつかの言語で採用されています。各言語は独自の方法でトランスデューサーを実装しますが、基本概念は同じです。

PHP内蔵配列関数を備えたトランスデューサーを使用できますか?

はい、PHPの内蔵配列関数を備えたトランスデューサーを使用できます。ただし、これらの機能は、特に大きな配列を扱う場合、トランスデューサーを使用するほど効率的ではない場合があることを忘れないでください。これは、通常、PHPの配列関数が新しい配列を作成し、トランスデューサーがデータを配置できるためです。

以上がPHPのトランスデューサーは簡単になりましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート