静态继承

  1. <?php
  2. // 1、静态成员 (属性和方法)
  3. class Shop{
  4. public static $title='苹果13PRO';
  5. public $price;
  6. public $num1=1;
  7. public static $num2=1;
  8. //构造 给与静态成员默认值会报错
  9. //使用静态成员没有经过构造方法
  10. public function __construct($title,$price)
  11. {
  12. $this->title =$title;
  13. $this->price =$price;
  14. // 普通成员变量,每次从头开始计算
  15. $this->num1++;
  16. // 静态变量成员调用一次,就会增加1
  17. // 静态成员为本类调用,为所有实例共享
  18. // 存在内存中,只要使用了改变了它的值,它会在内存中保存改变后的数据
  19. self::$num2++;
  20. }
  21. public static function vedio($tit){
  22. // 静态成员用self 代表本类 Shop, 普通方法用$this
  23. return '看视频手机:'. self::$title . $tit;
  24. }
  25. }
  26. class Son extends Shop
  27. {
  28. // 静态也能被继承
  29. }
  30. /*
  31. * 静态化成员的优缺点
  32. * 1、存在多个实例,静态成员在内存中,只占一份
  33. * 2、静态成员 执行效率比 实例化高
  34. *
  35. * 缺点
  36. * 静态成员不能自动销毁 实例化会自动销毁
  37. */
  38. echo Son::vedio('!厉害了!'); //看视频手机:苹果13PRO!厉害了!

抽象类

  1. /* 2、抽象类
  2. * (多态的一种,静态也是多态的一种)
  3. * 抽象类 用于描述一些十五所具有的特性和行为 但是没有具体实现
  4. * 抽象有类 也有方法 abstract
  5. * */
  6. abstract class Person
  7. {
  8. abstract public function say();
  9. abstract public function eat();
  10. //抽象方法
  11. }
  12. //new Person(); Cannot instantiate abstract class Person
  13. //抽象类不能被实例化的,不能生产出来对象
  14. //抽象类继承抽象类
  15. abstract class Chinese extends Person
  16. {
  17. protected $name;
  18. //构造方法也可以在抽象类里使用
  19. public function __construct($name)
  20. {
  21. $this->name =$name;
  22. }
  23. // 抽象类里是可以有普通方法的
  24. public function say(){
  25. return $this->name . '我是中国人,我说汉语';
  26. }
  27. }
  28. //架构师 把项目架起来,在做很多抽象类,你写的代码必须继承抽象类
  29. //有多少个抽象方法就继承多少个抽象方法
  30. // 如果继承了抽象类,不能把所有的方法重写,只能自己也是抽象类
  31. class Anhui extends Chinese
  32. {
  33. public function eat(){
  34. return $this->name . '我是中国人,我吃中国菜';
  35. }
  36. }
  37. $obj =new Anhui('小明');
  38. echo $obj->say();//小明我是中国人,我说汉语
  39. echo '<hr />';
  40. echo $obj->eat(); //小明我是中国人,我吃中国菜
  41. // 抽象类 设计类和实现类是分离的 可以为子类提供 公用的方法 作为子类重写模板来使用

类常量 const

  1. class App
  2. {
  3. // const 常量关键词
  4. const APP_NAME='PHP';
  5. public function get_name(){
  6. return self::APP_NAME;//调用常量
  7. }
  8. }
  9. ///常量不能实例化访问
  10. echo App::APP_NAME; //静态访问方式
  11. $obj = new App();
  12. echo $obj->get_name();
  13. //常量会当成静态成员进行访问

接口

  • 接口
  1. //也是多态的一种,不管是普通还是抽象,都是单继承,就是一个子类只能继承一个父类
  2. // interface 关键词 创建 替换class
  3. interface File
  4. {
  5. //接口只能声明两种成员 常量 抽象方法
  6. const APP_NAME='中小学教育部';
  7. //接口的方法本身就是抽象的不能放abstract
  8. public function no_ke($o,$t);
  9. public function no_ye(...$param);
  10. }
  11. interface Guojia
  12. {
  13. //接口里可以用静态方法
  14. public static function no_tifa($param);
  15. }
  16. // 接口不能继承
  17. // 实现接口implements
  18. class Teacher implements File,Guojia{
  19. public function no_ke($o,$t){
  20. return $o . $t;
  21. }
  22. public function no_ye(...$param){
  23. return print_r($param);
  24. }
  25. // 接口有静态成员,重写也要用静态
  26. public static function no_tifa($param){
  27. return $param;
  28. }
  29. }
  30. $obj = new Teacher();
  31. echo $obj->no_ke('补课?','不补课!'); //补课?不补课!
  32. echo '<hr />';
  33. echo $obj->no_ye('作业?','没有作业!','不能留作业!');
  34. //Array ( [0] => 作业? [1] => 没有作业! [2] => 不能留作业! ) 1
  35. echo '<hr />';
  36. //echo $obj->no_tifa('不能体罚!'); //不能体罚!
  37. //静态成员不要实例化
  38. echo Teacher::no_tifa('不能体罚!');//不能体罚!
  • 示例
  1. abstract class Computer
  2. {
  3. const APP_NAME="Win11 电脑";
  4. abstract public function install($param);
  5. }
  6. interface Plugo{
  7. public function install_o($param);
  8. }
  9. interface Plugt{
  10. public function install_t($param);
  11. }
  12. class VScode extends Computer implements Plugo,Plugt{
  13. public function install($param){
  14. return '安装成功:'.$param;
  15. }
  16. public function install_o($param){
  17. return '安装成功:'.$param;
  18. }
  19. public function install_t($param){
  20. return '安装成功:'.$param;
  21. }
  22. }
  23. $obj = new VScode();
  24. echo $obj->install("vscode");
  25. echo '<br />';
  26. echo $obj->install_o("插件1");
  27. echo '<br />';
  28. echo $obj->install_t("插件2");

后期静态绑定

  1. //后期静态绑定 延迟静态绑定 静态::访问类 就是后期
  2. // 关键词 static
  3. class A{
  4. public static function test(){
  5. return 'A';
  6. }
  7. public function show(){
  8. //return $this->test();
  9. return static::test();
  10. }
  11. }
  12. class B extends A{
  13. public static function test(){
  14. return 'B';
  15. }
  16. }
  17. $a =new A();
  18. //实例化A 用a请求$this 先找A
  19. echo $a->show();
  20. echo '<hr />';
  21. $b =new B();
  22. //实例化B 找B
  23. echo $b->show();

魔术方法

  • __destruct 析构方法
  1. class A{
  2. public $name;
  3. public function __construct($name)
  4. {
  5. $this->name=$name;
  6. }
  7. public function __destruct()
  8. {
  9. echo '执行完成';
  10. //可以执行很多代码 比如unset
  11. }
  12. }
  13. $a= new A('明明');
  14. echo $a->name;
  15. $name=$a->name;
  16. echo '<hr />';
  17. unset($a);
  18. echo '<hr />';
  19. //$name=$a->name;
  20. echo $name;

析构方法

  • 属性重载 get
  1. class People{
  2. //私有的 受保护的都可以使用
  3. private $name;
  4. protected $age;
  5. protected $height;
  6. public function __construct($name,$age,$height)
  7. {
  8. $this->name=$name;
  9. $this->age=$age;
  10. $this->height=$height;
  11. }
  12. public function __get($n){
  13. //__get 参数是 我们要找的成员名字,外面找name 返回name
  14. // return $this->name;
  15. //要找name $n就是name $this->$n 相当于 $this->name
  16. if($n=='name'||$n=='age'){
  17. return $this->$n;
  18. }
  19. //empty 没有值也会当成真
  20. if(empty($this->$n)){
  21. return $n.',你访问的成员不存在!';
  22. }
  23. return $n.',你访问的成员不能访问!';
  24. }
  25. }
  26. $obj = new People('明明',18,180);
  27. echo $obj->name;
  28. echo '<hr />';
  29. echo $obj->age;
  30. echo '<hr />';
  31. echo $obj->height; //height,你访问的成员不能访问!
  • set 修改
  1. class People{
  2. //私有的 受保护的都可以使用
  3. private $name;
  4. protected $age;
  5. protected $height;
  6. public function __construct($name,$age,$height)
  7. {
  8. $this->name=$name;
  9. $this->age=$age;
  10. $this->height=$height;
  11. }
  12. public function __get($n){
  13. //__get 参数是 我们要找的成员名字,外面找name 返回name
  14. // return $this->name;
  15. //要找name $n就是name $this->$n 相当于 $this->name
  16. if($n=='name'||$n=='age'){
  17. return $this->$n;
  18. }
  19. //empty 没有值也会当成真
  20. if(empty($this->$n)){
  21. return $n.',你访问的成员不存在!';
  22. }
  23. return $n.',你访问的成员不能访问!';
  24. }
  25. //设置需要两个参数
  26. public function __set($key,$value){
  27. // print_r($key.'----'.$value);
  28. //通过返回$this 的key =要修改的值
  29. return $this->$key=$value;
  30. }
  31. }
  32. $obj = new People('花花',25,160);
  33. echo $obj->age;
  34. echo '<hr />';
  35. $obj ->age =26;
  36. echo '<hr />';
  37. echo $obj->age;
  • 方法重载
  1. //方法重载 __call 访问未定义的方法时,触发
  2. class People{
  3. //call 有两个参数
  4. public function __call($key,$value){
  5. // $key 第一个参数是访问的方法
  6. //$value 第二个参数是方法的传值
  7. // print_r($key); //add
  8. // print_r($value);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 )
  9. // return 1;
  10. //方法重载是为了提醒和处理错误信息
  11. // if($key=='add')
  12. // {
  13. // $num=0;
  14. // foreach ($value as $v){
  15. // $num +=$v;
  16. // }
  17. // return $num;
  18. // }
  19. return '方法名:'.$key.'<br> 方法参数:<pre>'.print_r($value,true).'</pre>';
  20. }
  21. }
  22. $obj = new People();
  23. echo $obj->add(10,20,30,40);
  • 静态重载 callStatic
  1. class People{
  2. //callStatic 静态触发 要用静态方法
  3. public static function __callStatic($key,$value){
  4. return '方法名:'.$key.'<br> 方法参数:<pre>'.print_r($value,true).'</pre>';
  5. //
  6. }
  7. }
  8. //静态处理不能用普通方式来执行
  9. //$obj = new People();
  10. //echo $obj->add(10,20,30,40);
  11. //没有静态方法就会执行模式方法__callStatic
  12. echo People::add(100,200,300);
  • 汇总
关键词类外声明声明类声明属性声明方法解释
const定义类常量
extends扩展类,用一个类去扩展它的父类
public公用属性或方法
protected私有属性或方法
private受保护的属性或方法
static备注1静态成员
abstract备注2抽象类或方法
interface创建接口
implements实现接口
final类不能被继承
parent::访问父类
$this->访问本类
self::访访问本类静态
static::后期静态绑定
namespace创建命名空间

备注1:老师课件显示static可以声明类,我试了下发现不能用,先去掉
备注2:老师课件中abstract 可以声明属性,应该是可以声明抽象方法

  • 其他魔术方法
方法描述
__construct构造方法,实例类的时候,自动调用
__destruct析构方法,类执行完后,自动调用
__call在对象中调用一个不可访问方法时调用
__callStatic用静态方式中调用一个不可访问方法时调用
__get获得一个类的成员变量时调用
__set设置一个类的成员变量时调用
__isset当对不可访问属性调用 isset()或 empty()时调用
__unset当对不可访问属性调用 unset()时被调用
__sleep执行 serialize()时,先会调用这个函数
__wakeup执行 unserialize()时,先会调用这个函数
__toString类被当成字符串时的回应方法
__invoke调用函数的方式调用一个对象时的回应方法
__set_state调用 var_export()导出类时,此静态方法会被调用
__clone当对象复制完成时调用
__autoload尝试加载未定义的类
__debugInfo打印所需调试信息

更多相关文章

  1. 使用面向对象方法实现用户信息增删改查
  2. 静态、抽象、类常量、接口、后期静态绑定以及魔术方法
  3. PHP基础:类的封装和继承
  4. 类的封装、继承和多态
  5. 回答两个被频繁问到的代码写法问题
  6. Caffeine缓存的简单介绍
  7. 四种Laravel ORM开启created_at的方法
  8. 使用json_encode快速将中文转为Unicode编码(附解密方法)
  9. 用小鸟云服务器如何实现Nginx静态资源配置?

随机推荐

  1. Android(安卓)O中Notification进度条一直
  2. 如何手工创建android项目
  3. androidx.core.widget.NestedScrollView
  4. 使用googleMap获取api方法
  5. PHP,Android,IOS通信之 AES128加解密案例
  6. android 组建添加透明度
  7. Android之代码创建布局
  8. Real Android apps leveraging db4o pers
  9. 安卓调用键盘回车键做保存或调用搜索键执
  10. android studio在模拟器上的中文乱码问题