如何在PHP中应用接口和抽象

时间:2012-05-26 14:51:00

标签: php oop interface

所以我已经理解了PHP中的接口和抽象是如何工作的,我只是没有看到例如,如果它只是设置一个指南并且要求实现的对象具有某些方法,那么它就具有接口。特别是因为界面甚至没有实例化。

这也与抽象有关,我只是不能将它应用到我的代码中,并将其视为一件好事。当我试图在更大的范围内创建对象以相互交互以便找出接口时,每个类最终来回传递信息,但从未触及过界面。

所以我要问的是,如果你们有任何建议或链接到外部资源,这些资料很擅长解释这类事情。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

这是一个简单的例子。通过创建接口和抽象类,您可以确保对象可以通过公共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);

即使您未在drive()函数上指定输入参数的类型,也可以检查输入是否为instanceof和iCar

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

另一个例子是在您的应用程序中构建缓存接口。您可以指定所有缓存引擎支持相同的方法来读取/写入/使缓存中的对象无效,而无需了解(或关心)特定缓存引擎的实际实现。