接口是主要作用是约束类的方法,接口指定需要统一的方法,然后使用不同的类去实现这个接口,类必须包含接口中指定的方法,否则这个类就会报错。
<?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);