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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值