0

私は最初のクラスであるショッピングカートクラスを作成しました。それは素晴らしく、私が必要とするすべてのことを行います。しかし、しかし、常にあります...

タイプヒントについてたくさん読んだので、shoppingcartクラスにヒント変数のみを渡すようにアドバイスされました。

$cart = new cart(item $id);

私はこれを行う理由を理解していますが、アイテムクラスが何をすべきか、そしてそれを実装することを選択した場合にどのメソッドを使用するかについて混乱しています。

現在、私のサイトではMVCに着想を得た構造を使用して、メソッド/ビューとコントローラーを分離しています。私のビューには、オブジェクトを作成し、additemメソッド(または他の関連するメソッド)を呼び出すコントローラーにアイテムIDを送信する投稿フォームが含まれています。

私がサイトを実装した方法は、アイテムクラスの恩恵を受けていると思いますか?

4

2 に答える 2

7

タイプヒントは、メソッドの呼び出し方法をユーザーに通知する方法です。また、メソッドを実装するものとして、渡されるパラメーターの特定の機能に依存することもできます。

タイプヒントのないショッピングカートの例を次に示します。

<?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。そのため、信頼できるインターフェースがあります。

なぜこれが優れているのですか? いくつかの理由から、インターフェースは実際にプログラミングを行う方法です。

  1. インターフェイスの作成者による労力はほとんど必要ありません。インターフェイスに機能は必要ありません。これは、他の人が実装するための「契約」として機能するだけです。
  2. それらはあなたが利用可能な特定の機能に頼ることを可能にします。私の例では、あなたはそれをあなたのものにするどんな「おもちゃ」でも使うことがToyBinできることを知っていますplay()。そして、あなたはどのように心配する必要はありません。
  3. コードの品質を犠牲にすることなく、実装に柔軟性を持たせることができます。あなたはどんな方法でも遊ぶことができるどんな種類のおもちゃでもプログラムすることができます。

うまくいけば、それは物事を片付けるのに役立ちます。

于 2013-03-06T19:55:57.450 に答える
0

MVCの原則を最大限に実行すると、クラスとしてモデル化されたアイテムが表示されることが期待されます。これが単なるサブクラス化されたデータベースレコードであっても、将来の拡張のための簡単なプラットフォームを提供します。addItem()ただし、必然的にカートクラスのコンストラクターではなく、メソッドでクラス「item」のこのタイプヒント変数が表示されることを期待します。カートには1つのアイテムしかないという意味ですか?

デザインパターンの観点からは、とにかくアイテムのクラスを持つことは理にかなっています。現在、これらの要件はないかもしれませんが、後の段階で、アイテムクラスにメソッドを追加して次のことを行うことができます。

  • 関連商品を入手
  • 画像を取得する
  • アイテムを評価する

等々。

PHPオブジェクト指向を使用する場合は、可能であれば(パラメーターが確実に固定型である必要がある場合)、型ヒントを使用することをお勧めします。また、整数のような単純な型の場合は、メソッドで最初に行うこととして、常にその型をチェックするか、その型にキャストする価値があります。そうすればより安全になり、時間の経過とともにエラーを検査することで、コードベースに存在する可能性のあるバグについて多くのことを学ぶことができます。

于 2013-03-06T19:56:15.847 に答える