《Modern PHP》读书笔记 之 使用接口

328 阅读1分钟

接口是主要作用是约束类的方法,接口指定需要统一的方法,然后使用不同的类去实现这个接口,类必须包含接口中指定的方法,否则这个类就会报错。

<?php
// 定义接口必须包含的方法
interface Person
{
  	// 接口指定方法的修饰符只允许定义成 `public`
    public function name();		// 姓名
    public function sex();		// 性别
}

// 'zhangsan' 这个类实现了Person接口
class zhangsan implements Person
{
    public function name()
    {
        echo '张三'.PHP_EOL;
    }

    public function sex()
    {
        echo "张三是男的".PHP_EOL;
    }
}

// 'lisi' 这个类也实现了Person接口
class lisi implements Person
{
    public function name()
    {
        echo '李四'.PHP_EOL;
    }

    public function sex()
    {
        echo '李四是女的'.PHP_EOL;
    }
		// 可以写接口中没有指定的方法,不会报错可以正常使用,但这样使用就失去了接口的初衷
    public function age(){
        echo '李四18岁'.PHP_EOL;
    }
}
	/**
 	*	使用'zhangsan'和'lisi'类,可以在不知道内容的情况下 放心调用name方法和sex方法
  * 因为这些方法都与是在接口中有规定的
	*/
$user1=new zhangsan();
$user1->name();
$user1->sex();

$user2=new lisi;
$user2->name();
$user2->sex();
$user2->age();

// 传参限制 使用对象作为参数传递的时候,可以限制必须实现了指定接口的对象才允许传入

// `wangwu` 这个类没有实现Person接口
class wangwu{
    public function name()
    {
        echo '王五'.PHP_EOL;
    }

    public function sex()
    {
        echo "王五是男的".PHP_EOL;
    }
}

// 定义一个方法
class L
{
  	// 这里规定了传入类型 必须是实现了Person的方法
    public static function factory(Person $obj){
        return $obj;
    }
}

// 在这里传入 `wangwu` 则会报错 因为 `wangwu` 没有实现Person接口
$l = L::factory(new wangwu);