博客列表 >PHP大牛成长之路:类与对象

PHP大牛成长之路:类与对象

周Sir-BLOG
周Sir-BLOG原创
2020年07月23日 00:22:49640浏览

1.类/属性/方法命名规则

建议遵循PSR-2命名规范和PSR-4自动加载规范

  • 类的命名采用驼峰法(首字母大写),例如 User、UserType;
  • 属性的命名使用驼峰法(首字母小写),例如 tableName、instance;
  • 方法的命名使用驼峰法(首字母小写),例如 getUserName;

2.类的创建与访问:

  1. // 1、类的声明:使用class+类名{}进行声明
  2. class Class1
  3. {
  4. //类的属性
  5. public $webSite = 'PHP中文网'; //类属性
  6. public static $hello = 'hello'; //静态属性
  7. public $domain; //抽象属性(未赋值)
  8. //类的方法
  9. function getDomain()
  10. {
  11. return $this->domain='www.php.cn';
  12. }
  13. }
  14. // 2、类的访问
  15. // 类的访问必须先示例化(创建对象的对象)
  16. $obj = new Class1();
  17. //访问类中静态属性:使用双冒号: 范围解析符
  18. echo Class1::$hello; //输出:hello
  19. //访问类属性:
  20. echo $obj->webSite; //输出:PHP中文网
  21. //访问类中抽象属性
  22. $obj->domain='www.php.cn'; //对象属性赋值
  23. echo $obj->domain; //输出:www.php.cn
  24. //访问类中方法
  25. echo $obj->getDomain(); //输出:www.php.cn

2.成员的访问控制:

  • public: 公共成员, 类外部和内部以及子类中均可使用

  • private: 私有成员,仅限于本类内部使用,外部或子类均不可见

  • protected: 受保护成员, 除了外部不可见,内部和子类中均可见

2.1 public 示例

  1. //创建父类
  2. class Father
  3. {
  4. // public: 公共成员, 类外部和内部以及子类中均可使用
  5. public $a='public str';
  6. //public:类公共方法
  7. public function fPublic()
  8. {
  9. return $this-> a;
  10. }
  11. }
  12. //创建子类&继承父类
  13. class Son extends father
  14. {
  15. public function sPublic()
  16. {
  17. return $this-> a;
  18. }
  19. }
  20. // 类外部
  21. // 子类继承父类,只需要实例化子类
  22. $objclass = new son();
  23. // 外部访问公共属性:$a
  24. echo $objclass -> a; //输出结果:public str
  25. // 父类内部访问公共属性:$a
  26. echo $objclass -> fPublic(); //输出结果:public str
  27. // 子类内部访问公共属性:$a
  28. echo $objclass -> sPublic(); //输出结果:public str

2.2 private 示例

  1. //创建父类
  2. class Father
  3. {
  4. // private: 私有成员,仅限于本类内部使用,外部或子类均不可见
  5. private $a='private str';
  6. //public:类公共方法
  7. public function fPublic()
  8. {
  9. return $this-> a;
  10. }
  11. }
  12. //创建子类&继承父类
  13. class Son extends father
  14. {
  15. public function sPublic()
  16. {
  17. return $this-> a;
  18. }
  19. }
  20. // 类外部
  21. // 子类继承父类,只需要实例化子类
  22. $objclass = new son();
  23. // 外部访问私有属性:$a
  24. // var_dump($objclass -> a); //输出为NULL (不可访问)
  25. // 父类内部访问私有属性:$a
  26. var_dump($objclass -> fPublic()); //输出:private str (正常访问)
  27. // 子类内部访问私有属性:$a
  28. // var_dump($objclass -> sPublic()); //输出为NULL (不可访问)

2.3 protected 示例

  1. //创建父类
  2. class Father
  3. {
  4. // protected: 受保护成员, 除了外部不可见,内部和子类中均可见
  5. protected $a='protected str';
  6. //public:类公共方法
  7. public function fPublic()
  8. {
  9. return $this-> a;
  10. }
  11. }
  12. //创建子类&继承父类
  13. class Son extends father
  14. {
  15. public function sPublic()
  16. {
  17. return $this-> a;
  18. }
  19. }
  20. // 类外部
  21. // 子类继承父类,只需要实例化子类
  22. $objclass = new son();
  23. // 外部访问保护属性:$a
  24. // var_dump($objclass -> a); //出错 (不可访问)
  25. // 父类内部访问保护属性:$a
  26. var_dump($objclass -> fPublic()); //输出:private str (正常访问)
  27. // 子类内部访问保护属性:$a
  28. var_dump($objclass -> sPublic()); //输出:private str (正常访问)

3.类方法访问类属性方法

  1. class User
  2. {
  3. // 类属性
  4. public $name = '胡八一';
  5. public $age = 40;
  6. public static $nation = 'CHINA';
  7. // 类方法实例化访问类属性
  8. public function write1()
  9. {
  10. // 1. 实例化
  11. $user = new User;
  12. // 2 访问类成员
  13. return "姓名:{$user->name},年龄: {$user->age},国籍:{$user::$nation}";
  14. }
  15. // 类方法使用$this和self访问类属性
  16. // $this:不受类名限定,使用$this引用当前类实例
  17. // self:不受类名限定,使用self可以引用当前的类名称
  18. public function write2()
  19. {
  20. //1. 实例化
  21. //$this相当于自动实例化:$this = new self;(不需要写) $this是只读的,不能被更新
  22. // 2 访问类成员
  23. return "姓名:{$this->name},年龄: {$this->age},国籍:".self::$nation;
  24. }
  25. }
  26. // 客户端代码
  27. $user = new User;
  28. // 类方法实例化访问类属性
  29. echo $user->write1(); //输出:姓名:胡八一,年龄: 40,国籍:CHINA
  30. // 类方法使用$this和self访问类属性
  31. echo $user->write2(); //输出:姓名:胡八一,年龄: 40,国籍:CHINA

4.类方法中访问(类)外部成员: 变量和函数

方法1:GLOBALS 引用外部变量,不推荐使用

  1. // 类方法中访问(类)外部成员: 变量和函数
  2. class User
  3. {
  4. public function write()
  5. {
  6. // 调用外部函数
  7. $str = hello();
  8. // 外部变量
  9. return $str . $GLOBALS['username'];
  10. }
  11. }
  12. //外部变量
  13. $username='胡八一';
  14. //外部函数
  15. function hello()
  16. {
  17. return 'Hello ';
  18. }
  19. // 客户端代码
  20. $user = new User;
  21. echo $user->write(); //输出:Hello 胡八一

方法2:依赖注入方式:推荐使用

  1. // 类方法中访问(类)外部成员: 变量和函数
  2. class User
  3. {
  4. // 实际项目中,外部成员应该通过方法参数注入到方法,而不是在方法中直接调用
  5. // 依赖注入
  6. public function write(Closure $hello, string $username)
  7. {
  8. return $hello() . $username;
  9. }
  10. }
  11. //外部变量
  12. $username='胡八一';
  13. //外部函数(匿名函数)
  14. $hello = function()
  15. {
  16. return 'Hello ';
  17. };
  18. // 客户端代码
  19. $user = new User;
  20. echo $user->write($hello, $username);//输出:Hello 胡八一

4.类的继承

4.1 继承

  1. // 类的继承/扩展
  2. // 变量是数据复用,函数是代码复用, 继承就是类的复用
  3. class Father
  4. {
  5. // 属性
  6. protected $name = '胡八一';
  7. // 方法
  8. public function write()
  9. {
  10. return "姓名: {$this->name}";
  11. }
  12. }
  13. // 扩展类/子类
  14. class Son extends Father
  15. {
  16. // 属性扩展
  17. protected $age = 30;
  18. // 方法扩展
  19. public function write()
  20. {
  21. return parent::write() . ", 年龄: {$this->age}";
  22. }
  23. }
  24. // 调用
  25. $rob = new Son;
  26. echo $rob->write(); //输出:姓名: 胡八一, 年龄: 30

4.2 继承重写

  1. class Father
  2. {
  3. // 属性
  4. protected $name = '胡八一';
  5. // 方法
  6. public function write()
  7. {
  8. return "姓名: {$this->name}";
  9. }
  10. }
  11. // 扩展类/子类
  12. class Son extends Father
  13. {
  14. // 属性扩展
  15. protected $age = 30;
  16. // 属性重写
  17. protected $name = '王胖子';
  18. // 方法重写
  19. public function write()
  20. {
  21. return "{$this->name} : {$this->age} 岁";
  22. }
  23. }
  24. // 调用
  25. $rob = new Son;
  26. echo $rob->write(); //输出:王胖子 : 30 岁

可以使用关键字:final 禁止重写 (在类或方法前面加表示禁止类或方法重写)

总结:

1、了解了类的创建与访问;
2、了解了类成员的访问控制;public private protected
3、了解了类方法中访问类属性方法;
4、了解了类的继承与重写。

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