批改状态:合格
老师批语:
<?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>';
/*
// 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
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号