批改状态:合格
老师批语:
- 实例演示类声明,类的实例化,类的静态成员与类的扩展;
- 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案
一个文件只保存一个类,文件名中包含类名,
文件名:类名.class.php
类名:单词的首字母大写
[修饰类的关键字] class 类名 {成员属性成员方法}
(1)成员属性,在类中声明的变量,称为成员属性。声明时,变量前面必须使用一个关键字,如使用public、private、static等关键字修饰,如不需要有特殊意义的修饰,则可使用var关键字
(2)成员方法,在类中声明的函数,称为成员方法。
(1)类创建后,可以使用 new 运算符来实例化该类的对象
$变量名 = new 类名称;
对象引用$this
成员方法属于哪个对象,$this引用就代表哪个对象。
<?phpclass Person {var $name;function say(){echo 'my name is '.$this->name;}}$user = new person; //实例化对象$user->name = 'tianpenglaoshi'; //对象属性的赋值$user->say(); //访问对象的成员方法//输出:my name is tianpenglaoshi
(2)构造方法
构造方法的作用是为成员属性初始化;
构造方法是在对象创建完后,第一个自动调用的方法;
构造方法,方法名固定,在PHP4中构造方法名与类名一致;PHP5中是 __construct()
<?phpclass Person {var $name;var $age;var $mail;function __construct($name='', $age=16,$mail='hr@tlbh@baidu.cn'){$this->name = $name;$this->age = $age;$this->mail = $mail;}function ary(){echo $this->name.$this->age.$this->mail;}}$user= new person('黄蓉');$user->ary();//输出:黄蓉16hr@tlbh@baidu.cn
<?php//类的属性和方法://1.public:公开的//2.privote:私有成员,只有本类中使用//3.protedcted:被保护的,仅限本类和子类访问class Product{//类的属性:protected $price;public $name;//构造函数:public function __construct($name,$price){$this->name=$name;$this->price=$price;}//类的方法public function count():string{return "商品名称:$this->name,单价:$this->price";}};$user = new Product("Redmi 10X",1899);echo $user->count();echo '<hr>';echo $user->name;
图示:
static(静态)
1)static可以修饰成员属性和成员方法,不能修饰类;
2)用static修饰的成员属性,可以被同一个类的所有对象共享;
3)静态的数据是存在内存中的数据段中(初始化静态段);
4)静态的数据是在类每次加载时分配到内存中的,以后再用到类时就直接从数据段中获取;
5)静态成员要用类名去访问,不用对象去访问;
类名::静态成员属性名
类名::静态成员方法名()
6)如果在类中使用静态成员,可以使用self代表本类;
self::静态成员属性名
self::静态成员方法名()
7)静态方法(static修饰的方法),不能访问非静态的成员。
<?phpclass user// 静态属性{public static $name;public static $like;// 静态方法public static function show(){return 'My Name is '. static::$name .'. and I like:' . static::$like;}}class user1 extends user{public static $name='Huangrong';public static $like='Eight-diagram palm;';}class user2 extends user{public static $name='Guojin';public static $like='Swordsmanship';}echo user1::show();echo '<hr>';echo user2::show();
图示:
1.4类的扩展
<?phprequire 'loader.php';$staff = new Staff('蒋大爷',78);// 访问类的静态属性echo Staff::$name;echo' <hr>';// 访问类的静态方法echo Staff::show();echo' <hr>';// 访问实例的静态方法echo $staff->show();// 不能访问实例的静态属性
2.1trait类
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式。
<?php// trait: 理解为一个公共方法集// trait 借用了class语法实现的一个轻量级的"类",但不是类,所以不能"实例化"trait Like{public function user(){return __METHOD__;}}class Us{// 在要使用trait的类中,使用use关键字引用它即可use Like;}class They{use Like;}echo (new Us)->user(), '<hr>';echo (new They)->user(), '<hr>';
图示:
2.2trait组合中命名冲突的解决方法
<?phptrait User1{public function show(){return '他们是:'.__METHOD__;}}trait User2{public function show(){return '他们是:'.__METHOD__;}}trait User3{use User1, User2 {// 给User2::show()起个别名: S2User2::show as ds2;// 调用User1::show()替换成User2::show()User1::show insteadOf User2;}}class User{use User3;}echo (new User)->show();echo '<hr>';// 别名访问User2::showecho (new User)->ds2();
图示:
2.3trait冲突与优先级解决方案
在继承的上下文中存在同名方法的时候,优先级关系不同,其优先级关系如下:
父类引入:优先级关系为: you > we> trait(Demo)
子类引入:优先级关系为: you > trait(user) > we
<?phptrait User{public static function beautiful(){return 'trait中的方法' . __METHOD__;}}// 父类class We{use User;public static function beautiful(){return '父类中的方法' . __METHOD__;}}// 子类class You extends We{use User;public static function beautiful(){return '子类中的方法' . __METHOD__;}}echo you::beautiful();// 在继承的上下文中存在同名方法的时候,优先级关系不同,其优先级关系如下:// 父类引入:优先级关系为: you > we> trait(Demo)// 子类引入:优先级关系为: you > trait(user) > we
图示:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号