一.类的创建和实例化

类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
基本语法:

  1. class 类名{
  2. //属性:变量
  3. //构造函数:实例化类的时候就会调用它,如果有参数,在实例化类的时候必须填入参数
  4. //方法:函数
  5. }

类的属性和方法有三种,分别是:
1.public:公开的
2.privote:私有成员,只有本类中使用
3.protedcted:被保护的,仅限本类和子类访问

例如我们可以写一个类并实例化:

  1. class Calculation{
  2. //类的属性:
  3. protected $price;
  4. public $name;
  5. //构造函数:
  6. public function __construct($name,$price)
  7. {
  8. $this->name=$name;
  9. $this->price=$price;
  10. }
  11. //类的方法
  12. public function count():string
  13. {
  14. return "商品名称:$this->name,单价:$this->price";
  15. }
  16. };

类的实例化:

  1. $bill = new Calculation("iphone 12",8888);
  2. echo $bill->count();//商品名称:iphone 12,单价:8888

访问类中的属性:

  1. echo $bill->name;//iphone 12
  2. echo "<hr>";

二.静态(static)成员

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
例如:

  1. class Demo{
  2. public static $price;
  3. public static $name;
  4. public function __construct(int $price,string $name)
  5. {
  6. // 静态成员与实例无关,所以不能用$this访问
  7. self::$price=$price;
  8. self::$name=$name;
  9. }
  10. // 静态方法
  11. public static function amountto():string
  12. {
  13. return sprintf('品名:%s,单价:%d',self::$name,self::$price);
  14. }
  15. }
  1. $test1 = new Demo(8888,"苹果");
  2. //在外部调用静态方法:
  3. echo Demo::amountto();//品名:苹果,单价:8888

普通的方法也是可行:

  1. echo $test1->amountto();

访问静态属性:

  1. echo Demo::$name;//苹果
  2. echo Demo::$price;//8888

但是静态属性不能用普通的访问方法


三.类的扩展(extends)

类的扩展,也叫类的继承,达到类的复用的目的,扩展有二个方法:一是对父类方法的重写,二是对父类功能的扩充
例如:

  1. class Son extends Calculation{
  2. //扩展一个属性:
  3. private $quantity;
  4. //重写一下父类的构造器:
  5. public function __construct(string $name, float $price,int $quantity)
  6. {
  7. //调用一下父类的成员:
  8. parent::__construct($name, $price);
  9. $this->quantity=$quantity;
  10. }
  11. //再给子类添加一个自己的方法:
  12. function calculator(){
  13. return sprintf("品名:%s,单价:%.2f,购买数量:%d,总价:%d",$this->name,$this->price,$this->quantity,($this->quantity * $this->price));
  14. }
  15. }

实例化类并调用:

  1. $test2 = new Son("足球",88.8,10);
  2. echo $test2->calculator();//品名:足球,单价:88.80,购买数量:10,总价:888

四.trait

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制,可以理解为一个公共方法集,借用class语法实现了一个轻量级的类,但不是类,所以不能实例化,在要使用trait的类中,使用use关键字引用它就可以了

优先级:

1.当子类与父类存在同名成员时子类优先
2.当trait中存在与父类同名成员时,trait优先
例如:

  1. trait HelloWorld{
  2. public function sayHello(){
  3. echo "Hello World!";
  4. }
  5. }
  6. class TheWorldIsNotEnough{
  7. use HelloWorld;//引入trait
  8. //创建一个和trait中方法同名的方法:
  9. public function sayHello()
  10. {
  11. echo "Hello Galaxy!";
  12. }
  13. }
  14. $test3 = new TheWorldIsNotEnough();
  15. $test3->sayHello();//Hello Galaxy!

命名冲突时的解决方案:

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

例如,创建AB两个trait,并在里面创建两个同名方法:

  1. trait A{
  2. public function smallTalk(){
  3. echo 'a';
  4. }
  5. public function bigTalk(){
  6. echo "A";
  7. }
  8. }
  9. trait B{
  10. public function smallTalk(){
  11. echo 'b';
  12. }
  13. public function bigTalk(){
  14. echo "B";
  15. }
  16. }

在一个类中使用AB两个trait并解决冲突:

  1. class Aliased_Talker{
  2. use A,B{
  3. //用insteadof明确使用哪个:
  4. B::smallTalk insteadof A;
  5. A::bigTalk insteadof B;
  6. //用as给方法起个别名:
  7. B::bigTalk as talk;
  8. }
  9. }

实验解决冲突的成果:

  1. $test5 = new Aliased_Talker();
  2. $test5->bigTalk();//A
  3. $test5->talk();//B

更多相关文章

  1. 0202-类声明及类的实例化,静态成员与类的扩展,trait与父类的区别
  2. 类声明-实例化-成员-继承-trait特征类
  3. PHP类与对象的基础概念
  4. Java基础知识点1
  5. 全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返
  6. [计算机视觉论文速递] 2018-03-14
  7. [计算机视觉论文速递] 2018-03-16
  8. [计算机视觉论文速递] 2018-03-20
  9. [计算机视觉论文速递] 2018-05-10

随机推荐

  1. php mail函数一段好的代码
  2. 使用“.html”链接到.html.php文件 - 这
  3. 在PHP中将PDF文档转换为预览图像,而无需安
  4. PHP开发视频教程
  5. php CI框架nginx 配置
  6. C#,PHP对应加密函数
  7. centos7下的lnmp环境安装
  8. phpmyadmin的乱码问题
  9. 用PHP计算字符串中元音的简单方法?
  10. 我无法定义我的错误