+ -
当前位置:首页 → 问答吧 → 用简单的例子学面向对象(高手勿进)

用简单的例子学面向对象(高手勿进)

时间:2009-10-14

来源:互联网



利用“人写日记”来描述面向对象。

首先我们来了解一下“人是怎样写日记的?”:
1.        要一本日记本
2.        要一支笔
3.        人写日记

这就是我们一般写日记的必要条件。另外我们要分清楚是人写日记还是笔写日记。我觉得是笔写日记,因为直接与笔记本接触的是笔而不是人。不过笔也是要有人使用才行的。所以我们可以画下一下的图:
下载 (8.2 KB)
2009-10-14 13:52


首先我们要知道人是一个抽象的代名词,所以我们可以创建以下的抽象类,他有命名和写日记的方法。

abstract class Human {
        protected $name;
        
        abstract public function setName($name);
        abstract public function write(NoteBook $note, Pen $pen, $text);
}

然后我们可以创建编写一个类来继承他,我们叫他Jack:

class Jack extends Human {
        public function setName($name) {
                $this->name = $name;
        }

        public function write(NoteBook $note, Pen $pen, $text) {
                if (!$note->open()) {
                        return false;
                }
                $ok = $pen->write($note, $text);
                $note->close();
                if ($ok) return true;
                else return false;
        }
}

我们实现了Human中的两个抽象方法。第一个是命名的方法,第二个是写日记的方法。在写日记的方法中用到了笔记本,笔和要写入的内容。因为内容是人想好的,所以要在Human中提供。
然后我们再写NoteBook类:

class NoteBook {
        private $noteBookPath;
        private $fp;

        public function setBook($path) {
                if (file_exists($path)) {
                        $this->noteBookPath = $path;
                        return true;
                }
                return false;
        }

        public function open() {
                if (isset($this->noteBookPath)) {
                        $this->fp = fopen($this->noteBookPath, 'w');
                        if ($this->fp) return true;
                }
                return false;
        }

        public function getNoteBook() {
                if (is_resource($this->fp)) {
                        return $this->fp;
                }
                return NULL;
        }

        public function close() {
                if (is_resource($this->fp)) {
                        fclose($this->fp);
                        return true;
                }
                return false;
        }
}

NoteBook类有以下的方法:
1.        setBook:用于设置一个日记,我们是用一个文件来保存的(也可以使用数据库)。
2.        open:用于打开笔记本。
3.        getNoteBook:用于获得笔记本。
4.        close:用于关闭笔记本。

再来就是Pen类:

class Pen {
        public function write(NoteBook $note, $text) {
                $book = $note->getNoteBook();
                if (!$book) {
                        return false;
                }
                if (fwrite($book, $text)) return true;
                return false;
        }
}

Pen类比较简单,只有写的方法,而这个方法首先获得笔记本,然后就是写入内容到笔记本。

再回来看看Human的write方法:

public function write(NoteBook $note, Pen $pen, $text) {
        if (!$note->open()) {
                return false;
        }
        $ok = $pen->write($note, $text);
        $note->close();
        if ($ok) return true;
        else return false;
}

他是首先打开笔记本,然后使用笔来写入内容,写完之后就是关闭笔记本。
到此我们就通过一个简单的例子来了解到面向对象了。

使用:

<?php
$jack = new Jack();//创建一个Jack对象
$book = new NoteBook();//创建一个笔记本
$pen  = new Pen();//创建一支笔

$book->setBook('book.txt');//设置笔记本
//写日记
if ($jack->write($book, $pen, 'This is content.')) {
        echo 'Write ok';
} else {
        echo 'Write no';
}
?>

作者: liexusong   发布时间: 2009-10-14

你是什么的干活的啊!哈啊哈!

作者: weatheryyj   发布时间: 2009-10-14

不错,我顶你

作者: 阿辛   发布时间: 2009-10-15

前段时间写了一个简单的男女OOXX的面向对象的基础例子.

作者: TankMe   发布时间: 2009-10-15

顶,仔细看看~

作者: wxllyf   发布时间: 2009-10-15

我咋觉得 human 像控制器
其余的像模型

作者: wxllyf   发布时间: 2009-10-15

tukiz06学习了

作者: siyuantlw   发布时间: 2009-10-15

不错,我顶你
阿辛 发表于 2009-10-15 08:36

:lol:

作者: sunnynet   发布时间: 2009-10-15

TankMe
发来看看呗

作者: dontlie   发布时间: 2009-10-15

good ooper!:loveliness:

作者: langcier   发布时间: 2009-10-22

支持,还好学过ASP.NET的面向对象,现在换到PHP也还能看的懂

作者: 云端o枫o0   发布时间: 2009-10-22

经典顶起来

作者: LeeBin   发布时间: 2010-08-05