1. 实例演示类声明,类的实例化,类的静态成员与类的扩展<?php
// 1. 类的声明
classMyAClass{
public$name;
protected$sex;// 私有属性,不可在外部访问. 仅限本类或者子级类引用
publicfunction__construct($name,$sex){
$this->name=$name;
$this->sex=$sex;
}
publicfunctioninformation():string{
return"姓名: $this->name, 性别: $this->sex";
}
}
// 2. 类的实例化
$obj=newMyAClass('张三','男');
echo $obj->name,'
';
// echo $obj->sex;
echo $obj->information(),'
';
// 3. 类的扩展
classSonClassextendsMyAClass{
private$age;// 私有属性,不可在外部访问. 仅限本类使用
publicstatic$salary=10000;
publicstatic$birthdate=1900-01-01;
publicfunction__construct($name,$sex,$age,$salary,$birthdate){
parent::__construct($name,$sex);
$this->age=$age;
self::$salary=$salary;
self::$birthdate=$birthdate;
}
publicfunctioninformation():string{
returnparent::information().", 年龄: $this->age".", 工资: ".self::$salary.", 出生日期: ".self::$birthdate;
}
publicstaticfunctionxinxi():string{
returnsprintf("工资: %s, 出生日期: %s",self::$salary,self::$birthdate);
// return sprintf("%s, 工资: %s, 出生日期: %s", (new SonClass())->information(), self::$salary, self::$birthdate);
}
}
$obj1=newSonClass('李四','女',30,8999,date("Y-m-d"));
var_dump($obj1);
echo $obj1->name,'
';
echo $obj1->information(),'
';
echoSonClass::$salary,'
';
echoSonClass::$birthdate,'
';
echoSonClass::xinxi(),'
';
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’), ‘
‘;
echo (new A2())->T1name(‘张三2.1’), ‘
‘;
echo (new A2())->T2name(‘张三2.2’), ‘
‘;
class B {
use T;
publicfunctionname($name):string{
return$name.'你好! 我是B中的方法,我叫: '.__METHOD__;
}
}
echo (new B())->name(‘李四’), ‘
‘;
class C1 extends B {
use T;
}
class C2 extends B {
use T;
publicfunctionname($name):string{
return$name.'你好! 我是C中的方法,我叫: '.__METHOD__;
}
}
class C3 extends B {
}
echo (new C1())->name(‘王五1’), ‘
‘;
echo (new C2())->name(‘王五2’), ‘
‘;
echo (new C3())->name(‘王五3’), ‘
‘;
// 由此可见,当trait和类共用时, 出现重名方法时,
// 实例化的类中的方法的优先级会大于trait中的同名方法,而trait中的同名方法则大于父类中的同名方法
// own > trait > parent