Blogger Information
Blog 63
fans 8
comment 8
visits 50118
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP大牛成长之路:类与对象
周Sir-BLOG
Original
641 people have browsed it

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、了解了类的继承与重写。

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