博客列表 >PHP 13 class(类)与object(对象)基础1(0721tue)

PHP 13 class(类)与object(对象)基础1(0721tue)

老黑
老黑原创
2020年07月22日 20:05:05892浏览

主要内容:

  1. 类class的定义:对象的模板
  2. 类的声明与实例化
  3. 类成员:属性、方法
  4. 类方法
  5. 类成员访问控制:封装
  6. 类成员继承、扩展

1. 类class的定义:对象的模板

  1. // 对象的模板: 类。下面为示例的代码,非真代码。
  2. // class Demo
  3. // {
  4. // // 属性: 数据复用
  5. // $a;
  6. // $b;
  7. // $c;
  8. // // 方法: 代码复用
  9. // function get($a,$b, $c) {
  10. // return $a + $b +$c;
  11. // }
  12. // }

2. 类的声明与实例化

  • 类的声明就是建立类,实例化就是依据类创建出具体的对象。
  1. // 1. 类的声明
  2. class Goods
  3. {
  4. // 类成员:
  5. // 1. 类属性
  6. // 2. 类方法
  7. public $a = 'abc';
  8. // 类的实例构造方法/器
  9. public function __construct()
  10. {
  11. }
  12. }
  13. // 2. 类的实例化: 就是创建对象的对象
  14. // 类中的构造方法必须用: new 来调用
  15. $goods = new Goods();
  16. // var_dump($goods);
  17. // var_dump($goods instanceof Goods);
  18. // 实例与对象,在不引起误会的场景下,可以通用
  19. // 动态类, 将类名称放在一个变量中
  20. $className = 'Goods';
  21. $obj = new $className();
  22. echo get_class($obj);

3. 类成员:属性、方法

  1. <?php
  2. class User
  3. {
  4. // 类的属性
  5. // 公共成员: 在类的内部和外部都可以访问,都可见
  6. public $name = '胡八一';
  7. public $options = [1,2,3];
  8. // heredoc,nowdoc都支持
  9. // 静态属性:如果这个属性仅使用一次,可以不创建类实例,而直接通过类来调用
  10. public static $nation = 'CHINA';
  11. // 抽象属性,没被初始化的属性, 默认赋NULL
  12. public $salary;
  13. }
  14. // 客户端代码
  15. // 类的实例化
  16. $user = new User;
  17. // 类中的成员属性的访问
  18. echo $user->name;
  19. // print_r($user->options[1]);
  20. // 访问静态成员使用双冒号: 范围解析符
  21. // echo User::$nation; 静态成员可以直接访问,不用实例化。
  22. var_dump(is_null($user->salary));//判断抽象属性是否为null。

4. 类方法

  1. <?php
  2. class User
  3. {
  4. // public: 访问限定符,用来声明类成员的作用域
  5. // 类属性
  6. public $name = '胡八一';
  7. public $age = 40;
  8. public static $nation = 'CHINA';
  9. // 类方法
  10. public function write1()
  11. {
  12. // 访问类属性
  13. // 1. 实例化
  14. $user = new User;
  15. // 2 访问类成员
  16. return "姓名:{$user->name},年龄: {$user->age}";
  17. }
  18. // 类方法
  19. public function write2()
  20. {
  21. // 声明一个变量, 声明在方法中的变量,不是属性,是私有变量/局部变量
  22. $salary = 8000;
  23. // 访问类属性
  24. // 1. 实例化
  25. // 第一个问题: 类的名称被限定,使用self可以引用当前的类名称
  26. // $user = new self;
  27. // $this会自动创建, $this是只读的,不能被更新
  28. // $this = new self;
  29. // 2 访问类成员
  30. // 第二个问题: 类的实例,类中并不关心,它也只需要一个实例的引用就可以了
  31. // 引用当前类实例: $this
  32. return "姓名:{$this->name},年龄: {$this->age}, 工资: {$salary}";
  33. // self: 类引用
  34. // $this: 类实例引用
  35. }
  36. // 类方法中访问(类)外部成员: 变量和函数
  37. public function write3()
  38. {
  39. // 调用外部函数
  40. $str = hello();
  41. // 外部变量
  42. return $str . $GLOBALS['username'];
  43. }
  44. // 实际项目中,外部成员应该通过方法参数注入到方法,而不是在方法中直接调用
  45. // 依赖注入
  46. public function write4(Closure $hello, string $username)
  47. {
  48. return $hello() . $username;
  49. }
  50. // 静态方法: 不依赖类实例,可以用类直接调用
  51. public static function write5()
  52. {
  53. // 静态成员属于类,不属性于类实例,所以不能使用类实例的引用$this
  54. // return "姓名:{$this->name},年龄: {$this->age}";
  55. return "国籍: " . self::$nation;
  56. }
  57. // 普通方法中可以访问静态成员, 而反之不行
  58. public function write6()
  59. {
  60. return "国籍: " . self::$nation;
  61. }
  62. }
  63. // 客户端代码
  64. $user = new User;
  65. echo $user->write1();
  66. echo '<hr>';
  67. echo $user->write2();
  68. // 外部函数
  69. function hello()
  70. {
  71. return 'Hello ';
  72. }
  73. // 匿名函数
  74. $hello = function ()
  75. {
  76. return 'Hello ';
  77. };
  78. // 外部变量
  79. $username = '大金牙';
  80. echo '<hr>';
  81. echo $user->write3();
  82. echo '<hr>';
  83. echo $user->write4($hello, $username);
  84. echo '<hr>';
  85. echo $user->write5();
  86. echo '<hr>';
  87. echo $user->write6();

5. 类成员访问控制:封装

  1. <?php
  2. class User
  3. {
  4. // public: 公共成员, 类外部和内部以及子类中均可使用
  5. public $name = '胡八一';
  6. // protected: 受保护成员, 除了外部不可见,内部和子类中均可见
  7. protected $salary = 7788;
  8. // private: 私有成员,仅限于本类内部使用,外部或子类均不可见
  9. private $age = 30;
  10. // 类内部
  11. public function write()
  12. {
  13. return "姓名: {$this->name},年龄 : {$this->age}, 工资: {$this->salary}";
  14. }
  15. }
  16. // 子类
  17. class Rob extends User
  18. {
  19. public function write()
  20. {
  21. // return "姓名: {$this->name},年龄 : {$this->age}";
  22. // 子类中: 只有public 和 protected可见
  23. return "姓名: {$this->name}, 工资: {$this->salary}";
  24. }
  25. }
  26. // 类外部
  27. $user = new User;
  28. // echo $user->name;
  29. // echo $user->age;
  30. // echo $user->salary;
  31. echo '<hr>';
  32. echo $user->write();
  33. echo '<hr>';
  34. // 子类中的访问
  35. echo (new Rob)->write();

6. 类成员继承、扩展

  • 变量是数据复用,函数是代码复用, 继承就是类的复用
  1. <?php
  2. // final: 类前加final禁止类扩展
  3. final class User
  4. {
  5. // 属性
  6. protected $name = '胡八一';
  7. // 方法
  8. // final: 方法前加:禁止重写
  9. public function write()
  10. {
  11. return "姓名: {$this->name}";
  12. }
  13. }
  14. // 扩展类/子类
  15. class Rob extends User
  16. {
  17. // 1. 扩展
  18. // 属性扩展
  19. protected $age = 90;
  20. // 方法扩展
  21. // public function write()
  22. // {
  23. // return parent::write() . ", 年龄: {$this->age}";
  24. // }
  25. // 2. 重写
  26. // 属性重写
  27. protected $name = '王胖子';
  28. // 方法重写
  29. public function write()
  30. {
  31. return "{$this->name} : {$this->age} 岁";
  32. }
  33. }
  34. // 调用
  35. $rob = new Rob;
  36. echo $rob->write();

7. 实战作业

  • 自定义实例演示类与实例,类属性与类方法,类成员的访问控制, 类的扩展以及扩展的方式
  1. <?php
  2. class Human
  3. {
  4. public $height = '180cm';
  5. public $weight = '80kg';
  6. protected $brain = 'middle';
  7. protected $heart = 'fraigle';
  8. private $motion = 'good';
  9. private $power = 'infinite';
  10. public function makevalue()
  11. {
  12. return "Although one man is only {$this->height} high, but his power is {$this->heart}!";
  13. }
  14. }
  15. $tom = new Human;
  16. echo $tom->makevalue();
  17. echo "<br><hr>".$tom->private."<br><hr>";
  18. //尝试了下protected变量外外部访问会报错。private不会报错,但不会显示认识东西。
  19. class Woman extends Human
  20. {
  21. public $height = '170cm';
  22. public $weight = '55kg';
  23. private $motion = 'lovely';
  24. public static $habit = 'excellent';
  25. public function nicestyle()
  26. {
  27. echo '<br><hr>';
  28. return "When you meet a {$this->motion} woman about {$this->height} high, you should know she is very {$this::$habit}!";
  29. } //这个地方注意下static静态变量的引用。
  30. }
  31. $mary = new Woman;
  32. echo $mary->nicestyle();

结果如图:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议