php class类 教程,PHP类(Class)入门教程第2/2页

用正确的小汽车对象学习和熟悉类的概念

很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 set_color()函数来教人。实在是白白糟踏了好东西。今天在phpx.com又看到一个受害者,忍不住花了两个小时写了这个教程。

闲话少说,我们来正经的,我们的小车可不是随便让人图图颜色就完了(只能图颜色的是废车)。我们的这个小车不但能够到处乱跑,而且装备了高级GPS全球定位系统,油表,里程表。由于使用了面向对象的技术,驾驭这样的一部小汽车一点都不难。

举例子首先要提供一些背景材料。我们有一辆小汽车,可以在一个拥有xy坐标的地图上按照东南西北方向任意的行驶,你可以设定小车行驶的方向和距离,小车会向你汇报它的坐标位置。

其实学习类应该和我们学习其它事物一样,从学习使用开始,然后再学习他的原理。所以我们先来熟悉一下如何正确驾驶这样的一个小汽车:

$startPoint = & new Position(3,9); //初始一个出发点坐标x=3,y=9

$myCar = & new Car(500,$startPoint); //我得到一个新的小车,新车初始燃油 500 升,出发地点$startPoint。

$myCar->setHeading('s'); //给小车设定方向 s:南方 n:北方 w:西方 e:东方。

if($myCar->run(100)) //然后让小车跑100公里,如果顺利完成任务显示燃油量。如果半途而废,我们显示警报信息。

{

print('小车一切正常,目前还有燃油:'.$myCar->getGas().'');//获得燃油数

}

else

{

print('小车出问题了: '.$myCar->getWarning().'');//显示警报信息

}

$myPosition=$myCar->getPosition();//获得小车当前的位置

print('
我的小车现在
X:'.$myPosition->getX().'Y:'.$myPosition->getY());//显示小车的坐标位置

?>

先给自己制造一个小汽车,并且给他装备上一个定位对象 Position。 然后设定方向, 然后让小车奔跑。 最后检查并输出小车的方位。 复杂么?很难理解吗? 虽然这里我们用到了两个对象(类):Car 和 Position 但是我相信即使是初学者也不会觉得上面的代码很困难。

我们学会如何开车了以后,再来仔细看一看这个小车对象是怎样工作的。定义一个对象其实很简单只需要 用一个关键字class 和一对{}就可以了,所以我们这样定义这两个对象:

class Car {}

class Position{}

当然,仅仅这样的两个类什么也做不了,我们还需要给他们增加一些功能,先从小汽车开始,我们需要能够给小车设定方向并且让小车奔跑所以我们增加两个方法,也就是2个函数只不过这两个函数包含在小车对象内只有通过小车对象才可以使用。

setHeading()

run()

class Car

{

function setHeading($direction)

{

}

function run($km)

{

}

}

特别提示:设计一个良好的类的窍门是从如何使用它下手,也就是说先考虑这个对象应当有哪些方法,而不是先确定它有哪些属性。

为了更好的了解小车的状况我们还需要这些方法:

getGas() 获得小车当前的燃油数

getPosition() 获得小车当前的位置

getWarning() 警报信息

为了完成这些功能我们的小车还需要自己的油表,警报消息,和定位仪。我们把这些也添加到 Car 类中,同时我们还给这个类增加了一个初始化的函数 这个函数名字和类的名字一样,这样就有了一个大体的框架。

class Car

{

/**

* 小车的汽油量

*

*@var

*@access

*/

var $gas;

/**

* 里程记录

*

*@var

*@access

*/

var $meter;

/**

* 车的位置(由GPS自动控制)

*

*@var Object position

*@access private

*/

var $position;

/**

* 发动机每1公里耗油量,这个车是0.1升

*

*@var Integer

*@access private

*/

var $engine=0.1;

/**

* 警报信息

*

*@var

*@access

*/

var $warning;

/**

小车的初始化。新车出场当然要

1、加汽油。

2、里程表归零。

3、清除警报信息。

4、设定出发位置。

*/

function Car($gas,&$position)

{

$this->gas= $gas; //加汽油

$this->meter = 0;

$this->warning =''; //清除警报信息

$this->position = $position; //设定出发位置

}

function getWarning() //返回警报信息

{

return $this->warning;

}

function getGas() //返回汽油表指数

{

return $this->gas;

}

function &getPosition()

{

return $this->position; //返回当前小车的位置

}

function setHeading($direction='e')

{

}

/**

* 开动小汽车

*@access public

*@param INT 公里数

*/

function run($km)

{

}

}

?>

这时候最关键的两个方法 setHeading 和 run 就变得简单了,由于小车装备了 Position 对象 $this->position, 所以关于坐标定位的事情它也不用管了, 交给 Position 对象好了, 他自己只要管理好自己的油表,里程表就可以了。完成以后的 Car 类变成这个样子了:

class Car

{

/**

* 小车的汽油量

*

*@var

*@access

*/

var $gas;

/**

* 里程记录

*

*@var

*@access

*/

var $meter;

/**

* 车的位置(由GPS自动控制)

*

*@var Object position

*@access private

*/

var $position;

/**

* 发动机每1公里耗油量,这个车是0.1升

*

*@var Integer

*@access private

*/

var $engine=0.1;

/**

* 警报信息

*

*@var

*@access

*/

var $warning;

/**

小车的初始化。新车出场当然要

1、加满汽油。

2、里程表归零。

3、清除警报信息。

4、设定出发位置。

*/

function Car($gas,&$position)

{

$this->gas= $gas; //加满汽油

$this->meter = 0;

$this->warning =''; //清除警报信息

$this->position = $position; //设定初始位置

}

function getWarning() //返回警报信息

{

return $this->warning;

}

function getGas() //返回汽油表指数

{

return $this->gas;

}

function &getPosition()

{

return $this->position; //返回当前小车的位置

}

function setHeading($direction='e')

{

$this->position->setDirection($direction); //因为使用了Position 对象,小汽车不需要自己来操心XY坐标值了,交给Position 对象吧。

}

/**

* 开动小汽车

*@access public

*@param INT 公里数

*/

function run($km)

{

$goodRunFlag = true;//是否成功完成任务。

$maxDistance = $this->gas/$this->engine; //小车能够跑的最大距离。

if(($maxDistance)

{

$this->warning = '没有汽油了!';//设定警告信息,能跑多远就跑多远吧。

$goodRunFlag = false;//但是任务肯定完成不了。

}

else

{

$maxDistance=$km; //没有问题,完成任务以后就可以停下来休息了。

}

$this->position->move($maxDistance);//在坐标上移动由Position对象来完成,小汽车只要负责自己的油耗和公里表就可以了。

$this->gas -= $maxDistance*$this->engine;//消耗汽油

$this->meter += $maxDistance; //增加公里表计数

return $goodRunFlag;

}

}

?>

讲到这里我想我的这篇文章也该结束了。别着急,我当然还记得 Position 类还没有完成,但是有了上面小汽车的例子 Position 应该就非常简单了, 如果你理解了这个小汽车的类, 现在就是你一展身手的时候了, 你来完成这个Position 对象吧, 我相信你能够完成它(其实这正是面向对象和封装的美妙之处)。你需要记住先从Position 的方法开始设计比如:

getX()

getY()

move()

setDirection()

所谓类就是指某一类的事物,它可以是具体的(Car)也可以是抽象的(Position),我们通过封装简化了使用和操作就像我们使用电视,手机一样一点都不复杂。

一篇好的入门教程应该

生动真实的例子。

不但提供了正确的概念,在变量和函数命名,函数封装和调用上也值的学习。

即便你熟悉了面向对象编程以后也不会认为当初的例子有什么不妥之处。

如果你读完教程动手的话一定能够深刻体会到教程的美妙之处,大大减少了走弯路的机会。

好的代码是可以被人像书一样读懂,你认为呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 控制器 模板,php学习笔记(一)php模板与控制器

/welcome/index.phpif(!isset($_REQUEST[fn])){include from.html.php;}else{$firstname $_REQUEST[fn];$lastname $_REQUEST[lastname];if($firstname 孙 and $lastname 哥){$aa 欢迎登陆,我的国王!;}else{$aa 欢迎登陆 .htmlspecialchars($first…

android jni java调用c,Android与JNI(一) ---- Java调用C 静态调用

第一、通过eclipse新建一个工程名为HelloJni的android工程,并编译。第二、右键工程-->Android Tools --> Add Native Support,出现如下界面,名字默认就可以了,点击finish。第三、我们在MainActivity类中加入要调用的native代码public n…

ocid oracle,Oracle数据库基础:新手推荐

Oracle数据库的主要特点(1.)支持多用户,大事务量的事务处理(2.)在保持数据库安全性和完整性方面性优越。(3.)支持分布式数据处理。将分布在不同物理位置的数据库用通信网连接起来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库…

oracle存储过程 取时间格式,Oracle存储过程获取YYYY-MM-DD的时间格式

环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求。 SQLgt; select sysdate fro环境:Oracle 10g,11g问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不…

oracle归档日志 delete obsolete 保留一次全备,DELETE OBSOLETE不删除归档日志以及归档的备份集...

今天遇到一个奇怪的事情,使用OBSOLETE不删除归档日志,而且也不删除过期的归档的BACKUP SET从delete obsolete的概念来看如下:The REPORT OBSOLETE and DELETE OBSOLETE commands work in two steps:For each datafile for which there are fu…

oracle 12 sqlplus 使用,oracle 12.2 sqlplus history

12.1开始使用sqlplus显示用户上次登录时间,12.2提供了一个记录历史sql的功能,类似于操作系统的history,根目录下的.history文件,不过功能比操作系统的history要强大,可以指定删除/运行/编辑历史记录里面的某一条SQL&am…

execl执行linux命令,使用execl运行Linux命令

我需要通过编写C语言程序列出当前目录中具有644权限的所有文件.我不能使用system()并且必须使用execl()才能使用系统调用.这是我在代码中使用的一行:execl("/usr/bin/find", "find . -maxdepth 1 -perm 644", (char *)NULL);问题是代码正在搜索…

Linux里面lvs的基础命令,Linux中使用ipvsadm配置LVS集群的基本方法

LVS集群有DR、TUN、NAT三种配置模式,可以对www服务、FTP服务、MAIL服务等做负载均衡,下面通过搭建www服务的负载均衡实例,讲述基于DR模式的LVS集群配置。一、 Director Server的配置  在Director Server上配置LVS负载均衡集群,有…

linux 内核 睡眠,linux内核对S3C2410睡眠模式的支持有哪些?

一、S3C2410支持4种供电模式(1)NORMAL MODE耗电最大、可以通过关闭具体控制器的时钟来节电(2)SLOW MODE在此模式下可以没有内部PLL,耗电情况依赖于外部时钟的频率(3)IDLE MODEFCLK被关断,主要由于CPU core节电。可以任何通过外部中断唤醒(4)Power_OFF MO…

linux c timeval 转化为标准时间,Linux_学习笔记_-_时钟_定时器

Linux 时钟_定时器1 时钟时钟这个东西,实际上是作为一种工具而存在,内核通过时钟来感知、管理时间。这里的时钟,更主要的还是软件上的概念,系统通过维护软件时钟来追踪时间1.1 几个概念1、时钟中断:由硬件产生的电信号…

linux 修改块大小,linux 查看及修改os系统块的大小

查看os系统块的大小[root]# /sbin/tune2fs -l /dev/sda1查看os系统页的大小[oracleskate-test ~]$ getconf PAGESIZE4096修改块的大小:创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性…

linux的vim多选择,真的有(很多)linux大牛用vim写项目吗?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼作为一名非程序员半吊子运维,很想问一个问题:真的有(很多)linux大牛用vim写项目吗?最近折腾自己的路由器,要在LEDE的luci框架里加个显示interface信息的模块。按照惯例ggl一下最后在s…

linux spi驱动分析 三,Linux下SPI驱动分析

/* 神奇的分割线 */626/*-------------------------------------------------------------------------*/627628/* Core methods for SPI master protocol drivers. Some of the629 * other core methods are currently defined as inline functions.630 */631632/**633 * spi_…

c语言程序综合实习学生成绩,C语言程序设计综合实习报告

课题一:用指针优化学生成绩排名一、目的1.熟悉变量的指针和指向变量的的指针变量的概念和使用2.熟悉数组的指针和指向数组的的指针变量的概念和使用3. 掌握冒泡法或选择法排序的算法4. 掌握函数的定义、调用、声明,以及参数的两种…

c语言练习的软件,我想学C语言,在自己的电脑上练习,要安装什么软件呢?

希望能对你有所帮助:1。 C语言学习系统 3。2C语言是一门非常有用高级语言,是您踏上计算机学习之路的必修课,几乎所有的计算机考试dl。pconline。com。cn/html/1/9/dlid6199&dltypeid1&pn0&。html2。 C语言学习系统 3。2C语言是一门非常有用高级语言,是您…

c语言ATM机文件储存账号密码,C语言实现_ATM自动取款机系统

1、欢迎界面的实现用函数welcom实现,建立.h文件命名welcom.hvoid wel()//欢迎界面;{FILE *fp;if((fpfopen("data/welcome.txt","r"))!NULL){char ch[10000];while(!feof(fp)){fgets(ch,100,fp);printf(ch);Sleep(200);}printf("…

c语言求最多啤酒数,C语言,算法、动态规划:有一个箱子的容量为v(正整数,0=v=20000),同时有n个物品(0n=30),...

满意答案24k纯真爱l2013.11.07采纳率:42% 等级:12已帮助:9552人#include#define N 30int xiangzi(int n ,int V ,int a[]) //楼主后面的Vo数组必须放进递归函数里面或定义成全局数组 另外h[n]什么情况??{int minv,t,mV;if(n0){if(a[n]&l…

c语言休眠函数useconds类型,带你了解C语言中的Sleep函数(附代码)

Sleep函数:功 能: 执行挂起一段时间用 法:unsigned sleep(unsigned seconds);注意:在VC中使用带上头文件#include ,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include 在VC中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写&…

2017电大c语言考试时间,2017年电大 《c语言程序设计》a课程考核说明.doc

2017年电大 《c语言程序设计》a课程考核说明中央广播电视大学计算机科学与技术专业C语言程序设计A课程考核说明(2008)一、考核说明《C语言程序设计》课程是全国电大系统计算机科学与技术专业(本科)的一门基础必修课程。本课程是学习数据结构、操作系统、计算机网络、数据库、软…

c语言可循环计算器代码,可编程简易计算器(代码)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼while(sign[0]!a){//if(input[index]){for(int i0;i<4;i){if(firsttime 1)i3;//提取第i1个数字dexto1;char num_str[INPUT_LEN]{};while(input[index]){if(isdigit(input[index]))num_str[dexto]input[index];elseif((input[ind…