PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > PHP类声明|类的实例化|类的静态成员|类的扩展|trait与父类关联|trait冲突与优先级解决方案

PHP类声明|类的实例化|类的静态成员|类的扩展|trait与父类关联|trait冲突与优先级解决方案

幸福敲门的博客
幸福敲门的博客 原创
2021年02月04日 00:53:55 895浏览
  1. 实例演示类声明,类的实例化,类的静态成员与类的扩展;
  2. 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案

一、类声明,类的实例化,类的静态成员与类的扩展

1.1类声明

一个文件只保存一个类,文件名中包含类名,
文件名:类名.class.php
类名:单词的首字母大写

  1. [修饰类的关键字] class 类名 {
  2. 成员属性
  3. 成员方法
  4. }

(1)成员属性,在类中声明的变量,称为成员属性。声明时,变量前面必须使用一个关键字,如使用public、private、static等关键字修饰,如不需要有特殊意义的修饰,则可使用var关键字
(2)成员方法,在类中声明的函数,称为成员方法。

1.2类的实例化

(1)类创建后,可以使用 new 运算符来实例化该类的对象

  1. $变量名 = new 类名称;

对象引用$this
成员方法属于哪个对象,$this引用就代表哪个对象。

  1. <?php
  2. class Person {
  3. var $name;
  4. function say(){
  5. echo 'my name is '.$this->name;
  6. }
  7. }
  8. $user = new person; //实例化对象
  9. $user->name = 'tianpenglaoshi'; //对象属性的赋值
  10. $user->say(); //访问对象的成员方法
  11. //输出:my name is tianpenglaoshi

(2)构造方法
构造方法的作用是为成员属性初始化;
构造方法是在对象创建完后,第一个自动调用的方法;
构造方法,方法名固定,在PHP4中构造方法名与类名一致;PHP5中是 __construct()

  1. <?php
  2. class Person {
  3. var $name;
  4. var $age;
  5. var $mail;
  6. function __construct($name='', $age=16,$mail='hr@tlbh@baidu.cn'){
  7. $this->name = $name;
  8. $this->age = $age;
  9. $this->mail = $mail;
  10. }
  11. function ary(){
  12. echo $this->name.$this->age.$this->mail;
  13. }
  14. }
  15. $user= new person('黄蓉');
  16. $user->ary();
  17. //输出:黄蓉16hr@tlbh@baidu.cn
  1. <?php
  2. //类的属性和方法:
  3. //1.public:公开的
  4. //2.privote:私有成员,只有本类中使用
  5. //3.protedcted:被保护的,仅限本类和子类访问
  6. class Product{
  7. //类的属性:
  8. protected $price;
  9. public $name;
  10. //构造函数:
  11. public function __construct($name,$price)
  12. {
  13. $this->name=$name;
  14. $this->price=$price;
  15. }
  16. //类的方法
  17. public function count():string
  18. {
  19. return "商品名称:$this->name,单价:$this->price";
  20. }
  21. };
  22. $user = new Product("Redmi 10X",1899);
  23. echo $user->count();
  24. echo '<hr>';
  25. echo $user->name;

图示:
类构造方法

1.3类的静态成员

static(静态)
1)static可以修饰成员属性和成员方法,不能修饰类;
2)用static修饰的成员属性,可以被同一个类的所有对象共享;
3)静态的数据是存在内存中的数据段中(初始化静态段);
4)静态的数据是在类每次加载时分配到内存中的,以后再用到类时就直接从数据段中获取;
5)静态成员要用类名去访问,不用对象去访问;
类名::静态成员属性名
类名::静态成员方法名()
6)如果在类中使用静态成员,可以使用self代表本类;
self::静态成员属性名
self::静态成员方法名()
7)静态方法(static修饰的方法),不能访问非静态的成员。

  1. <?php
  2. class user
  3. // 静态属性
  4. {
  5. public static $name;
  6. public static $like;
  7. // 静态方法
  8. public static function show()
  9. {
  10. return 'My Name is '. static::$name .'. and I like:' . static::$like;
  11. }
  12. }
  13. class user1 extends user
  14. {
  15. public static $name='Huangrong';
  16. public static $like='Eight-diagram palm;
  17. ';
  18. }
  19. class user2 extends user
  20. {
  21. public static $name='Guojin';
  22. public static $like='Swordsmanship';
  23. }
  24. echo user1::show();
  25. echo '<hr>';
  26. echo user2::show();

图示:
类的静态成员

1.4类的扩展

  1. <?php
  2. require 'loader.php';
  3. $staff = new Staff('蒋大爷',78);
  4. // 访问类的静态属性
  5. echo Staff::$name;
  6. echo' <hr>';
  7. // 访问类的静态方法
  8. echo Staff::show();
  9. echo' <hr>';
  10. // 访问实例的静态方法
  11. echo $staff->show();
  12. // 不能访问实例的静态属性

二、trait与父类关联|trait冲突与优先级解决方案

2.1trait类

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式。

  1. <?php
  2. // trait: 理解为一个公共方法集
  3. // trait 借用了class语法实现的一个轻量级的"类",但不是类,所以不能"实例化"
  4. trait Like
  5. {
  6. public function user()
  7. {
  8. return __METHOD__;
  9. }
  10. }
  11. class Us
  12. {
  13. // 在要使用trait的类中,使用use关键字引用它即可
  14. use Like;
  15. }
  16. class They
  17. {
  18. use Like;
  19. }
  20. echo (new Us)->user(), '<hr>';
  21. echo (new They)->user(), '<hr>';

图示:
trait类

2.2trait组合中命名冲突的解决方法

  1. <?php
  2. trait User1
  3. {
  4. public function show()
  5. {
  6. return '他们是:'.__METHOD__;
  7. }
  8. }
  9. trait User2
  10. {
  11. public function show()
  12. {
  13. return '他们是:'.__METHOD__;
  14. }
  15. }
  16. trait User3
  17. {
  18. use User1, User2 {
  19. // 给User2::show()起个别名: S2
  20. User2::show as ds2;
  21. // 调用User1::show()替换成User2::show()
  22. User1::show insteadOf User2;
  23. }
  24. }
  25. class User
  26. {
  27. use User3;
  28. }
  29. echo (new User)->show();
  30. echo '<hr>';
  31. // 别名访问User2::show
  32. echo (new User)->ds2();

图示:
trait组合中命名冲突的解决方法

2.3trait冲突与优先级解决方案
在继承的上下文中存在同名方法的时候,优先级关系不同,其优先级关系如下:
父类引入:优先级关系为: you > we> trait(Demo)
子类引入:优先级关系为: you > trait(user) > we

  1. <?php
  2. trait User
  3. {
  4. public static function beautiful()
  5. {
  6. return 'trait中的方法' . __METHOD__;
  7. }
  8. }
  9. // 父类
  10. class We
  11. {
  12. use User;
  13. public static function beautiful()
  14. {
  15. return '父类中的方法' . __METHOD__;
  16. }
  17. }
  18. // 子类
  19. class You extends We
  20. {
  21. use User;
  22. public static function beautiful()
  23. {
  24. return '子类中的方法' . __METHOD__;
  25. }
  26. }
  27. echo you::beautiful();
  28. // 在继承的上下文中存在同名方法的时候,优先级关系不同,其优先级关系如下:
  29. // 父类引入:优先级关系为: you > we> trait(Demo)
  30. // 子类引入:优先级关系为: you > trait(user) > we

图示:
trait与父类关联

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