Blogger Information
Blog 41
fans 0
comment 0
visits 41103
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP类声明|类的实例化|类的静态成员|类的扩展|trait与父类关联|trait冲突与优先级解决方案
幸福敲门的博客
Original
938 people have browsed it
  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与父类关联

Correcting teacher:天蓬老师天蓬老师

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