和一些面向对象的语言有所不同,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所示 
  <?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();
$p2=new Person();
$p2->name = "紫晴";
$p2->age = 13;
$p2->speak();
?>

运行结果

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

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

浅谈PHP面向对象编程(二、基础知识)的更多相关文章

  1. 浅谈:javascript的面向对象编程之基础知识的介绍

    在进入javascript的面对对象之前,我们先来介绍一下javascript的几个概念. 1.javascript的面向对象的基本概念 function aa(){ } /* * 这里的aa,在我们 ...

  2. php面向对象编程(oop)基础知识示例解释

    面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念 示例demo: <?php header(& ...

  3. 浅谈python面向对象编程和面向过程编程的区别

    面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...

  4. 浅谈PHP面向对象编程(九、设计模式)

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

  5. 浅谈PHP面向对象编程(五、继承)

    5.0 继承 5.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使许多事物之间形成一种关系体系 . 例如猫和狗都属于动物,程序中 ...

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

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

  7. 浅谈PHP面向对象编程(一、简介)

    传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...

  8. 浅谈C#网络编程(二)

    阅读目录: 异步IO 非阻塞式同步IO 基于回调的异步IO并发 异步IO 上篇提到用多线程处理多个阻塞同步IO而实现并发服务端,这种模式在连接数量比较小的时候非常适合,一旦连接过多,性能会急速下降. ...

  9. 浅谈PHP面向对象编程(八、多态)

    8.0  多态 在设计一个成员方法时,通常希望该方法具备一定的通用性.例如要实现一个动物叫的方法,由于每个动物的叫声是不同的,因此可以在方法中接收-个动物类型的参数的对象当传人猫类对象时就发出猫类的叫 ...

随机推荐

  1. 循环中的let和const声明

    一.循环中的let声明 每次循环的时候let声明都会创建一个新变量i,并将其初始化为i的当前值,所以循环内部创建的每个函数都能得到属于他们的i的副本. 最初的: for (var i = 0 ; i ...

  2. 2018秋C语言程序设计(初级)作业- 第3次作业

    7-1 找出最小值 #include<stdio.h> int main() { int min,i,n,count; scanf("%d",&n); for( ...

  3. ubuntu下mysql安装提供外网访问

    修改配置文件 1. sudo apt-get install mysql-server #安装mysql服务器 2. sudo apt-get install  mysql-client #安装mys ...

  4. silverlight——获取控件相对位置

    事出有因:页面中存在滚动条,然后点击页面按钮时会进行正确性检查,如果出错在控件的位置会出现提示信息,但由于滚动条的出现,有可能在非可视区域内的控件出了问题,但目前是看不见的,因此,考虑获得出问题控件的 ...

  5. Windows2012启动自动帐户登陆

    Win+R 启动 输入regedit  运行注册表 找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogo ...

  6. js生成guid(唯一标识码)

    在使用postman对接口进行测试的时候,有时候接口日志会要求写入随机标识码,这里我们可以使用js来生成. // Generate four random hex digits. function S ...

  7. BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

  8. HDU3047 Zjnu Stadium 【带权并查集】

    HDU3047 Zjnu Stadium Problem Description In 12th Zhejiang College Students Games 2007, there was a n ...

  9. MySQL数据库命名规范及约定

    一.[操作规范]1. 如无备注,则表中的第一个id字段一定是主键且为自动增长:2. 如无备注,则数值类型的字段请使用UNSIGNED属性:3. 如无备注,排序字段order_id在程序中默认使用降序排 ...

  10. .ncx文件剖析

    ncx文件是epub电子书的又一个核心文件,用于制作电子书的目录,其文件的命名通常为toc.ncx. ncx文件是一个XML文件,该标准由DAISY Consortium发布(参见http://www ...