源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 376|回复: 27

[PHP编程] PHP类(Class)入门教程第1/2页

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2009-8-26 01:14:05 | 显示全部楼层 |阅读模式
对类的摸索~~俺用了半年时间才大概理解类的作用和实现。主要是没有一篇能让我理解的文章(之前没接触过任何OO的东西)。 以我的观点来说说PHP中的Class,用于表达的语言都是非正式的语言,也不能确定是否正确。

建立一个类很简单。
复制代码 代码如下:
<?php
class my_class{}
?>

类到底干什么呢?很多人都说是什么黑匣子,我在这里称它为一个独立的整体。我们只知道类名,而不知道里面有什么东西。那么,该如何使用这个类呢?
首先:要知道它里面是否定义了公共的变量--专业术语上称它为“属性”。
其次:要知道它里面定义了什么函数--专业术语中称它为“方法”。
我都被这些专业术语搞糊涂了,所以干脆不理它了。

类中的如何定义公共变量,它有什么作用呢?

很简单,我们来扩充 my_class 类
复制代码 代码如下:
<?php
class my_class
{
var $username;
}
?>

看上面很简单,我们定义了一个公共的变量,只是用 var+空格+普通变量名 构成。它有什么用呢?考虑一下函数中,如果我们要访问函数外的变量,是不是要先 global 一下呢?这个想实现的效果也是如此,它是想让这个类中的所有函数都能访问它,而它区别于函数的一个地方,是类的外部也可以访问这个变量,我随后再讲外部如何访问它。还有一个区别,不能用复杂的语句给这个变量赋值(具体的等理解了类以后自己去看规则)。给它一个默认值
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
}
?>

OK,定义了一个公共的变量了,接下来定义一个函数(也就是所谓的“方法”)。
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";

function show_username()
{
//函数:方法->要实现的效果
}
}
?>

这个定义函数跟普通的定义函数形式上没什么区别了。简单就好,定义一个打印 $username 的函数:
复制代码 代码如下:
<?php

class my_class
{
var $username="深空";
function show_username($username)
{
//打印
echo $username;
}
}

?>

到这里可能某些人开始迷糊了,呵呵,最关键的就是这里了,看清楚了。现在有三个 $username 了。到底哪个是哪个啊~~
函数所带的行参,不用解释了吧?这个函数功能就是打印行参所接收的值,也就是如果:
复制代码 代码如下:
<?php
show_username("猪头深空");
?>

那么它将打印 “猪头深空” ,就这么简单。
怎么样访问这个函数?肯定不是我上面说的那样直接 show_username(”猪头深空”); 了,别急,类有类的一套。如下:
复制代码 代码如下:
<?php
$Name=new my_class();
?>

这样就初始化上面的那个 my_class 的类了,并把这个对象赋给变量 $Name ,你可以这样理解,这个变量就代表整个类了,呵呵。
使用类中的函数:
复制代码 代码如下:
<?php
$Name->show_username("猪头深空");
?>

晕了,为什么这么复杂?还要箭头?其实很形象的。本来已经把类给了变量 $Name 了是吧?也就是 $Name 代表了这个类,然后用一个箭头指向类中的 show_username 这个函数。就是这么简单,也就是说,这个函数是这个类中的,而不是其他的函数--你就理解为表示一个区别吧,呵呵。
试试看哦,打印出 “猪头深空” 这四个字了。你说为什么要这么复杂?用函数不是也能实现么?我说,这么简单的你当然看不出好处了,我们继续扩充。
还有一个疑问:刚才说的“公共的变量”怎么一点用处都没有呢?为什么这个函数不会自动接收这个公共变量 var $username 中的默认值?也就是如果我使用:
复制代码 代码如下:
<?php
$Name->show_username($username);
?>

会有什么结果呢?答案是没有任何输出。因为你没有给形参 $username 一个值。那么该怎么使用这个公共的变量?
我们来修改一下这个类:
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
}
?>

哇靠,不是吧,这回脸形参都没有了?还多了一个$this->,晕了不是,呵呵。其实这也是类的一个最大的方便之处。
$this 的作用:访问一个公共的变量,或者类里面的函数。
访问?这么专业?其实就是用 $this->username 来代替 var $username 而已拉,$this 用来说明它是公共的。可以访问的,函数外部的东西。
试试看:
复制代码 代码如下:
<?php
$Name->show_username();
?>

看到了吧,终于打印 “深空” 这两个字了,娃哈哈。
我不打印“深空”这两个字,我要打印“猪头深空”,怎么办?很简单,我们给这个公共变量重新赋值拉。服了你了。
复制代码 代码如下:
<?php
$Name->username="猪头深空";
?>

这个能明白意思么?$Name->username 表示的是类里面的这个公共变量。等号赋值不用我解释了。
我们再来打印看看
复制代码 代码如下:
<?php
$Name->show_username();
?>

哈哈,终于打印“猪头深空”了。不错吧,很方便吧,不用形参也能任意修改打印值哦~~。
不过单单打印一个名称也太没意思了,我们说点欢迎的话吧,来扩充一下这个类,创建一个名叫 Welcome 的函数:
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
function Welcome()
{
}
}
?>

恩,实现什么功能好呢?简单点吧,就实现在名字前面有 “欢迎” 两个字好了
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
function Welcome()
{
echo "欢迎";
$this->show_username();
}
}
?>

第二次看到 $this 了吧?$this->show_username(); 干什么用呢?其实它就是调用 show_username 这个函数,用 $this 来表示这个函数在类中并且和 Welcome 函数平行,而不是在其他地方(比如Welcome函数中)。
Welcome 函数实现的功能很简单,首先打印两个字”欢迎”,然后接下去执行 show_username 函数,打印名字。
来试试这个函数吧:
复制代码 代码如下:
<?php
$Name->Welcome();
?>

看到了吧,打印出“欢迎深空”这四个字了。
可是我要打印“欢迎猪头深空”,怎么办?我服了你了,我们给公共变量 var $username 一个值吧:
复制代码 代码如下:
<?php
$Name->username="猪头深空";
?>

接下去打印欢迎语:
复制代码 代码如下:
<?php
$Name->Welcome();
?>

嘿嘿,终于打印“欢迎猪头深空”了。
怎么样?明白了类的用法了么?好处在于能够调用类中的任意函数,只要用 $this 指出来,可以改变一个公共变量的值,可以在类中的函数中使用这个公共变量。………多了去了,它的应用等待你去发现了。
下面是一篇很早的文章了,建议大家也可以看看。
对类的摸索~~俺用了半年时间才大概理解类的作用和实现。主要是没有一篇能让我理解的文章(之前没接触过任何OO的东西)。
用正确的小汽车对象学习和熟悉类的概念
很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 set_color()函数来教人。实在是白白糟踏了好东西。今天在phpx.com又看到一个受害者,忍不住花了两个小时写了这个教程。
闲话少说,我们来正经的,我们的小车可不是随便让人图图颜色就完了(只能图颜色的是废车)。我们的这个小车不但能够到处乱跑,而且装备了高级GPS全球定位系统,油表,里程表。由于使用了面向对象的技术,驾驭这样的一部小汽车一点都不难。
举例子首先要提供一些背景材料。我们有一辆小汽车,可以在一个拥有xy坐标的地图上按照东南西北方向任意的行驶,你可以设定小车行驶的方向和距离,小车会向你汇报它的坐标位置。
其实学习类应该和我们学习其它事物一样,从学习使用开始,然后再学习他的原理。所以我们先来熟悉一下如何正确驾驶这样的一个小汽车:
复制代码 代码如下:
<?php
$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('<br><b>小车一切正常,目前还有燃油:'.$myCar->getGas().'</b>');//获得燃油数
}
else
{
print('<br><b>小车出问题了: '.$myCar->getWarning().'</b>');//显示警报信息
}
$myPosition=$myCar->getPosition();//获得小车当前的位置
print('<br>我的小车现在<br> 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 类中,同时我们还给这个类增加了一个初始化的函数 这个函数名字和类的名字一样,这样就有了一个大体的框架。
复制代码 代码如下:
<?php
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 类变成这个样子了:
复制代码 代码如下:
<?php
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)<$km)
{
$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),我们通过封装简化了使用和操作就像我们使用电视,手机一样一点都不复杂。
一篇好的入门教程应该
生动真实的例子。
不但提供了正确的概念,在变量和函数命名,函数封装和调用上也值的学习。
即便你熟悉了面向对象编程以后也不会认为当初的例子有什么不妥之处。
如果你读完教程动手的话一定能够深刻体会到教程的美妙之处,大大减少了走弯路的机会。
好的代码是可以被人像书一样读懂,你认为呢? 对类的摸索~~俺用了半年时间才大概理解类的作用和实现。主要是没有一篇能让我理解的文章(之前没接触过任何OO的东西)。 以我的观点来说说PHP中的Class,用于表达的语言都是非正式的语言,也不能确定是否正确。

建立一个类很简单。
复制代码 代码如下:
<?php
class my_class{}
?>

类到底干什么呢?很多人都说是什么黑匣子,我在这里称它为一个独立的整体。我们只知道类名,而不知道里面有什么东西。那么,该如何使用这个类呢?
首先:要知道它里面是否定义了公共的变量--专业术语上称它为“属性”。
其次:要知道它里面定义了什么函数--专业术语中称它为“方法”。
我都被这些专业术语搞糊涂了,所以干脆不理它了。

类中的如何定义公共变量,它有什么作用呢?

很简单,我们来扩充 my_class 类
复制代码 代码如下:
<?php
class my_class
{
var $username;
}
?>

看上面很简单,我们定义了一个公共的变量,只是用 var+空格+普通变量名 构成。它有什么用呢?考虑一下函数中,如果我们要访问函数外的变量,是不是要先 global 一下呢?这个想实现的效果也是如此,它是想让这个类中的所有函数都能访问它,而它区别于函数的一个地方,是类的外部也可以访问这个变量,我随后再讲外部如何访问它。还有一个区别,不能用复杂的语句给这个变量赋值(具体的等理解了类以后自己去看规则)。给它一个默认值
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
}
?>

OK,定义了一个公共的变量了,接下来定义一个函数(也就是所谓的“方法”)。
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";

function show_username()
{
//函数:方法->要实现的效果
}
}
?>

这个定义函数跟普通的定义函数形式上没什么区别了。简单就好,定义一个打印 $username 的函数:
复制代码 代码如下:
<?php

class my_class
{
var $username="深空";
function show_username($username)
{
//打印
echo $username;
}
}

?>

到这里可能某些人开始迷糊了,呵呵,最关键的就是这里了,看清楚了。现在有三个 $username 了。到底哪个是哪个啊~~
函数所带的行参,不用解释了吧?这个函数功能就是打印行参所接收的值,也就是如果:
复制代码 代码如下:
<?php
show_username("猪头深空");
?>

那么它将打印 “猪头深空” ,就这么简单。
怎么样访问这个函数?肯定不是我上面说的那样直接 show_username(”猪头深空”); 了,别急,类有类的一套。如下:
复制代码 代码如下:
<?php
$Name=new my_class();
?>

这样就初始化上面的那个 my_class 的类了,并把这个对象赋给变量 $Name ,你可以这样理解,这个变量就代表整个类了,呵呵。
使用类中的函数:
复制代码 代码如下:
<?php
$Name->show_username("猪头深空");
?>

晕了,为什么这么复杂?还要箭头?其实很形象的。本来已经把类给了变量 $Name 了是吧?也就是 $Name 代表了这个类,然后用一个箭头指向类中的 show_username 这个函数。就是这么简单,也就是说,这个函数是这个类中的,而不是其他的函数--你就理解为表示一个区别吧,呵呵。
试试看哦,打印出 “猪头深空” 这四个字了。你说为什么要这么复杂?用函数不是也能实现么?我说,这么简单的你当然看不出好处了,我们继续扩充。
还有一个疑问:刚才说的“公共的变量”怎么一点用处都没有呢?为什么这个函数不会自动接收这个公共变量 var $username 中的默认值?也就是如果我使用:
复制代码 代码如下:
<?php
$Name->show_username($username);
?>

会有什么结果呢?答案是没有任何输出。因为你没有给形参 $username 一个值。那么该怎么使用这个公共的变量?
我们来修改一下这个类:
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
}
?>

哇靠,不是吧,这回脸形参都没有了?还多了一个$this->,晕了不是,呵呵。其实这也是类的一个最大的方便之处。
$this 的作用:访问一个公共的变量,或者类里面的函数。
访问?这么专业?其实就是用 $this->username 来代替 var $username 而已拉,$this 用来说明它是公共的。可以访问的,函数外部的东西。
试试看:
复制代码 代码如下:
<?php
$Name->show_username();
?>

看到了吧,终于打印 “深空” 这两个字了,娃哈哈。
我不打印“深空”这两个字,我要打印“猪头深空”,怎么办?很简单,我们给这个公共变量重新赋值拉。服了你了。
复制代码 代码如下:
<?php
$Name->username="猪头深空";
?>

这个能明白意思么?$Name->username 表示的是类里面的这个公共变量。等号赋值不用我解释了。
我们再来打印看看
复制代码 代码如下:
<?php
$Name->show_username();
?>

哈哈,终于打印“猪头深空”了。不错吧,很方便吧,不用形参也能任意修改打印值哦~~。
不过单单打印一个名称也太没意思了,我们说点欢迎的话吧,来扩充一下这个类,创建一个名叫 Welcome 的函数:
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
function Welcome()
{
}
}
?>

恩,实现什么功能好呢?简单点吧,就实现在名字前面有 “欢迎” 两个字好了
复制代码 代码如下:
<?php
class my_class
{
var $username="深空";
function show_username()
{
echo $this->username;
}
function Welcome()
{
echo "欢迎";
$this->show_username();
}
}
?>

第二次看到 $this 了吧?$this->show_username(); 干什么用呢?其实它就是调用 show_username 这个函数,用 $this 来表示这个函数在类中并且和 Welcome 函数平行,而不是在其他地方(比如Welcome函数中)。
Welcome 函数实现的功能很简单,首先打印两个字”欢迎”,然后接下去执行 show_username 函数,打印名字。
来试试这个函数吧:
复制代码 代码如下:
<?php
$Name->Welcome();
?>

看到了吧,打印出“欢迎深空”这四个字了。
可是我要打印“欢迎猪头深空”,怎么办?我服了你了,我们给公共变量 var $username 一个值吧:
复制代码 代码如下:
<?php
$Name->username="猪头深空";
?>

接下去打印欢迎语:
复制代码 代码如下:
<?php
$Name->Welcome();
?>

嘿嘿,终于打印“欢迎猪头深空”了。
怎么样?明白了类的用法了么?好处在于能够调用类中的任意函数,只要用 $this 指出来,可以改变一个公共变量的值,可以在类中的函数中使用这个公共变量。………多了去了,它的应用等待你去发现了。
下面是一篇很早的文章了,建议大家也可以看看。

用正确的小汽车对象学习和熟悉类的概念
很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 set_color()函数来教人。实在是白白糟踏了好东西。今天在phpx.com又看到一个受害者,忍不住花了两个小时写了这个教程。
闲话少说,我们来正经的,我们的小车可不是随便让人图图颜色就完了(只能图颜色的是废车)。我们的这个小车不但能够到处乱跑,而且装备了高级GPS全球定位系统,油表,里程表。由于使用了面向对象的技术,驾驭这样的一部小汽车一点都不难。
举例子首先要提供一些背景材料。我们有一辆小汽车,可以在一个拥有xy坐标的地图上按照东南西北方向任意的行驶,你可以设定小车行驶的方向和距离,小车会向你汇报它的坐标位置。
其实学习类应该和我们学习其它事物一样,从学习使用开始,然后再学习他的原理。所以我们先来熟悉一下如何正确驾驶这样的一个小汽车:
复制代码 代码如下:
<?php
$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('<br><b>小车一切正常,目前还有燃油:'.$myCar->getGas().'</b>');//获得燃油数
}
else
{
print('<br><b>小车出问题了: '.$myCar->getWarning().'</b>');//显示警报信息
}
$myPosition=$myCar->getPosition();//获得小车当前的位置
print('<br>我的小车现在<br> 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 类中,同时我们还给这个类增加了一个初始化的函数 这个函数名字和类的名字一样,这样就有了一个大体的框架。
复制代码 代码如下:
<?php
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 类变成这个样子了:
复制代码 代码如下:
<?php
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)<$km)
{
$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),我们通过封装简化了使用和操作就像我们使用电视,手机一样一点都不复杂。
一篇好的入门教程应该
生动真实的例子。
不但提供了正确的概念,在变量和函数命名,函数封装和调用上也值的学习。
即便你熟悉了面向对象编程以后也不会认为当初的例子有什么不妥之处。
如果你读完教程动手的话一定能够深刻体会到教程的美妙之处,大大减少了走弯路的机会。
好的代码是可以被人像书一样读懂,你认为呢?
回复

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-9-18 06:01:27 | 显示全部楼层
这个源码还可以
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-9-20 03:44:26 | 显示全部楼层
这个源码不错啊
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

67

积分

注册会员

Rank: 2

积分
67
发表于 2022-12-7 20:19:29 | 显示全部楼层
儿飞飞微风DVD谁vdsvd
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-6-12 22:37:20 | 显示全部楼层
有什么好的服务器
回复 支持 反对

使用道具 举报

15

主题

2万

回帖

122

积分

注册会员

Rank: 2

积分
122
发表于 2023-10-19 13:46:30 | 显示全部楼层
的谁vdvdsvdsvdsdsv
回复 支持 反对

使用道具 举报

27

主题

2万

回帖

331

积分

中级会员

Rank: 3Rank: 3

积分
331
发表于 2023-10-21 11:35:00 | 显示全部楼层
问问问企鹅哇哇哇哇哇
回复 支持 反对

使用道具 举报

4

主题

2万

回帖

303

积分

中级会员

Rank: 3Rank: 3

积分
303
发表于 2024-5-28 05:17:31 | 显示全部楼层
我找了挺久终于找到了
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

362

积分

中级会员

Rank: 3Rank: 3

积分
362
发表于 2024-5-29 02:50:06 | 显示全部楼层
554411515451555
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

59

积分

注册会员

Rank: 2

积分
59
发表于 2024-6-16 07:51:07 | 显示全部楼层
的vgdsvsdvdsvdsvds
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-24 01:46 , Processed in 0.082811 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表