演示代码
<?php
//建立一个trait,添加一个格式化打印的方法
trait tDemo
{
public function write()
{
//get_class_vars的作用是获取改函数名西门所有的属性
$props = get_class_vars(__CLASS__);
printf('<pre>%s</pre>', print_r($props,true));
}
public static function user()
{
return self::$name . 'user0的年龄是' . self::$age . ',邮箱是' . self::$email;
}
}
//建立一个普通类,use trait tDemo
class User1
{
use tDemo;
public static $name = '程东旭';
public static $age = 30;
public static $email = 'chengdongxu@php.cn';
public static function user()
{
return self::$name . 'user1的年龄是' . self::$age . ',邮箱是' . self::$email;
}
}
echo User1::user();
(new user1) -> write();
echo '<hr>';
//一、实例演示类的三大功能:继承、重写、扩展
//1、实例演示实现类的继承
class User2 extends user1
{
use tDemo;
public static $name = '韩伟';
public static $age = 29;
public static $email = 'hanwei@php.cn';
}
echo User2::user();
(new User2) -> write();
echo '<hr>';
//2、实例演示实现类的重写
class User3 extends user1
{
use tDemo;
public static $name = '马飞';
public static $age = 32;
public static $email = 'mafei@php.cn';
public static function user()
{
return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email;
}
}
echo User3::user();
(new User3) -> write();
echo '<hr>';
//演示子类中方法级别大于trait,trait的级别大于父类
class User0 extends user1
{
use tDemo;
public static function user()
{
return self::$name . 'user3的年龄是' . self::$age . ',邮箱是' . self::$email;
}
}
echo User0::user();
(new User0) -> write();
echo '<hr>';
//3、实例演示实现类的扩展
class User4 extends user1
{
public static $phone = 'apple';
public static function user()
{
return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email . ',用的手机是' . self::$phone;
}
}
echo User4::user();
echo '<hr>';
//二、实例演示抽象类
//建立一个抽象类,只要在类的方法中包含有没有实现的方法就叫做抽象类,抽象类不能被实例
//继承抽象类必须将父类中的抽象方法必须全部实现
//抽象类中可以有实现的方法,也可以有没有实现的方法
abstract class User5
{
public static $name = '程东旭';
public static $age = 30;
public static $email = 'chengdongxu@php.cn';
abstract public static function user();
}
class User6 extends User5
{
protected static $phone = 'apple';
public static function user()
{
return self::$name . '的年龄是' . self::$age . ',邮箱是' . self::$email . ',用的手机是' . self::$phone;
}
}
echo User6::user();
echo '<hr>';
//三、实例演示接口
//接口中不能有实现的方法,必须所有的方法都是未实现
//接口可以实现多继承
interface iUser1
{
const NATION1 = 'USA';
public static function user();
}
interface iUser2
{
const NATION2 = 'CHINA';
public static function write();
}
//接口的实现,工作类
class User8 implements iUser1, iUser2
{
public static $name = '程东旭';
public static function user()
{
return iUser1::NATION1;
}
public static function write()
{
return self::$name;
}
}
//客户端操作
echo User8::user() . '<br>';
echo User8::write();
//接口中允许存在的成员有:常量、动态方法、静态方法,不允许定义的成员有变量、静态属性、抽象方法、静态抽象方法
interface saaa
{
//常量
public const NAME = 'chengdongxu';
//方法
public function aaa();
//静态方法
public static function ccc();
}
总结
1、子类中方法使用的优先级:子类 > trait > 父类
2、抽象类是指普通类中包含至少一个没有被实现的方法,抽象类不能被实例,抽象类的子类必须全部实现父类中的抽象方法;如果继承抽象类的还是一个抽象类,就不需要全部实现父类中的所有方法
3、接口必须是所有的方法都没有被实现,不能被实例,接口的实现类必须实现接口中定义的所有方法,一个实现类可以一次性同时实现多个接口
4、接口中允许定义的成员有:常量、动态方法、静态方法,不允许定义的成员有变量、静态属性、抽象方法、静态抽象方法