タイプヒントは、メソッドの呼び出し方法をユーザーに通知する方法です。また、メソッドを実装するものとして、渡されるパラメーターの特定の機能に依存することもできます。
タイプヒントのないショッピングカートの例を次に示します。
<?php
class Cart {
protected $items = array();
public function addItem($item) {
$this->items[] = $item;
}
}
$cart = new Cart();
$cart->addItem('My Super Cool Toy');
上記を実行した後に持っているのは、「MySuperCoolToy」という1つのアイテム$cart
のインスタンスです。Cart
ただし、Cart
オブジェクトはそのアイテムが何であるかを認識していません。それはそれがそれとどのように相互作用することができるか、またはそれで何ができるかを知りません。たとえば、上記のカートの小計を取得するにはどうすればよいですか?私はできません。
タイプヒントの例を次に示します。
<?php
class Cart {
protected $items = array();
public function addItem(Item $item) {
$this->items[] = $item;
}
public function getSubTotal() {
$total = 0;
foreach ($this->items as $item) {
$total += $item->getPrice();
}
return $total;
}
}
class Item {
protected $name;
protected $price;
public function __construct($name, $price) {
$this->name = $name;
$this->price = $price;
}
public function getName() {
return $this->name;
}
public function getPrice() {
return $this->price;
}
}
$cart = new Cart();
$cart->addItem(new Item('My Super Cool Toy', 10.99));
今、私はまったく別の状況にいます。私は自分Cart
がsでいっぱいであることを知っていItem
ます。私は私ができることを知っていgetPrice()
ますItem
。私のメソッドを呼び出すことができる唯一の方法は私にオブジェクトaddItem
を与えることであるため、私はそこにあることを信頼できます。Item
タイプヒントなしで同じことができますか?はい。ただし、特定の実装に依存できる良い方法はありません。発信者として、私はあなたにItemオブジェクトを与えるかもしれません。しかし、私はあなたに文字列や数字を与えるかもしれません。そして、あなたが持っているのが文字列または数字だけである場合、どのようにして私に確実に価格を与えることができるでしょうか?
それでは少し良くしましょう
そして、すぐにインターフェースへのコーディングに入ります。ラジコンカーや人形など、おもちゃの種類が必要だとしましょう。おそらく、私たちは彼らとは違ったやり方で遊んでいます。この場合、1つの「アイテム」オブジェクトは異なることを実行できるため、機能しません。しかし、どちらも同じタイプの動作を示します。どちらもおもちゃです。それでは、そのためのインターフェースを作成しましょう。
<?php
interface Toy {
public function play();
}
そして、おもちゃの具体的なクラスをいくつか作成しましょう。
<?php
class RemoteControlledCar implements Toy {
public function play() {
print "I'm driving a car";
}
}
class Doll implements Toy {
public function play() {
print "GI Joe";
}
}
次に、おもちゃをおもちゃ箱に保管します。
<?php
class ToyBin {
protected $toys = array();
public function addToy(Toy $toy) {
$this->toys[] = $toy;
}
public function playWithMyToys() {
foreach ($this->toys as $toy) {
$toy->play();
}
}
}
そしてそれを見てください、あなたは正しくプログラムされました。あなたはおもちゃのオブジェクトでいっぱいのおもちゃのビンを持っていることを知っています。あなたは彼らがどんな種類のおもちゃであるかを気にする必要はありませんし、あなたが彼らとどのように相互作用するかを気にする必要もありません。あなたは彼らと(この場合は彼らと)特定のことができることを知っているだけですplay
。そのため、信頼できるインターフェースがあります。
なぜこれが優れているのですか?
いくつかの理由から、インターフェースは実際にプログラミングを行う方法です。
- インターフェイスの作成者による労力はほとんど必要ありません。インターフェイスに機能は必要ありません。これは、他の人が実装するための「契約」として機能するだけです。
- それらはあなたが利用可能な特定の機能に頼ることを可能にします。私の例では、あなたはそれをあなたのものにするどんな「おもちゃ」でも使うことが
ToyBin
できることを知っていますplay()
。そして、あなたはどのように心配する必要はありません。
- コードの品質を犠牲にすることなく、実装に柔軟性を持たせることができます。あなたはどんな方法でも遊ぶことができるどんな種類のおもちゃでもプログラムすることができます。
うまくいけば、それは物事を片付けるのに役立ちます。