博客列表 >类的静态成员、类引用self:: ,接口、抽象类、trait ,后期静态绑定 static:: ,实战 查询构造器(链式调用)

类的静态成员、类引用self:: ,接口、抽象类、trait ,后期静态绑定 static:: ,实战 查询构造器(链式调用)

Jet的博客
Jet的博客原创
2023年03月23日 12:04:45682浏览

一、类的静态成员、类引用self::

  1. /**
  2. * 静态成员、类常量是属于类本身,不需要实例化,就可以被访问到
  3. * 1. static 静态成员
  4. * 2. self:: 类引用
  5. * 3. const 类常量
  6. * 4. __callStatic 当调用部存在的静态方法时
  7. * 5. :: 范围解析符 用于类常量,静态成员的访问
  8. */
  1. class Teacher
  2. {
  3. public const cates = ['前端','后端','全栈'];
  4. // 静态属性
  5. public static string $uname;
  6. private static int $salary;
  7. static int $count = 0;
  8. // 修饰符 放在 类型符 前面 : static string
  9. public static string $siteName = 'php中文网';
  10. // 静态方法:如果是公共的,可省public,不建议
  11. public static function getCount()
  12. {
  13. // 静态成员与类的实例无关,不能用 $this 来访问
  14. // 使用 self:: 引用,静态成员用$ sell::$count
  15. return sprintf(__CLASS__ . '类被实例化了%d次' , self::$count);
  16. }
  17. public function __construct($uname,$salary)
  18. {
  19. self::$uname = $uname;
  20. self::$salary = $salary;
  21. self::$count++;
  22. }
  23. public static function getBK(){
  24. return self::$uname . '来自' . self::$siteName . '可以胜任' . join(',', self::cates);
  25. }
  26. }
  27. // print_r(Teacher::cates); //类常量不建议类外部访问
  28. $mj = new Teacher('灭绝',20000);
  29. //echo $mj->getCount();
  30. echo Teacher::getCount()."<br />";
  31. echo Teacher::getBK();


注意点:

  1. 修饰符 放在 类型符 前面 : static string
  2. 静态方法:如果是公共的,可省public,不建议
  3. 静态成员与类的实例无关,不能用 $this 来访问;使用 self:: 引用,静态成员用$ sell::$count
  4. 类常量不建议类外部访问

二、接口、抽象类、trait

2.1、interface 定义接口

  1. interface iDemo
  2. {
  3. // 所有成员必选是公共的
  4. public const gender = 'MALE';
  5. // 所有方法都是抽象方法(只有声明,没有实现)
  6. public function sum($a, $b);
  7. public function sub($a, $b);
  8. public function mul($a, $b);
  9. public function div($a, $b);
  10. }

2.2、imlements 实现接口,abstract抽象类抽象方法

  1. abstract class aDemo implements iDemo{
  2. public function sum($a, $b)
  3. {
  4. return $a + $b;
  5. }
  6. public function sub($a, $b)
  7. {
  8. return $a - $b;
  9. }
  10. // 没有实现的方法,在抽象类中可声明
  11. abstract public function mul($a, $b);
  12. abstract public function div($a, $b);
  13. }
  14. interface A{
  15. public const A = 1;
  16. }
  17. interface B{
  18. public const B = 2;
  19. }
  20. class User implements A, B {}

2.3、trait

组合式继承,解决php oop 单继承,高耦合的诟病

  1. // trait: 工具箱,基于类的语法,但和接口一样,不能实例化
  2. trait t1
  3. {
  4. public function dump($data){
  5. var_dump($data);
  6. die;
  7. }
  8. }
  9. trait t2
  10. {
  11. public function sum($a,$b,...$arg)
  12. {
  13. return $a + $b +array_sum($arg);
  14. }
  15. }
  16. class work1 extends work
  17. {
  18. use t1,t2;
  19. /*
  20. public function sum($a,$b,...$args)
  21. {
  22. return "hello php中文网";
  23. }*/
  24. }
  25. echo (new work1)->sum(10, 20, 30, 40, 50);



注意点:

  1. 定义接口的所有成员必选是公共的
  2. 定义接口所有方法都是抽象方法(只有声明,没有实现)
  3. oop 单继承 只能继承一个父类
  4. 但可以实现多个接口,多态
  5. 抽象类中可以有抽象方法,可以部分实现接口中的抽象方法
  6. 没有实现的方法,在抽象类中可声明
  7. * 同名方法优先级别:当前类同名成员 > trait > 继承成员

三、后期静态绑定 static::

  1. // ! 后期静态绑定 static::
  2. // 静态继承时,不要再用self::,全部用static::
  3. class Car
  4. {
  5. private static function getName()
  6. {
  7. return 'Car';
  8. }
  9. public static function run()
  10. {
  11. // ! php内核将类的继承实现了放在编译阶段 就确认了self解析为car
  12. // self:: 的限制,对当前类的静态引用,取决于定义当前方法所在的类,定义类和调用类不能绑定
  13. // return self::getName();
  14. // ! static 后期静态绑定 static::不再被解析为定义当前方法所在的类,而是实际运行时计算的
  15. return static::getName();
  16. }
  17. }
  18. class BMW extends Car
  19. {
  20. public static function getName()
  21. {
  22. return 'E300';
  23. }
  24. }
  25. echo Car::run() . PHP_EOL; // Car
  26. echo BMW::run() . PHP_EOL; // Car


四、查询构造器(链式调用)

查询构造器:Db::table()->field()->where()->limit(1)->select();

  1. class Query
  2. {
  3. protected $db; // pdo链接对象
  4. protected $table;
  5. protected $field;
  6. protected $limit;
  7. // 链接数据库
  8. private function connect($dsn, $username, $password)
  9. {
  10. $this->db = new PDO($dsn, $username, $password);
  11. }
  12. function __construct($dsn, $username, $password)
  13. {
  14. $this->connect($dsn, $username, $password);
  15. }
  16. function table($table)
  17. {
  18. $this->table = $table;
  19. return $this;
  20. }
  21. function field($filed)
  22. {
  23. $this->field = $filed;
  24. return $this;
  25. }
  26. public function limit($limit)
  27. {
  28. $this->limit = $limit;
  29. return $this;
  30. }
  31. public function getSql()
  32. {
  33. return sprintf('SELECT %s FROM %s Limit %d', $this->field, $this->table, $this->limit );
  34. }
  35. public function select()
  36. {
  37. return $this->db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);
  38. }
  39. }
  40. // 工作类
  41. class db
  42. {
  43. static function __callStatic($method, $args)
  44. {
  45. $dsn = 'mysql:host=localhost;dbname=shop';
  46. $query = new Query($dsn,'root', 'root');
  47. // 直接委托给Query类中的普通方法完成
  48. return call_user_func([$query, $method],...$args);
  49. }
  50. }
  51. $res = Db::table('users')
  52. ->field('uid,username,phone')
  53. ->limit(3)
  54. ->select();
  55. var_dump($res);


注意点:

@形参名字可以随便起名字,一一对应即可;
链式调用的方法名系统已固定,不可更改

  1. function field($filed1)
  2. {
  3. $this->field1 = $filed1;
  4. return $this;
  5. }
  6. public function limit($limit)
  7. {
  8. $this->limit = $limit;
  9. return $this;
  10. }
  11. public function getSql()
  12. {
  13. return sprintf('SELECT %s FROM %s Limit %d', $this->field1, $this->table, $this->limit );
  14. }
  15. public function select()
  16. {
  17. return $this->db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);
  18. }
  19. // 工作类
  20. class db
  21. {
  22. static function __callStatic($method, $args)
  23. {
  24. $dsn = 'mysql:host=localhost;dbname=shop';
  25. $query = new Query($dsn,'root', 'root');
  26. // 直接委托给Query类中的普通方法完成
  27. return call_user_func([$query, $method],...$args);
  28. }
  29. }
  30. $res = Db::table('users')
  31. ->field('uid,username,phone')
  32. ->limit(3)
  33. ->select();
  34. var_dump($res);

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议