演示类的声明、实例化、静态成员扩展等,以及trait功能、与父类的区别联系
程序员文章站
2022-01-15 10:58:07
...
类的声明与类的实例化:
类声明的样式代码:
<?php
// 声明一个类文件: 声明的类与这个类所在的文件推荐同名
// 类: 对象的模板
class Dsij
{
//protected: 受保护成员,仅限本类以及子类访问
protected $name;
protected $digit;
// 类实例化的时候会调用它, 构造方法
public function __construct($name,$digit)
{
//$this: 当前类实例的引用
$this->name = $name;
$this->digit = $digit;
}
// 实例方法
public function show():string
{
return "$this->name : $this->digit 元";
}
}
类的实例化样式代码:
<?php
// 类必须实例之后才可以访问内部的实例成员
// 加载类文件
require 'zuoye.php';
// new : 类实例化
$lslh = new Dsij('小米电视', 7899);
echo $lslh->show(),'<br>';
效果预览:
类的静态成员与扩展:
样式代码:
// 类的静态成员
class Ldjtdy
{
// 静态属性
protected static $name;
private static $price;
// 构造方法
public function __construct($name, $price)
{
// 静态成员与实例无关,当然不能用$this访问,用类的引用
// self: 当前类的引用
self::$name = $name;
self::$price = $price;
}
// 静态方法
public static function show()
{
// 静态方法中不能用$this
return sprintf('商品信息: %s<br> 商品价格: %d', self::$name, self::$price);
}
}
$Ldjtdy = new Ldjtdy('电脑', 12345);
echo Ldjtdy::show(), '<hr>';
// 子类, 类的复用 extends: 扩展
class zlfy extends Ldjtdy
{
// 属性扩展
private static $orcdf;
// 重写父类构造器
public function __construct($name, $price, $orcdf)
{
parent::__construct($name, $price);
self::$orcdf = $orcdf;
}
// 重写父类普通方法
public static function show(): string
{
return parent::show() . "<br>数量:" . self::$orcdf;
}
}
$orcdf = new zlfy('小米电视', 12998, 123);
echo zlfy::show(), '<hr>';
效果预览:
trait功能以及父类的区别联系:
trait: 理解为一个公共方法集; trait 借用了class语法实现的一个轻量级的"类",但不是类,所以不能"实例化"
在要使用trait的类中,使用use关键字引用它即可,当一个类引入多个trait时,很容易发生trait成员的命名冲突
当trait中存在与父类同名的成员时,trait优先,own > trait > parent
样式代码:
<?php
trait Jtxq
{
public function h1()
{
return 'Hello 你好呀';
}
}
// 在要使用trait的类中,使用use关键字引用它即可
class A
{
use Jtxq;
}
echo (new A)->h1(),'<hr>';
// trait的冲突与优先级的解决方案
trait A01
{
public function asxm()
{
return '不早了该写作业了!';
}
}
trait A02
{
public function asxm()
{
return ' 请打开网站 : php.cn';
}
}
class G
{
use A01,A02{
// 1.优先级
A01::asxm insteadOf A02;
// 2.别名
A02::asxm as qasxhm;
}
}
echo (new G)->asxm(),(new G)->qasxhm(),'<hr>';