ホームページ >バックエンド開発 >PHPチュートリアル >配列インターフェイスで楽しい

配列インターフェイスで楽しい

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-22 10:46:09324ブラウズ

Fun with Array Interfaces

キーポイント

  • PHPの配列インターフェイスにより、プログラマーはPythonの方法と同様に、カスタムクラスのネイティブデータ型の特性をシミュレートできます。これにより、カスタムクラスは配列のように動作し、要素のカウント、要素のループ、インデックスを介した要素へのアクセスなどの一般的な配列操作を可能にします。
  • インターフェイスは、クラスの契約に似ており、クラスが含める必要がある方法を指定します。実装の詳細のカプセル化を可能にし、構文砂糖を提供するため、コードの読みやすさと保守性が向上します。 PHPは、これらのインターフェイスを実装してアレイに似たオブジェクトを作成できる事前定義されたインターフェイスのライブラリを提供します。
  • Countable、およびArrayAccessインターフェイスのIteratorPHPのインターフェイスにより、オブジェクトはcount()メソッド、マップのようなアクセス、およびセットをそれぞれ繰り返すことができます。これらのインターフェイスを使用して、ツイートの数をカウントしたり、それらをループしたり、IDを介してツイートにアクセスできるTwitterタイムラインクラスなど、より動的でインタラクティブなオブジェクトを作成できます。

毎日さまざまなプログラミング言語を使用しているプログラマーとして、私は他の言語で異なることを学び、PHPで同じ機能を実装しようとすることを本当に楽しんでいます。私は特に、Pythonの機能がカスタムクラスでネイティブデータ型をシミュレートする方法が好きです。

たとえば、このメンバーリストのクラス:

<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}</code>
__iter__メンバーシップテストのみを実装する必要がありますメソッド:
<code class="language-php">class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}</code>

__contains__カスタムクラスのインスタンス(アレイだけでなく)でPHPで次のことをすることができれば素晴らしいと思います:

<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一个成员!\n";
}</code>

PHPを使用すると、配列インターフェイスを使用してこれを達成できます。

インターフェイスの簡単な説明
<code class="language-php">isset($myObject["test"]);</code>

インターフェイスを、指定されたクラスがメソッドを含める契約として扱います。

このインターフェイスを使用するクラスには、この

メソッドが必要です。クラスがこの契約を満たしていることを示すキーワードがあります:

<code class="language-php">interface Multiplier {
    public function multiply($num1, $num2);
}</code>

multiply契約が満たされている限り、実装方法は無関係です。 implementsメソッドを実装する別の方法は次のとおりです。

<code class="language-php">class SmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        return $num1 * $num2;
    }
}</code>
SPLおよびPHPインターフェイス

multiplyPHPは、クラスにこれらのインターフェイスを実装することにより、オブジェクトを配列と同様にすることができる、事前定義されたインターフェイスのライブラリを提供します。

<code class="language-php">class NotSoSmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        $product = $num1;
        for ($i = 1; $i < $num2; $i++) {
            $product += $num1;
        }
        return $product;
    }
}</code>
これらのインターフェイスの一部は、事前定義されたインターフェイスとクラスリストに含まれており、一部は標準のPHPライブラリ(SPL)に含まれています。

これらの用語が威圧的に聞こえる場合は、心配しないでください。あなたは以前に

を使用したことがあります。

は、

事前定義された

と呼ばれる言語構造です。

一方、ドキュメントによれば、$_GET splは$_GETです 一般的な問題を解決するために設計されたインターフェイスとクラスのコレクション。

今やらなければならないのは、これらのインターフェイスの実際の適用を確認することです。掘り下げましょう!

Twitterタイムラインクラス

を作成します
<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}</code>

は、ツイートの数を計算できることがあります

<code class="language-php">class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}</code>

それらをループする、

<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一个成员!\n";
}</code>

そして、ツイートIDを介してツイートを取得します

<code class="language-php">isset($myObject["test"]);</code>

通常の配列にいるように!

ただし、最初にいくつかの問題を解決する必要があります。まだTwitterアカウントをお持ちでない場合は、最初に作成してください。今すぐ開発者アカウントを登録し、アクセストークンとキーを生成します。

次に、githubからコードをダウンロードまたはクローンして、ソースフォルダーで

を実行します。作曲家に慣れていない場合は、SitePointの以前の記事をご覧ください。 composer installファイルを開き、必要なOAuthデータを追加します。 index.php

インターフェイスCountable

インターフェイスはおそらく最も自明です。 Countableメソッドを実装するだけで、オブジェクトをcountメソッドに渡すことができます。 count()

「/users/show」でget requestを実行することで、ユーザーのツイートの数を取得できます。

<code class="language-php">interface Multiplier {
    public function multiply($num1, $num2);
}</code>

インターフェイスArrayAccess

より興味深いインターフェイスを学習することで、難易度を高めます。

実装後、

はオブジェクトにマップのようにアクセスできるようにします。これはまさにその本質です。達成する方法は

です ArrayAccess

これは、Twitterのタイムラインオブジェクトで非常に便利です。以下に示すように、オブジェクトを
<code class="language-php">class SmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        return $num1 * $num2;
    }
}</code>
に渡すことで、タイムラインにツイートが存在するかどうかをテストできます。

これを行うには、ツイートIDにGETリクエストを実行するだけです。 isset

さらに良いことに、上記を
<code class="language-php">class NotSoSmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        $product = $num1;
        for ($i = 1; $i < $num2; $i++) {
            $product += $num1;
        }
        return $product;
    }
}</code>
に使用し、

順番に呼び出すこともできます。

<code class="language-php">$tweets = new Timeline("jeunito");</code>

を使用して、ツイートIDで削除することもできますが、実装するためにこれを残します。 offsetGet offsetExists残念ながら、offsetGetを達成することはあまり意味がありません。このようなものについては、簡単なソリューションは、

などのカスタム例外をスローすることです。しかし、一方で、アプリケーションの特定のビジネスルールにも依存する場合があります。

offsetUnset

インターフェイス

offsetSetお気に入りのインターフェイスを最後に保存しました!ここでは、UnsupportedOperationExceptionインターフェイスは非常に便利です。なぜなら、通常の配列を繰り返すようなタイムラインオブジェクトを反復するよりも、リモートコレクションのページネーションの詳細をカプセル化するより良い方法はないと思うからです。

最初に、次の方法を実装する必要があります Iterator

以下に示すように、上記の方法を明示的に使用してタイムラインをループすることができます。

Iteratorしかし、なぜこれを行うのか、できれば:

この例では、時系列の順序でツイートブロックを取得し、バッファーに保存することにより、タイムラインのツイートをループします。このバッファーがなくなるまでこのバッファーを反復し、最後のツイートのIDをオフセットとして使用して、ツイートの別のバッチを取得します。

最初はツイートがありませんでした。そこからrewindメソッドがあります。最新の10のツイートを取得して、次の10のツイートを取得できるオフセットを開始します。

<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}</code>

valid()メソッドは、ループが継続するかどうかを示すためにのみ使用されます。これは、ツイートバッファが空であるかどうかを確認することで実行できます。

<code class="language-php">class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}</code>

およびkey()メソッドは、イテレーションの現在のツイートのキーと値を単純に返すだけです。私たちの目的のために、バッファーから最新のツイートのツイートIDとテキストを取得するだけです。 current()

<code class="language-php">class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一个成员!\n";
}</code>
最後に

メソッド。ここでは、バッファーの頭からデキューして、次の要素を繰り返して繰り返します。次に、バッファの最後の要素にいる場合は、次のツイートセットを取得するようにします。 next

<code class="language-php">isset($myObject["test"]);</code>
完了です!これは、ユーザーのツイートを介したループの非常に基本的な実装です。 API呼び出しを保存するためのローカルキャッシュなど、できることは他にもありますが、それはインターフェイスを使用することの美しさです。バックグラウンドでポリシーを変更することができ、実装がまだ正しい限り、私たちは期待できます。それでも機能します。

しかし、今では、コマンドラインで

を実行することで、タイムラインオブジェクトがどのように機能するかを観察できます。 php index.php

結論

インターフェイスの利点は2つあります。実装の詳細をカプセル化し、構文砂糖を提供することができます。どちらも相互運用性を必要とするあらゆるアプリケーションで非常に役立ちます。ご質問やコメントがある場合は、以下のコメントセクションに残してください!

以上が配列インターフェイスで楽しいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。