1

したがって、PHPでインターフェイスと抽象化がどのように機能するかを理解しました。たとえば、ガイドを設定し、実装されたオブジェクトに特定のメソッドを持たせる必要がある場合、インターフェイスを持つことのポイントがわかりません。特に、インターフェイスがインスタンス化されていないためです。

これは抽象化にも当てはまります。私はそれを自分のコードに適用して、それを素晴らしいものと見なすことができません。インターフェースを理解するために相互に作用する大規模なオブジェクトを作成しようとすると、各クラスは情報をやり取りすることになりますが、インターフェースに触れることはありません。

そこで私が求めているのは、この種のことをうまく説明できるアドバイスや外部情報源へのリンクがあれば教えてください。

4

2 に答える 2

0

これが1つの簡単な例です。インターフェイスと抽象クラスを作成すると、オブジェクトが共通のAPIに確実に準拠するようになります。以下の例を参照してください。

interface iCar
{
    function drive();
}

abstract class Car implements iCar
{
    public $make = 'Generic';

    public function drive()
    {
        printf("I'm driving in my %s%s", $this->make, PHP_EOL);
    }
}

class FordTruck extends Car
{
    public $make = "Ford";
}

class Porsche extends Car
{
    public $make = 'Porsche';
    public function drive()
    {
        printf("I'm speeding around in my %s%s", $this->make, PHP_EOL);
    }
}

class Yugo extends Car
{
    public $make = 'Yugo';

    public function drive()
    {
        printf("I'm pushing my %s around town%s", $this->make, PHP_EOL);
    }
}

function drive(iCar $car)
{
    $car->drive();
}

$car1 = new FordTruck;
$car2 = new Porsche;
$car3 = new Yugo;


drive($car1);
drive($car2);
drive($car3);

関数で入力パラメーターのタイプを指定しなくても、入力がiCardrive()であるかどうかを確認できます。instanceof

function drive($car)
{
    if ($car instanceof iCar)
        $car->drive();
}

もう1つの例は、アプリケーションにキャッシュインターフェイスを構築することです。特定のキャッシュエンジンの実際の実装について知らなくても(または気にせずに)、すべてのキャッシュエンジンがキャッシュ内のオブジェクトの読み取り/書き込み/無効化に同じメソッドをサポートするように指定できます。

于 2012-05-26T16:32:36.063 に答える
0

できるだけ簡単な例を挙げましょう。

Facebook/Twitter でサイトにログインできる機能が必要だとします。

# here's your interface/abstract class
interface Auth_Adapter {
    public function auth();
}

# now your Facebook
class Auth_Adapter_Facebook implements Auth_Adapter {
    public function login() {
        # include facebook-sdk and auth
    }
}

# Twitter
class Auth_Adapter_Twitter implements Auth_Adapter {
    public function login() {
        # include twitter-oauth and auth
    }
}

誰かがFacebook/Twitterのことを使おうとすると想像してみてください。彼らは単に電話をかけることができます

$adapter = new Auth_Adapter_Facebook; 
$adapter->login();

$adapter = new Auth_Adapter_Twitter; 
$adapter->login();

ご覧のとおり、両方のアダプターが同じloginインターフェースを使用しています。将来、「Pinterest」ログインを含める必要がある場合はどうなりますか? 同じインターフェイスを実装している限り、コードは機能します。

編集:その他の説明

使わなきゃいけない理由はここにあるinterface or abstract

# I use `type-hinting` here. So I can ensure that only object that implements `Auth_Adapter` will allow. Without this implementation someone might pass some other object that doesn't have `login` method in. But in our case we don't have to worry about that.
public function perform_login(Auth_Adapter $adapter) {

    $adapter->login();
}
于 2012-05-26T16:27:14.387 に答える