- 实例演示类声明,类的实例化,类的静态成员与类的扩展;
- 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案
一个文件只保存一个类,文件名中包含类名,
文件名:类名.class.php
类名:单词的首字母大写
[修饰类的关键字] class 类名 {
成员属性
成员方法
}
(1)成员属性,在类中声明的变量,称为成员属性。声明时,变量前面必须使用一个关键字,如使用public、private、static等关键字修饰,如不需要有特殊意义的修饰,则可使用var关键字
(2)成员方法,在类中声明的函数,称为成员方法。
(1)类创建后,可以使用 new 运算符来实例化该类的对象
$变量名 = new 类名称;
对象引用$this
成员方法属于哪个对象,$this引用就代表哪个对象。
<?php
class 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()
<?php
class 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修饰的方法),不能访问非静态的成员。
<?php
class 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类的扩展
<?php
require '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组合中命名冲突的解决方法
<?php
trait User1
{
public function show()
{
return '他们是:'.__METHOD__;
}
}
trait User2
{
public function show()
{
return '他们是:'.__METHOD__;
}
}
trait User3
{
use User1, User2 {
// 给User2::show()起个别名: S2
User2::show as ds2;
// 调用User1::show()替换成User2::show()
User1::show insteadOf User2;
}
}
class User
{
use User3;
}
echo (new User)->show();
echo '<hr>';
// 别名访问User2::show
echo (new User)->ds2();
图示:
2.3trait冲突与优先级解决方案
在继承的上下文中存在同名方法的时候,优先级关系不同,其优先级关系如下:
父类引入:优先级关系为: you > we> trait(Demo)
子类引入:优先级关系为: you > trait(user) > we
<?php
trait 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
图示: