关于oop:OO PHP的解释对于死神n00b

关于oop:OO PHP的解释对于死神n00b

OO PHP explanation For a braindead n00b

我已经写PHP大约六年了,到现在我觉得我应该做更多的事情来编写更好的代码。 我知道面向对象的代码是必经之路,但是我无法理解这个概念。

任何人都可以用任何白痴可以理解的术语,OO及其在PHP中的工作方式进行解释,还是可以向我介绍白痴指南教程?


想一想。任何事情,您想做的事情。说,早餐。

(所有代码都是伪代码,与任何在银行业中活着,死了或被临床滥用的语言的相似之处完全是偶然的,与您的帖子被标记为PHP无关)

因此,您定义了如何表示早餐的模板。这是一类:

1
2
3
class Breakfast {

}

早餐包含属性。在普通的非面向对象的东西中,您可以为此使用数组:

1
2
3
4
5
6
7
$breakfast = array(
'toast_slices' => 2,
'eggs' => 2,
'egg_type' => 'fried',
'beans' => 'Hell yeah',
'bacon_rashers' => 3
);

您将拥有各种功能来摆弄它:

1
2
3
4
5
6
function does_user_want_beans($breakfast){
     if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
         return true;
     }
     return false;
}

而且您一团糟,而不仅仅是因为豆子。您有一个可供程序员随意修改的数据结构,一个与日俱增的功能集合,可用于彻底摆脱数据定义的束缚。因此,您可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Breakfast {
  var $toast_slices = 2;
  var $eggs = 2;
  var $egg_type = 'fried';
  var $beans = 'Hell yeah';
  var $bacon_rashers = 3;

  function wants_beans(){

     if (isset($this->beans) && $this->beans != 'Hell no'){
         return true;
     }

     return true;

  }

  function moar_magic_pig($amount = 1){

     $this->bacon += $amount;

  }

  function cook(){
      breakfast_cook($this);
  }

}

然后操纵程序的Breakfast想法变得更加干净:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$users = fetch_list_of_users();

foreach ($users as $user){
    // So this creates an instance of the Breakfast template we defined above

    $breakfast = new Breakfast();

    if ($user->likesBacon){
       $breakfast->moar_magic_pig(4);
    }

    // If you find a PECL module that does this, Email me.
    $breakfast->cook();
}

我认为这看起来更简洁,而且是一种更整洁的方式来表示我们要视为一致对象的数据斑点。

关于OO到底是什么以及为什么它在学术上更好的原因,有更好的解释,但这是我的实际原因,并且包含培根。


警告到位:如果不学习OO设计,您将不会学习OO编程!关键概念是定义对数据进行操作的功能以及相应的数据。然后,您可以告诉对象该做什么,而不必查询它们的内容。

当然,请看一下"告诉,不要问"的哲学,"需要知道"的原则(又称"得墨meter耳法则")也很重要。


使用OO的一些关键原因是以类似于人类喜欢的感知和关联事物的方式来构造代码,并利用经济,可维护性,可靠性和可伸缩性的好处。

即:人类是数千年前设计的轮子。我们可能会一直对其进行优化,但是我们当然不需要再次进行重新发明。

1)我们喜欢对事物进行分类:"这个大于这个","这个花费比那个大","这个和那个几乎相同"。

2)我们想简化一些事情:"好吧,这是一台V8液冷涡轮驱动的拖拉机,但我仍然只是转动方向盘,然后将脚踩在踏板上来驱动它,对吗?"。

3)我们希望对事物进行标准化:"好吧,我们将所有形状都称为三角形,圆形和正方形,并希望它们都具有面积和圆周"。

4)我们喜欢适应事物:"嗯,我喜欢,但是我可以用Racing Green来代替吗?"。

5)我们喜欢创建蓝图:"我还没有时间或金钱(或批准)来建造它,但是它将有门和屋顶,还有一些窗户和墙壁"。

6)我们喜欢保护事物:"好吧,我让您看一下总价,但我隐藏了我从您这里添加的加价!"。

7)我们喜欢彼此交流的事物:"我想通过以下方式访问我的银行余额:我的手机;我的计算机; ATM;银行职员;等等。"

要学习如何利用OO(并了解其中的一些优点),我建议您将自己作为一项家庭作业-也许是一个基于浏览器的应用程序,该应用程序处理诸如圆形,矩形和三角形之类的SHAPES,并跟踪其面积,颜色,位置和z索引等。然后添加正方形作为矩形的特例,因为在大多数定义,面积等方面,正方形都是相同的。只是具有高度与宽度相同的附加条件。为了使它更难,您可以将矩形设为四边形,即多边形。等等等

注意:在您首先熟悉OO编程的基础知识之前,我不会开始使用PHP框架。当您可以扩展自己的类时,它们将更加强大,如果您不能扩展类,则有点像死记硬背学习->更加困难!


我一直在穿上你的鞋子,但是看完这本书(几次!)后,我看到了曙光。http://www.apress.com/book/view/9781590599099阅读完这本书之后,我真的"明白了",我没有回头。您将在Amazon上获得它。

希望您坚持,接受并喜欢它。在一起时,它会让您微笑。

作文胜于继承。


学习OO的另一个指针:

大多数OO教程都将重点放在继承上(例如X类扩展Y类)。我认为这是一个坏主意。继承是有用的,但它也会引起问题。更重要的是,继承不是OO的重点。重点是抽象;隐藏实施细节,以便您可以使用简单的界面。了解如何为数据编写良好的抽象,您将处于良好状态。不要马上流汗继承财产。


与您从头开始学习OO相比,我认为,如果您采用了一个有助于面向对象编程的框架,将会更加容易。它将"强迫"您使用正确的OOP方法;您将能够从编写框架的方式中学习如何最好地实现OOP。

我建议使用QCodo PHP5框架http://www.qcodo.com。它包含有关如何进行设置的出色视频教程以及视频培训(http://www.qcodo.com/demos/)。

全面披露:我已经在此框架上开发了两年了,并且已经为他们的代码库贡献了代码(因此我并不完全公正:-)。


最佳建议来自:xtofl.myopenid.com ^^^^

如果您不了解模式的用途,那么您实际上就不会充分利用对象。您需要知道为什么继承,多态性,接口,工厂,装饰器等通过解决特定问题才能真正简化设计。


推荐阅读

    AMD平台专业术语

    AMD平台专业术语,,1. AMD VISION技术 AMD公司曾经发布过的一份调查报告显示,消费者推迟购买硬件是由于他们对PC术语感到困惑。因此,AMD公

    dip医保通俗解释?dip和drg医保区别

    dip医保通俗解释?dip和drg医保区别,医保,医疗机构,本文目录dip医保通俗解释dip和drg医保区别医保dip是什么意思DIP是什么意思电子厂dip是什

    里番名词解释|里番是什么东西啊

    里番名词解释|里番是什么东西啊,动画, 里番 到底是什么?原来动画的种类这么复杂。动画是一种综合艺术,它是集合了绘画、漫画、电影、数字媒

    电脑cpu名词|CPU术语

    电脑cpu名词|CPU术语,,1. CPU术语4核8核是核心数量,是CPU系列术语,指处理器主频提升上已力不从心,Intel和AMD在不用进行大规模开发的情况下,将

    设置解释器|解释器定义

    设置解释器|解释器定义,,1. 解释器定义解释器架构的优点:一个较低的层可以被不同的层所使用。层使标准化更容易,因为我们可以清楚地定义级别

    什么叫术语

    什么叫术语,术语,概念,本文目录什么叫术语interchange和change的区别,dialect,jargon,term,terminology的区别专业术语英文怎么说术语是什么意