Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
[toc] //md 内容表
require 'autoload.php';
class Player{
// 成员属性 前一定要有 访问修饰符 public protected private
public $name;//抽象属性 null
public $height;
public $team;
// protected 只能被本类和子类访问
protected $playNum = 23;
// 只能被本类访问
private $weight;
// 如何给protected private属性赋值
// __construct()魔术方法 构造函数 构造器 类实例化一次就被自动调用一次 __get __set __call __callStatic
public function __construct($name,$height,$team,$playNum,$weight){
// 1. 初始化类成员 让类/实例化的状态稳定下来
// 2. 给对象属性进行初始化赋值
// 3.可以给私有成员,受保护的成员初始化赋值
$this->name = $name;
$this->height = $height;
$this->team = $team;
$this->playNum = $playNum;
$this->weight = $weight;
}
public function jog()
{
// $this 特殊的对象引用,这里是指本对象,它会变
return "$this->name is jogging,whose playNum is $this->playNum<br>";
}
public function shoot()
{
return "$this->name is shooting,weighing $this->weight<br>";
}
}
父类:拥有部分相同的属性和方法
继承的好处:
子类
:
PHP 的单继承特性:类不允许同时继承多个父类(extends后面只能跟一个父类名称)
类的继承(扩展)是通过 extends 关键字实现class Son extends Product
就是 son 类继承了 Product 类
父类
class Product
{
public $name;
public $price;
protected $discount = 5;
public function __construct($name,$price)
{
$this->name = $name;
$this->price = $price;
}
public function show()
{
return "{$this->name}的单价为{$this->price}元";
}
final public function display()
{
return "现在为您展示的商品是{$this->name},它目前的市场价为{$this->price}元。";
}
}
子类
class Son extends Product
{
// 属性扩展
private $num;
// 重写 父类构造器
public function __construct($name,$price,$num)
{
// parent关键字 调用父类中的成员方法
parent::__construct($name,$price);
$this->num = $num;
}
// 重写父类中的普通方法
public function show() :string
{
return parent::show() . ", 数量{$this->num}个,双十一期间打{$this->discount}折。";
}
// 方法扩展
public function total()
{
return "商品{$this->name}的总价为".($this->price * $this->num) . '元';
}
// 子类不能重写父类中带有final关键字修饰的普通方法 可继承
}
class User
{
public static $name = '胡歌';
protected $_config = [
'auth_on'=>'true',
'auth_type'=>1//认证方式 1实时认证 2位登录认证
];
public static $nation = 'China';
private $salary;
static $count = 0;//记录已登录用户的总数
// public $count = 0;//记录已登录用户的总数
public function __construct($name,$salary)
{
// 静态成员与类的实例无关 不能用$this访问, 用self:: 类的引用 访问静态成员
self::$name = $name;
$this->salary = $salary;
self::$count ++;
// $this->count ++;
}
public static function getCount(){
return sprintf('目前该网站的在线人数为%d<br>',self::$count);
}
// 对象被销毁时自动调用
public function __destruct()
{
self::$count --;
}
// 在静态上下文中访问不到普通属性
// public static function getConfig()
// {
// return sprintf('认证开关:%s<br>,认证类型%d',$this->_config['auth_on'],$this->_config['auth_type']);
// }
public function getConfig()
{
return sprintf('认证开关:%s<br>,认证类型%d',$this->_config['auth_on'],$this->_config['auth_type']);
}
}
- 在内存中即使存在多个实例,静态成员在内存中只占一份,为所有实例共享,普通成员以实例的方式会创建多个内存
- 静态成员的执行效率比实例化高,不用创建对象就可以直接调用
- 静态方法不能访问类中的普通属性(此时还不存在对象)
- 普通成员是对象级别的存在,只能通过对象访问 默认都提供了$this 指针
- 静态成员是类级别的存在 随着类的加载而加载 没有提供$this 指针, 优先于对象存在 只能用类引用 self::访问
- 每 new 一次得到不同实例 就会产生一个新的对象 id 单例模式 类只能被实例化一次 只能产生唯一的对象 id
class Father
{
protected static $_instance = null;
static public function getInstance()
{
// 单例模式 保证实例化只发生一次
// 后期静态绑定开始
if(static::$_instance === null)
{
static::$_instance = new static(); //new static 生成的实例 是由调用对象决定的
}
return static::$_instance;
//if(self::$_instance === null)
//{
// self::$_instance = new self(); //返回的实例是不变的 无论谁去调用 返回的是同一个类的实例
//}
//return self::$_instance;
}
}
子类 1
class Son1 extends Father
{
protected static $_instance = null;
}
子类 2
class Son2 extends Father
{
protected static $_instance = null;
}
var_dump(Father::getInstance());
var_dump(Son1::getInstance());
var_dump(Son2::getInstance());
interface
定义接口,implements
用于表示类实现某个接口{}
nstanceof
关键字判断某个对象是否实现了某个接口 $object instanceof interfaceinterface extends interface
)接口中定义的所有方法都必须是公有,这是接口的特性
接口是定义,类是实现 trait 结构,解决 oop 的高耦合性 声明接口用 interface
interface USB {// 接口中只允许声明两类成员 1. 接口常量 2. 公共的抽象方法 function run(); }
implements
class Ukey implements USB { function run() { return '运行USB键盘设备<br>'; } }
class Computer { // 计算机类中的一个方法 要可以应用任意一种USB设备 function useUSB($usb)//参数是一个对象 { return $usb->run(); } }
echo $user3->getCount();
parent::__construct($name,$price);