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

很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 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),我们通过封装简化了使用和操作就像我们使用电视,手机一样一点都不复杂。

一篇好的入门教程应该

生动真实的例子。

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

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

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

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

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

  1. 51自学网AutoCAD2014室内设计 AutoCAD2009施工图教程 CAD布局及规范作图教程 室内手绘入门教程...

    我要自学网平面设计 计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程  我要自学网Excel函数应用教程 Excel VBA基础教程 ...

  2. 动漫人物透视教程,透视画法入门教程

    动漫人物透视教程,透视画法入门教程!今天分享的是有关动漫人物透视教程的资源,包含动漫人物透视教程教程.动漫人物透视教程图片素材两个部分,学习动漫人物透视教程的时候,一定要多练,下面开始咱们的动漫人物透 ...

  3. python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

  4. php laravel 入门教程,Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】...

    Laravel 5 系列入门教程(一)[最适合中国人的 Laravel 教程] 2015-3-7 / 阅读数:314392 / 分类: Laravel 十分建议学习 5.5,跟 5.0 比变化非常大. ...

  5. python scrapy 简单教程_python之scrapy入门教程

    看这篇文章的人,我假设你们都已经学会了python(派森),然后下面的知识都是python的扩展(框架). 在这篇入门教程中,我们假定你已经安装了Scrapy.如果你还没有安装,那么请参考安装指南. ...

  6. openlayers3教程详细_OpenLayers 3 入门教程

    OpenLayers 3 入门教程 摘要 OpenLayers 3对OpenLayers网络地图库进行了根本的重新设计.版本2虽然被广泛使用,但从JavaScript开发的早期发展阶段开始,已日益现实 ...

  7. python入门教程pdf免费_python入门教程pdf

    python入门教程pdf内容摘要 python入门教程pdf页符造成的空白页,龙岩英语教程,2.插上打印机电源线,2.插上电源插头,达德教程,2.茶包配合按.2.查看包着SIM的那张"大卡 ...

  8. 易百教程Oracle,SQLite快速入门教程

    这个SQLite快速入门教程教你如何有效地开始学习并使用SQLite.通过本教程的实践操作学习之后,相信你应该可以了解并能够熟练地使用SQLite了. 如果您一直在使用其他关系数据库管理系统,例如:M ...

  9. python爬虫教程下载-Python爬虫入门教程!手把手教会你爬取网页数据

    其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据.这里的"技术手段"就是网络爬虫.今天就给大家分享一篇爬虫基础知识 ...

  10. c语言入门教程文库,C语言入门教程(全集)课件

    C语言入门教程(全集)课件 01123364105 Y N p AB X=0? YN P1 A A P2 a a b b Y Y N N y n A B P A A B X=0? 3 a97 3 U ...

最新文章

  1. elasticsearch 安装
  2. Git log、diff、config 进阶
  3. python【力扣LeetCode算法题库】169-多数元素
  4. 用户自定义的标识符的一些注意事项
  5. python必学_Python必学框架
  6. 为什么使用Deque而不使用Stack构造栈
  7. 计算机如何学会自动构图?
  8. sudo apt-get update 与upgrade的用法
  9. 并行DA实验c语言程序,求助怎么把两个单片机c语言程序结合在一起?大一期末实验...
  10. git中使用emacs和vimdiff/Ediff工具
  11. Windows10从 微软商店 安装 linux(ubuntu)
  12. 大量数据表的优化方案
  13. 【转载】django-数据库[ 配置 ]
  14. CityEngine -俯视图
  15. poj 3295 Tautology 构造法
  16. Scroll View控制菜单栏的伸缩
  17. GPD8106B设计方案|USB音频解码方案|USB耳机方案|USB麦克风方案|代理商现货
  18. 学3DMAX主要就业方向是什么?
  19. 圣诞节来了,用Python Turtle画棵圣诞树吧
  20. Chapter3.2 实现多个PLAYS

热门文章

  1. 问题解决:QtCreator屏蔽指定警告:如C4819等
  2. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 10丨买下所有产品的客户【难度中等】
  3. Spring Data JPA 从入门到精通~@NamedQueries预定义查询
  4. linux用户组登录,linux用户和用户组
  5. android animatorset 监听,Android源码分析--动画框架AnimatorSet
  6. php strpo函数,php strpos函数有什么用
  7. wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测
  8. 小心使用tf.image.resize_images,填坑经验分享给你
  9. 顶级程序员的心得 Coders at Work (II)
  10. 软件工程 敏捷的酒后问答