Blogger Information
Blog 77
fans 0
comment 0
visits 55218
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类的静态成员、类引用self:: ,接口、抽象类、trait ,后期静态绑定 static:: ,实战 查询构造器(链式调用)
Jet的博客
Original
688 people have browsed it

一、类的静态成员、类引用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);

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post