ホームページ >バックエンド開発 >PHPチュートリアル >配列インターフェイスで楽しい
Countable
、およびArrayAccess
インターフェイスのIterator
PHPのインターフェイスにより、オブジェクトは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インターフェイス
multiply
PHPは、クラスにこれらのインターフェイスを実装することにより、オブジェクトを配列と同様にすることができる、事前定義されたインターフェイスのライブラリを提供します。
<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
インターフェイスはおそらく最も自明です。
「/users/show」でget requestを実行することで、ユーザーのツイートの数を取得できます。Countable
メソッドを実装するだけで、オブジェクトをcount
メソッドに渡すことができます。count()
<code class="language-php">interface Multiplier { public function multiply($num1, $num2); }</code>インターフェイス
より興味深いインターフェイスを学習することで、難易度を高めます。ArrayAccess
実装後、
はオブジェクトにマップのようにアクセスできるようにします。これはまさにその本質です。達成する方法はです
これは、Twitterのタイムラインオブジェクトで非常に便利です。以下に示すように、オブジェクトをArrayAccess
<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 サイトの他の関連記事を参照してください。