博客列表 >PHP基础: 类(class)的声明,实例化,静态成员和类的扩展﹑trait的功能及trait和类,继承共用时的优先级.

PHP基础: 类(class)的声明,实例化,静态成员和类的扩展﹑trait的功能及trait和类,继承共用时的优先级.

zl的php学习博客
zl的php学习博客原创
2021年02月19日 17:28:28666浏览

1. 实例演示类声明,类的实例化,类的静态成员与类的扩展

  1. <?php
  2. // 1. 类的声明
  3. class MyAClass {
  4. public $name;
  5. protected $sex; // 私有属性,不可在外部访问. 仅限本类或者子级类引用
  6. public function __construct($name, $sex) {
  7. $this->name = $name;
  8. $this->sex = $sex;
  9. }
  10. public function information(): string {
  11. return "姓名: $this->name, 性别: $this->sex";
  12. }
  13. }
  14. // 2. 类的实例化
  15. $obj = new MyAClass('张三', '男');
  16. echo $obj->name, '<br>';
  17. // echo $obj->sex;
  18. echo $obj->information(), '<hr>';
  19. // 3. 类的扩展
  20. class SonClass extends MyAClass {
  21. private $age; // 私有属性,不可在外部访问. 仅限本类使用
  22. public static $salary = 10000;
  23. public static $birthdate = 1900 - 01 - 01;
  24. public function __construct($name, $sex, $age, $salary, $birthdate) {
  25. parent::__construct($name, $sex);
  26. $this->age = $age;
  27. self::$salary = $salary;
  28. self::$birthdate = $birthdate;
  29. }
  30. public function information(): string {
  31. return parent::information() . ", 年龄: $this->age" . ", 工资: " . self::$salary . ", 出生日期: " . self::$birthdate;
  32. }
  33. public static function xinxi(): string {
  34. return sprintf("工资: %s, 出生日期: %s", self::$salary, self::$birthdate);
  35. // return sprintf("%s, 工资: %s, 出生日期: %s", (new SonClass())->information(), self::$salary, self::$birthdate);
  36. }
  37. }
  38. $obj1 = new SonClass('李四', '女', 30, 8999, date("Y-m-d"));
  39. var_dump($obj1);
  40. echo $obj1->name, '<br>';
  41. echo $obj1->information(), '<hr>';
  42. echo SonClass::$salary, '<hr>';
  43. echo SonClass::$birthdate, '<hr>';
  44. echo SonClass::xinxi(), '<hr>';

2.trait关键字及trait和类,继承共用时的优先级.

/*

  • trait: 一个公共方法集
  • 它借用了class的语法, 实现了一个轻量的”类”, 但是事实上它不是类,所以不能实例化
    */

// trait的实例演示
trait T {
public function name($name): string {
return $name . ‘ 你好! 我是T中的方法,我叫: ‘ . METHOD;
}
}

trait T1 {
public function name($name): string {
return $name . ‘ 你好! 我是T1中的方法,我叫: ‘ . METHOD;
}
}
trait T2 {
public function name($name): string {
return $name . ‘ 你好! 我是T2中的方法,我叫: ‘ . METHOD;
}
}

class A1 {
use T;
}
// 当一个类中有多个trait.并且有重名方法时
class A2 {
// use T, T1; // Trait method name has not been applied, because there are collisions with other trait methods on A2
// 解决办法:
use T, T1, T2{
// 1. 优先级. 最终,重名方法只会调用T2里面的
T::name insteadof T1, T2;
// 2. 别名
T1::name as T1name;
T2::name as T2name;
}
}
echo (new A1())->name(‘张三1’), ‘<hr>‘;
echo (new A2())->T1name(‘张三2.1’), ‘<hr>‘;
echo (new A2())->T2name(‘张三2.2’), ‘<hr>‘;

class B {
use T;

  1. public function name($name): string {
  2. return $name . '你好! 我是B中的方法,我叫: ' . __METHOD__;
  3. }

}

echo (new B())->name(‘李四’), ‘<hr>‘;

class C1 extends B {
use T;
}

class C2 extends B {
use T;

  1. public function name($name): string {
  2. return $name . '你好! 我是C中的方法,我叫: ' . __METHOD__;
  3. }

}

class C3 extends B {
}

echo (new C1())->name(‘王五1’), ‘<hr>‘;
echo (new C2())->name(‘王五2’), ‘<hr>‘;
echo (new C3())->name(‘王五3’), ‘<hr>‘;

// 由此可见,当trait和类共用时, 出现重名方法时,
// 实例化的类中的方法的优先级会大于trait中的同名方法,而trait中的同名方法则大于父类中的同名方法
// own > trait > parent

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