Blogger Information
Blog 45
fans 0
comment 0
visits 34631
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php类和trait
咸鱼老爷
Original
561 people have browsed it

面向对象编程

面向对象 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优先
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post