博客列表 >php面向对象编程(oop)基础

php面向对象编程(oop)基础

余生
余生原创
2020年12月04日 15:35:291139浏览

php面向对象编程(英语:Object-oriented programming,缩写:OOP),对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。

个人理解,万物皆对象,通过定义类然后为这个类添加属性方法,再将其实例化的过程为面向对象编程,抽象是抽象了点,但是实质上对象无处不在,看个人如何去定义,有这样一句话“佛说:要有光,于是就有了光”,对象也是如此,你可以成为这个佛,但是编程也是为大众服务的,所以对象也要贴近现实。

本文包含内容:
类的构成、依赖注入、final, self, $this关键字的使用、oop封装与继承。

一.类的构成
1.每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义,类名可以是任何非 PHP 保留字的合法标签。

一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。以正则表达式表示为:[a-zA-Z\x7f-\xff][a-zA-Z0-9\x7f-\xff]*。

2.类属性:一定要有关键词修饰,public(公有的)、private(私有的)、protected(受保护的)、static(静态的);

3.类方法:一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)

4.类实例化:对象引用名 = new 类名([参数列表]) or 对象引用名 = new 类名;

上代码:

  1. <?php
  2. class apple{
  3. // 类属性 ,一定要有关键词修饰 public private protected static
  4. public $ipad = "max";// 默认值
  5. public $mac;
  6. public $iphong;
  7. // 类构构造方法/器,创造对象时对对象属性进行初始化辅助,每创建一个对象,__construct()自动会被调用一次
  8. public function __construct($ipad=""){
  9. $this->ipad = $ipad; //$this 特殊的对象引用 ,代表本对象,专门完成对象内部成员的访问
  10. }
  11. // 类方法
  12. public function style(){
  13. echo "There are three";
  14. }
  15. public function price(){
  16. echo "$900";
  17. }
  18. public function size(){
  19. echo "12 inches";
  20. }
  21. }
  22. // 类实例化
  23. // 对象引用名 = new 类名([参数列表]) 对象引用名 = new 类名
  24. $apl = new apple;
  25. // 访问对象属性,对象方法 ->
  26. echo $apl->style();
  27. // 将对象重新赋值 在类的外部
  28. $apl->ipad = 'ipadmini';
  29. echo $apl->price();

二、依赖注入

  1. class Users{
  2. public $name = '老胡';
  3. public function action(Closure $act,string $name1){
  4. // 在类方法中访问类外部成员:变量,函数
  5. //$str = act();// 局部变量,非类属性
  6. //global $name1;
  7. //return $this->name . "和".$GLOBALS['name1'].$str;
  8. return $this->name ."和".$name1.$act();
  9. }
  10. // 在实际项目中,外部成员应该通过方法参数,注入到成员方法中,而不是在方法中直接调用
  11. }
  12. $act = function(){
  13. return '一起去搓澡';
  14. };
  15. $name1 ="胖子";
  16. // echo (new Users)->action();
  17. echo (new Users)->action($act,$name1);// 老胡和胖子一起去搓澡

三、final, self, $this关键字的使用

1.$this :特殊的对象引用 ,代表本对象,专门完成对象内部成员的访问
2.self 是类内部代替类名的关键字,可以用来在类内部完成静态成员的访问(类常量)以及在类内部实例化对象
3.final :加在类前,表示该类不能被继承加在方法前,表示该方法不能被重写

$this与final上下例子都有使用与注解,这里安排一下self

  1. //在内部实例化
  2. class credit{
  3. const CONSTANT ='con';
  4. private static $age = 18;
  5. static function getAge(){
  6. echo credit::$age.'<br>';//18
  7. echo self::$age.'<br>';//18
  8. echo self::CONSTANT.'<br>';//con
  9. }
  10. }
  11. // 外部使用类名访问
  12. credit::getAge();

访问静态

  1. // static 标识静态成员(方法,属性),静态成员只能由类来调用,为所有对象共享
  2. class User {
  3. public $name = "大哥";
  4. public $options = [1,2,3];
  5. public static $nation = "china";
  6. public $salary;// 抽象属性
  7. }
  8. $user = new User;
  9. // 访问静态成员 使用:: 范围解析符
  10. echo User::$nation;//china
  11. class myClass{
  12. public $age = 18;
  13. static $name = "刘亦菲";
  14. static $count;
  15. function __construct(){
  16. self::$count++;
  17. }
  18. public static function getCount(){
  19. return self::$count;
  20. }
  21. }
  22. // 对类中的静态属性进行初始化赋值 为0
  23. myClass::$count = 0;
  24. $myc = new myClass;
  25. // 访问静态成员的方法
  26. echo myClass::$count;
  27. echo myClass::getCount();
  28. //echo $myc->getCount(); 通过对象也可以访问静态成员方法

四、oop封装与继承

  1. <?php
  2. /**
  3. * 封装性
  4. */
  5. class User{
  6. //public 公共成员 , 类外部和内部都能访问
  7. public $name = '胡八一';
  8. //private 私有成员,仅限于本类中使用,外部和子类中是访问不到
  9. private $age = 30;
  10. //protected 受保护成员,除了外部不可见,内部和子类均可见
  11. protected $salary = 8000;
  12. public function write()
  13. {
  14. return "姓名{$this->name},年龄{$this->age},工资:{$this->salary}";
  15. }
  16. }
  17. //echo (new User)->age;//Cannot access private property User::$age
  18. //echo (new User)->salary;//Cannot access protected property User::$salary
  19. echo (new User)->name;
  20. echo (new User) -> write();
  21. //子类
  22. echo '<hr>';
  23. class Rob extends User
  24. {
  25. public function write()
  26. {
  27. return "姓名{$this->name},工资:{$this->salary}";
  28. }
  29. }
  1. <?php
  2. /**
  3. * 对象的继承与扩展
  4. *
  5. * final:加在类前,表示该类不能被继承
  6. * final :加在方法前,表示该方法不能被重写
  7. */
  8. class User{
  9. protected $salary = 8000;
  10. public function write()
  11. {
  12. return "工资:{$this->salary}";
  13. }
  14. }
  15. //子类
  16. class Rob extends User
  17. {
  18. //1.扩展
  19. //属性扩展
  20. protected $name = "胡歌";
  21. protected $age= 45;
  22. //方法扩展
  23. // public function write()
  24. // {
  25. // return parent::write(). ",age:{$this->age}";
  26. // }
  27. //2. 重写
  28. //属性重写
  29. protected $salary = 10000;
  30. //方法重写
  31. public function write()
  32. {
  33. return parent::write(). ",age:{$this->age}";
  34. }
  35. }
  36. echo (new Rob) -> write();

拓展:
__construct() 构造函数
1.构造函数实例化类的时候会自动调用,
2.子类没有构造函数,会直接调用父类的构造涵数, 继承父类的属性和方法
3.子类和父类都有构造函数,实例子类时不会自动调用父类构造函数,只会调用子类自己的构造函数。

耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
灭绝师太2020-12-07 17:56:251楼
胡同学对耦合性(Coupling)有了自己的见解,想必也理解,类与类之间耦合过深会对整个项目的维护造成麻烦, 所以使用oop设计程序的时候,一定要考虑怎样降低程序的耦合度~