1.类声明与实例化
<?php
// class声明一个类
class User
{
// 受保护的属性:可以在当前类与扩展类使用
protected $name;
protected $email;
// 构造方法
public function __construct($name,$email)
{
$this->name = $name;
$this->email = $email;
}
// 公开方法
public function show()
{
return "$this->name : $this->email";
}
}
// new实例化
$obj = new User('张三','guest@qq.com');
echo $obj->show(),'<br>';
?>
2.类的静态成员与类的扩展
<?php
// 类的静态成员
class Shop
{
// 静态属性
protected static $name;
private static $price;
// 构造方法
public function __construct($name,$price)
{
self::$name = $name;
self::$price = $price;
}
// 静态方法
public static function show()
{
return sprintf('商品名:%s<br>价格:%d',self::$name,self::$price);
}
}
$shop = new Shop('电脑',9999);
echo Shop::show(),'<br>';
echo '<hr>';
// 子类的扩展
class Order extends Shop
{
// 属性扩展
private static $orderid;
// 重写父类构造器
public function __construct($name,$price,$orderid)
{
parent::__construct($name,$price);
self::$orderid = $orderid;
}
// 重写父类普通方法
public static function show():string
{
return parent::show() . "<br>订单号:". self::$orderid;
}
}
$orderid = new Order('小米',3989,123456789);
echo Order::show(),'<br>';
?>
3.trait功能与trait父类的区别与联系、并实例演示trait冲突与优先级解决方案
trait特征:理解为一个公共方法集、借用class语法实现、但不是类,所以不能实例化
父类可以实例化
trait特征:类使用use关键字、实现代码复用特征类中的方法。
父类:父类使用extends扩展父类,实现代码复用父类中的方法。
类同时扩展父类,又使用trait特征类,同名方法优先级:类自身中的方法 > trait > 扩展的父类
<?php
trait Shop
{
public function s1()
{
return 'Hello,World!';
}
}
// trait的类,使用use关键字引用
class A
{
use Shop;
}
echo (new A)->s1(),'<br>';
echo '<hr>';
// trait的冲突与优先级的解决方案
trait A1
{
public function order()
{
return 'PHP中文网';
}
}
trait A2
{
public function order()
{
return ' : php.cn';
}
}
class B
{
use A1,A2{
// 1.优先级
A1::order insteadOf A2;
// 2.别名
A2::order as orders;
}
}
echo (new B)->order(),(new B)->orders(),'<hr>';
?>