1. 实例演示类声明,类的实例化,类的静态成员与类的扩展
<?php
// 1. 类的声明
class MyAClass {
public $name;
protected $sex; // 私有属性,不可在外部访问. 仅限本类或者子级类引用
public function __construct($name, $sex) {
$this->name = $name;
$this->sex = $sex;
}
public function information(): string {
return "姓名: $this->name, 性别: $this->sex";
}
}
// 2. 类的实例化
$obj = new MyAClass('张三', '男');
echo $obj->name, '<br>';
// echo $obj->sex;
echo $obj->information(), '<hr>';
// 3. 类的扩展
class SonClass extends MyAClass {
private $age; // 私有属性,不可在外部访问. 仅限本类使用
public static $salary = 10000;
public static $birthdate = 1900 - 01 - 01;
public function __construct($name, $sex, $age, $salary, $birthdate) {
parent::__construct($name, $sex);
$this->age = $age;
self::$salary = $salary;
self::$birthdate = $birthdate;
}
public function information(): string {
return parent::information() . ", 年龄: $this->age" . ", 工资: " . self::$salary . ", 出生日期: " . self::$birthdate;
}
public static function xinxi(): string {
return sprintf("工资: %s, 出生日期: %s", self::$salary, self::$birthdate);
// return sprintf("%s, 工资: %s, 出生日期: %s", (new SonClass())->information(), self::$salary, self::$birthdate);
}
}
$obj1 = new SonClass('李四', '女', 30, 8999, date("Y-m-d"));
var_dump($obj1);
echo $obj1->name, '<br>';
echo $obj1->information(), '<hr>';
echo SonClass::$salary, '<hr>';
echo SonClass::$birthdate, '<hr>';
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;
public function name($name): string {
return $name . '你好! 我是B中的方法,我叫: ' . __METHOD__;
}
}
echo (new B())->name(‘李四’), ‘<hr>‘;
class C1 extends B {
use T;
}
class C2 extends B {
use T;
public function name($name): string {
return $name . '你好! 我是C中的方法,我叫: ' . __METHOD__;
}
}
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