浅谈PHP面向对象编程(二、基础知识)
和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序。因此学好面向对象输程对PHP程序员来说也是至关重要的。本章并针对面向对象输程在PIP语言中的使用进行详细讲解。
2.1 面向对象概述
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现。使用的时候一一个个依次调用就可以了。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能。这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易维护。面向对象的特点主要可以概括为封装性、继承性和多态性。接下来针对这三种特性进行简单介绍。
1. 封装性
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。例如,用户使用计算机,只需要使用手指蔽键盘就可以了,无领知道计算机内部是如何工作的,即使用户可能碳巧知道计算机的工作原理。但在使用时。也不会完全依赖计算机工作原理这些细节。
2.继承性
继承性主要描述的是类与类之间的关系,通过继承,可以在无须重新编写原有类的情况下,对原有类的功能进行扩展。例如,有一个汽车的类,该类中描述了汽车的普通特性和功能,面轿车的类中不仅应该包含汽车的特性和功能,还应该增加轿车特有的功能,这时。可
以让轿车类继承汽车类、在轿车类中单独漆加轿车特性的方法就可以了,继承不仅增强了代码的复用性 提高了程序开发效率而且为程序的修改补充提供了便利。
3.多态性
多态性指的是同一操作作用于不同的对象,会产生不同的执行结果。例如当听到Cout这个单词时,理发师的表现是剪发演员的行为表现是表演, 不同的对象,所表现的行为是不一样的
面向对象的编程思想博大精深,初学者仅仅靠文字介绍是不能完全理解的,必须通过大量的实践和思考,才能真正领悟。希望大家带着面向对象的思想来学习后续的课程,来不断加深对面向对象的理解
2.2 类与对象
面向对象的编星思想力图使程序对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,在面向对象的思想中提出了两个概 即类和对象。其中,类是对某类事物的拍象描述,而对象用于表示现实中该类事物的个体。
class 类名{
成员属性;
成员方法;
}
接下来通过一个案例来演示如何定义个类, 如例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;
?>
运行结果
在PHP中,提供了三个访问修饰符public. protected 和pnvate.它们可以对类中成员的访问作出一些限制,具体如下:
public:公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问这个类的成员。如果类的成员没有指定访问修饰符,则默认为public.
protected: 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问,但是对于该类的子关可以对其访问、读写等。
pnvate: 私有修饰符,被定义为private 的成员,对于同一个关里的所有成员是可见的,即没有访问限制,但不允许该类外部的代码访问,对于该类的子类同样也不能访问。
需要注意的是,在PHP4中所有的属性都用关键字var声明,它的使用效果和使用public一样。因为考虑到向下兼容,PHPS 中保留了对var的支持。但会将var自动转换为pubic.
2.2.4 特殊的$this
$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面向对象编程(二、基础知识)的更多相关文章
- 浅谈:javascript的面向对象编程之基础知识的介绍
在进入javascript的面对对象之前,我们先来介绍一下javascript的几个概念. 1.javascript的面向对象的基本概念 function aa(){ } /* * 这里的aa,在我们 ...
- php面向对象编程(oop)基础知识示例解释
面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念 示例demo: <?php header(& ...
- 浅谈python面向对象编程和面向过程编程的区别
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...
- 浅谈PHP面向对象编程(九、设计模式)
9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...
- 浅谈PHP面向对象编程(五、继承)
5.0 继承 5.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使许多事物之间形成一种关系体系 . 例如猫和狗都属于动物,程序中 ...
- 浅谈PHP面向对象编程(四、类常量和静态成员)
4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...
- 浅谈PHP面向对象编程(一、简介)
传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...
- 浅谈C#网络编程(二)
阅读目录: 异步IO 非阻塞式同步IO 基于回调的异步IO并发 异步IO 上篇提到用多线程处理多个阻塞同步IO而实现并发服务端,这种模式在连接数量比较小的时候非常适合,一旦连接过多,性能会急速下降. ...
- 浅谈PHP面向对象编程(八、多态)
8.0 多态 在设计一个成员方法时,通常希望该方法具备一定的通用性.例如要实现一个动物叫的方法,由于每个动物的叫声是不同的,因此可以在方法中接收-个动物类型的参数的对象当传人猫类对象时就发出猫类的叫 ...
随机推荐
- 【PL/SQL编程】数据类型说明
1. 数值类型 数值类型主要包括NUMBER.PLS_INTEGER.和BINARY_INTEGER 3种基本类型.NUMBER可以用来存储整数或浮点数,PLS_INTEGER和BINARY_INTE ...
- Spring核心概念(二)
IOC/DI IOC(控制反转):对象(组件)的创建由代码中转移到外部容器(XML,注解) . DI(依赖注入):当类A需要使用类B时,那么我们需要为类A的属性赋值类B的对象. 这种现象我们称为依赖注 ...
- 《gradle 用户指南中文版》 第一部分、关于Gradle
第一部分.关于Gradle 目录1.介绍1.1 关于本用户指南2.概述2.1 特性2.2 为什么选择Groovy? 上一页 | 目录 | 下一页
- TF随笔-7
求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]])>> ...
- python3精简笔记(二)——函数
函数 下面的地址可以查看函数: https://docs.python.org/3/library/functions.html 也可以在交互式命令行通过help()查看函数的帮助信息. 如: > ...
- allow-hotplug eth0 allow-hotplug error
/********************************************************************* * allow-hotplug eth0 error * ...
- nginx在使用proxy_pass的情况下开启error_page
error_page用于指定特定错误发生时要显示的url,但是如果请求经proxy_pass处理后,如何使error_page对upstream产生的错误进行处理呢? 方法很简单. 保持之前的erro ...
- Cannot setup mail box on Android
Error: “You don’t have permission to sync with this server” Solution: “You have 10 phone partnershi ...
- 每天一个linux命令(文件操作):【转载】find命令之xargs
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...
- stm32寄存器版学习笔记02 串口通信
stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...