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

更多相关文章

  1. 几种Linux系统切换内核启动顺序方法
  2. Java反射机制:跟着代码学反射
  3. linux下挂载NTFS文件系统出现symbol lookup error: 报错解决方
  4. 2021-2-16:请问你知道分布式设计模式中的Quorum思想么?
  5. shell单分支if条件句语法详解与生产案例详解
  6. Docker快速搭建Clickhouse集群(3分片3副本)
  7. Java 对象的哈希值是每次 hashCode() 方法调用重计算么?
  8. 挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!
  9. 第2章 0126-细说变量与常量,课程笔记、心得(数据类型的转换与检测

随机推荐

  1. android Intent用法归纳
  2. 我使用过的 控件的一些特性(layout_weight
  3. 2011.09.21——— android 动态壁纸开发
  4. RubyMotion 3发布,支持Android和WatchKit
  5. Android访问本地服务器(localhost)的解决方
  6. Android开发 Handler+ExecutorService(线
  7. Android中修改系统时间的几种方式
  8. Android之DiskLruCache(缓存工具)
  9. Android客户端向服务器端传值——登录实
  10. android开发随记 - Google Map