博客列表 >php类和trait

php类和trait

咸鱼老爷
咸鱼老爷原创
2021年03月18日 17:19:46558浏览

面向对象编程

面向对象 oop
面向过程编程:直接面向变量和函数的的编程
oop:直接面向对象编程(封装了变量和函数的一个编程单元)
本质是封装目标是代码复用

类:对象的模板,声明的类与这个类所在的文件推荐同名

  • 类成员:属性,方法
  • 访问控制:
    • private :私有成员,仅限本类中访问
    • public 公共的
    • protected : 受保护成员,仅限本类以及子类访问
  • 声明类

    1. class Product
    2. {
    3. // 属性:变量
    4. public $name;
    5. public $age;
    6. // 方法:函数
    7. // 双下划线的方法:魔术方法,由系统自动调用
    8. // 类实例化的时候会调用它
    9. //构造方法
    10. public function __construct($name,$age)
    11. {
    12. //初始化类成员,让类/实例化状态确定下来
    13. // 1、生成类的实例
    14. // $obj=new Product;
    15. //2、给这个新类赋值属性
    16. //$this:当前类实例的引用
    17. $this->name=$name;
    18. $this->age=$age;
    19. //3、返回这个新对象
    20. // return $obj
    21. }
    22. //实例方法
    23. public function index():string
    24. {
    25. return "$this->name:$this->age";
    26. }
    27. }
  • 类的实例化

    1. //加载类文件
    2. require 'product.php';
    3. //new 类实例化
    4. $obj=new Product('name',18);
    5. var_dump($obj);
    6. //两个对象完全对立,却是同一个类的实例
    7. $obj1=new Product('user',22);
    8. var_dump($obj1);
    9. echo $obj->index(),'<br>';
    10. echo $obj1->index();
    运行结果图
  • 类的自动加载

    创建load.php
    1. //类的自动加载器
    2. spl_autoload_register(function($class){
    3. require $class.'.php';
    4. });
    在客户端脚本中
    1. require 'load.php';
    2. // 实例化
    3. $obj=new Product('类',18);
    4. var_dump($obj);

运行结果图

  • 类的静态成员

    类成员并非全部都要使用‘类实例’方法,也由可以直接用‘类’访问的成员
    类实例可以访问静态方法,但不推荐这样用
    类实例不能访问静态属性
    创建User类
    1. class User{
    2. public static $name;
    3. public static $age;
    4. public function __construct($name,$age)
    5. {
    6. //静态成员与实例无关,当然不能使用$this访问,用类的引用
    7. //self:当前类的引用
    8. self::$name=$name;
    9. self::$age=$age;
    10. }
    11. public static function show(){
    12. return self::$name.self::$age;
    13. }
    14. }
    在客户端脚本中
    1. $ob=new User('姓名',18);
    2. echo User::$name,'<br>';
    3. echo User::$age,'<br>';
    4. echo User::show(),'<br>';
    5. echo $ob->show();
    运行结果图
  • 类的继承

    继承 extends ,子类,实现类的复用
    1、对父类方法的重写
    2、对父类功能的扩充
    创建子类Sub

    1. require 'load.php';
    2. class Sub extends Product{
    3. public $sex;
    4. public function __construct($name,$age,$sex)
    5. {
    6. // $this->name=$name;
    7. // $this->age=$age;
    8. parent::__construct($name,$age);
    9. $this->sex=$sex;
    10. }
    11. public function index():string
    12. {
    13. return parent::index()."$this->sex";
    14. }
    15. }

    在客户端脚本中

    1. $obj2=new Sub('姓名',35,'男');
    2. var_dump($obj2);

    运行结果图

  • trait

    理解为一个公共方法集,借用了class语法实现的一个轻量级的‘类’。但不是类,所以不能实例化
    1. trait T
    2. {
    3. public function m(){
    4. return __METHOD__;
    5. }
    6. }
    7. class A{
    8. use T;
    9. }
    10. class B{
    11. use T;
    12. }
    13. echo (new A)->m(),'<br>';
    14. echo (new B)->m(),'<br>';
    效果图

    当父类 trait与当前子类中存在同名成员时
    1. trait T1
    2. {
    3. public function m(){
    4. return __METHOD__;
    5. }
    6. }
    7. trait T2
    8. {
    9. public function m(){
    10. return __METHOD__;
    11. }
    12. }
    13. class A{
    14. use T1,T2{
    15. T1::m insteadOf T2;
    16. T2::m as T2m;
    17. }
    18. }
    19. echo (new A)->m(),'<br>';
    20. echo (new A)->T2m(),'<br>';

    Tips:当子类与父类存在同名成员时,子类优先,当trait中存在与父类同名的成员时,trait优先
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议