批改状态:合格
老师批语:
[toc] //md 内容表
require 'autoload.php';
class Player{// 成员属性 前一定要有 访问修饰符 public protected privatepublic $name;//抽象属性 nullpublic $height;public $team;// protected 只能被本类和子类访问protected $playNum = 23;// 只能被本类访问private $weight;// 如何给protected private属性赋值// __construct()魔术方法 构造函数 构造器 类实例化一次就被自动调用一次 __get __set __call __callStaticpublic 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(); }
implementsclass Ukey implements USB { function run() { return '运行USB键盘设备<br>'; } }
class Computer { // 计算机类中的一个方法 要可以应用任意一种USB设备 function useUSB($usb)//参数是一个对象 { return $usb->run(); } }
echo $user3->getCount();parent::__construct($name,$price);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号