和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序。因此学好面向对象输程对PHP程序员来说也是至关重要的。本章并针对面向对象编程在PIP语言中的使用进行详细讲解。

2.1 面向对象概述


面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。

提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现。使用的时候一一个个依次调用就可以了。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能。这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易维护。面向对象的特点主要可以概括为封装性、继承性和多态性。接下来针对这三种特性进行简单介绍。

1. 封装性

封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。例如,用户使用计算机,只需要使用手指蔽键盘就可以了,无领知道计算机内部是如何工作的,即使用户可能碳巧知道计算机的工作原理。但在使用时。也不会完全依赖计算机工作原理这些细节。

2.继承性

继承性主要描述的是类与类之间的关系,通过继承,可以在无须重新编写原有类的情况下,对原有类的功能进行扩展。例如,有一个汽车的类,该类中描述了汽车的普通特性和功能,面轿车的类中不仅应该包含汽车的特性和功能,还应该增加轿车特有的功能,这时。可

以让轿车类继承汽车类、在轿车类中单独漆加轿车特性的方法就可以了,继承不仅增强了代码的复用性 提高了程序开发效率而且为程序的修改补充提供了便利。

3.多态性

多态性指的是同一操作作用于不同的对象,会产生不同的执行结果。例如当听到Cout这个单词时,理发师的表现是剪发演员的行为表现是表演, 不同的对象,所表现的行为是不一样的

面向对象的编程思想博大精深,初学者仅仅靠文字介绍是不能完全理解的,必须通过大量的实践和思考,才能真正领悟。希望大家带着面向对象的思想来学习后续的课程,来不断加深对面向对象的理解

2.2 类与对象


面向对象的编星思想力图使程序对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,在面向对象的思想中提出了两个概 即类和对象。其中,类是对某类事物的拍象描述,而对象用于表示现实中该类事物的个体。

2.2.1类的定义 
在面向对象的思想中最核心的就是对象,为了在程序中创建对象,首先需要定义一个类类是对象的抽象,它用于描述一组对象的共同特征和行为。类中可以定义属性和方法,其中属性用于描述对象的特征。方法用于描述对象的行为。类的定又语法格式如下; 
class 类名{成员属性;成员方法;
}

上述语法格式中,class 表示定义类的关键字,通过该关键字就可以定又一个类。在类中直明的变量被称为成员属性,主要用于描述对象的特征,如人的姓名、年龄等。在类中声明的函数被称为成员方法,主要用于描述对象的行为,如人可以说话、走路等。
接下来通过一个案例来演示如何定义个类, 如例2-1所示。 
例2-1
<?php//定义一个Person类 class Person {public $name; public $age;public  function  speak(){echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>";}}
?>

例2-1中定义了一个类。其中,Person是类名,name和age是成员属性,speak()是成员方法。在成员方法spcak()中可以使用$this访向成员属性name和age.需要注意的是。  $this表示当前对象,这里是指Person类实例化后的具体对象。

2.2.2对象的创建

应用程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象。在PHP程序中可以使用NEW关键字来创建对象,具体格式如下:

$对象名=new类名([ 参数1,.参数2]);

上述语法格式中。“$对象名”表示一个对象的引用名称,通过这个引用就可以访问对象中的成员,其中$符号是固定写法,对象名是自定义的。new表示要创建一个新的对象。类名”表示新对象的类型。“[参数1.参数2]"中的参数是可选的。对象创建成功后。就可以通过“对象一>成员”的方式来访问类中的成员。名要注意的是,如果在创建对象时,不需要传递参数。则可以省路类名后面的括号,即“new类名:”。

接下来通过一个案例来演示如何创建Person类的实例对象。如例2-2所示

例2-2

<?php//定义一个Person类 class Person {public $name; public $age;public function  speak(){echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>";}}$p1=new Person();$p1->name = "张华";$p1->age = 10;$p1->speak();?>

运行结果

在例2-2中,定义了一个Person对象$pl.然后通过该对象为name和age属性赋值,井调用speak()方法。从运行结果可以看出,程序输出了$p1对象的姓名和年龄。

2.2.3类的封装

在例2-2中定义的Person类有两个属性 name和age.在为age赋值时。由于没有做限定,因此可以赋于任何值,甚至一个负数。然面,将年龄赋值为一个负数显然是不符合实际生活的为了防止这种情况出现,在设计一个类时,应该对成员交量的访问做出一些限定.不允许外界随意访问,此时就需要实现类的封装。

所谓类的封装是指在定又一个类时将类中的属性私有化,即使用pnvate关键字来修饰。私有化的属性只能在它所在类中技访问,为了能让外界访问私有属性。PHP提供了两种形式,接下来将针对这两种形式进行详细讲解

通过getxx()和setXxx()方法访问私有属性

在PHP程序中,为了可以访问私有属性。可以手动编写公有的geXxx()和setXxx()方法,其中,geXxx()方法用于获取属性值,setXxx()方法用于设置属性值。 接下来通过一个案例来演示这两个方法的使用,如例2-3所示

例2-3

<?php class Person {private $name;  private $age;   //定义getName()和setName()方法用于获取和设置$name属性public  function getName(){return $this->name;} public function setName($value){$this->name=$value;}//定义getAge()和setAge()方法用于获取和设置$age属性public function getAge(){return $this->age;} public  function setAge($value){if($value<0){echo "年龄不合法<br>";}else{$this->age=$value;}}}$p1=new Person();$p1->setName("张华");$p1->setAge(-10); echo "姓名:".$p1->getName()."<br>";echo "年龄:".$p1->getAge();
?>

运行结果

在例2-3的Person类中,使用prvate关键字将属性name和sge声明为私有,并对外界提供了公有的方法.其中getName()方法用于获取name属性的值.setName()方法用于设置name属性的值,同理,getAge()和 setAge()方法用于获取和设置age属性的值。在创建Person对象时。调用setAge()方法传入一个负数-10,在selAge()方法中对参数$value的值进行检查、由于当前传人的值小于0.因此会打印“年龄不合法”的信息,ase属性不会被赋值。

 通过_ _get()和_ _ set ()方法访问私有属性

上述形式在实现封装时,获取属性使用的都是手动编写的getXxx()和setXxx()方法,当一个类中有多个属性时,使用这种方式就会很麻烦。为此,PHP5中预定义了_ get()方法和_ set()方法其中get()方法 用于获取私有成员属性的属性值,set()方法用于为私有成员属性赋值,这个两个方法获取私有属性和设置私有属性时都是自动调用的  接下来通过一个案例2-4来演示这个方法的使用。

例2-4

<?php class Person {private $name; //将$name属性封装private $age;  //将$age属性封装//定义__get()方法用于获取Person的属性public function __get($property_name){echo "自动调用__get()方法获取属性值<br>";if(isset($this->$property_name)){return($this->$property_name);}else{return(NULL);}}//定义__set()方法用于设置Person的属性public function __set($property_name,$value){echo "自动调用__set()方法为属性赋值<br>";$this->$property_name=$value;}}$p1=new Person();$p1->name = "张华";$p1->age = 10; echo "姓名:".$p1->name."<br>";echo "年龄:".$p1->age;
?>

运行结果

在例2-4的Person类中,通过封装的形式定又了两个属性name和age,并提供了_get()和__set()方法,用于对属性的赋值和访问,从运行结果可以看出,通过__get()方法 和__ set()方法,实现了对私有属性的访同以及赋值功能并且程序会自动调用__ get()方法和_ _set()方法 . 

在PHP中,提供了三个访问修饰符public. protected 和pnvate.它们可以对类中成员的访问作出一些限制,具体如下:

public:公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问这个类的成员。如果类的成员没有指定访问修饰符,则默认为public.

protected: 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问,但是对于该类的子关可以对其访问、读写等。

pnvate: 私有修饰符,被定义为private 的成员,对于同一个关里的所有成员是可见的,即没有访问限制,但不允许该类外部的代码访问,对于该类的子类同样也不能访问。

需要注意的是,在PHP4中所有的属性都用关键字var声明,它的使用效果和使用public一样。因为考虑到向下兼容,PHPS 中保留了对var的支持。但会将var自动转换为pubic.

2.2.4 特殊的$this

对象一旦被创建,在对象的每个成员方法中都会存在个特殊的对象引用 "Sthis".它代表当前对象,用于完成对象内部成员之间的访问。其语法格式如F :
$this->属性名;
为了更好地理解$this的用法.接下来通过一个案例来演示如何使用$this访问对象内部的成员属性,如 例2-5所示 
 1  <?php2      //定义一个Person类 3      class Person {4          public $name; 5          public $age;6          public  function  speak(){7               echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>";8           }9      }
10      $p1=new Person();
11      $p1->name = "张华";
12     $p1->age = 10;
13      $p1->speak();
14      $p2=new Person();
15      $p2->name = "紫晴";
16      $p2->age = 13;
17     $p2->speak();
18 ?>

运行结果

在例2-5中.创建了Person类的两个实例对象$pI .$p2.然后通过这两个对象分别为name、age属性赋值,并调用speak()方法。从运行结果可以看出,当$p1 对象调用speak()方法时,会输出$pI对象的属性值,当$p2 对象调用speak()方法时,会输出$p2对象的属性值。因此,可以说明$this表示的是当前类的当前对象。

注意: $this 不能在类定义的外部使用,只能在类定义的方法中使用。$this在静态方法中不能使用 ,静态方法中也不应调用非静态方法。

转载于:https://www.cnblogs.com/Prinlily/p/9808526.html

浅谈PHP面向对象编程(二)相关推荐

  1. 浅谈JavaScript 面向对象编程[转]

    这周心血来潮,翻看了现在比较流行的几个 JS 脚本框架的底层代码,虽然是走马观花,但也受益良多,感叹先人们的伟大-- 感叹是为了缓解严肃的气氛并引出今天要讲的话题,"javascript 面 ...

  2. 浅谈PHP面向对象编程(二、基础知识)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  3. 浅谈PHP面向对象编程(九)

    9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...

  4. php面向对象静态常量,浅谈PHP面向对象编程(四、类常量和静态成员)

    4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...

  5. 浅谈对java编程思想的理解

    浅谈对java编程思想的理解 刚从学校毕业的时候,对于这种概念的理解少之又少 ,只是单纯的从事编码工作,理解也只是停留在对java基本概念的使用上,很局限!随后工作了快三年的时间里,自己不断的理解这种 ...

  6. 浅谈自考学习方法(二)

    自考的<管理经济学>从发给我们到晚上上课就一天的时间,米老师一位年近五十的老人仅用了两个的小时就读完了,并且没有任何的遗漏,课堂讲的依然妙趣横生,欢声笑语,短短两个小时的时间不禁让人惊叹, ...

  7. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  9. python采用函数式编程模式-浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

最新文章

  1. 自然语言处理(nlp)之词袋模型及句子相似度
  2. 【Asp.Net】得到http请求中的参数语句
  3. OOP设计模式[JAVA]——03职责链模式
  4. 格式化的盘要怎么恢复数据
  5. java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...
  6. 超级管理器Android,超级文件管理器app
  7. C#LeetCode刷题之#771-宝石与石头(Jewels and Stones)
  8. react 组件怎么公用_用 react 做一个跟随组件的 tooltip
  9. python中常用的函数有哪些_python里常用的函数类型
  10. 目标检测---利用labelimg制作自己的深度学习目标检测数据集
  11. 使用hightopo完成基本图元旋转和闪烁
  12. openSUSE 11.2 上试动Mono
  13. 最新正则表达式验证手机号和邮箱
  14. 126 删除邮件 服务器,网易126邮箱中的邮件莫名奇妙被删除
  15. 【车间调度】基于matlab帝国企鹅算法求解柔性车间调度问题【含Matlab源码 1991期】
  16. 垂直投影法分割验证码
  17. rotation的单位是角度
  18. 实战开发:新手小白如何用C++制作经典网游DNF
  19. linux 安装nodejs
  20. C语言程序设计教程(第三版)李凤霞 第一章课后习题答案

热门文章

  1. 信息奥赛课课通(C++)军训排队
  2. python和mysql数据类型对应,MySQL和Python交互的示例
  3. 解决ios下拍照自动旋转问题
  4. 谷歌搜索突显网站的ICO图标和网址
  5. 苹果手机数据转移到新手机_更换手机软件怎么转移到新手机上?手机便签软件怎么转移?...
  6. Oracle_11g_rac节点1正常,节点2长时间没有启动再次启动时无法启动_No asm libraries found in the system
  7. 会员注册短信接口被攻击,如何防刷?
  8. 通过IP地址和掩码计算地址范围(ipv4/ipv6)
  9. 小区自来水水质情况,扫二维码全知道
  10. 夸克APP端智能:文档关键点检测实践与应用