OO PHP解释对于一个死灵n00b

时间:2020-03-05 18:59:04  来源:igfitidea点击:

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

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

解决方案

回答

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

当然,请看一下"告诉,不要问"的哲学,"需要知道"的原理(又名"得墨meter耳的法律")也是非常重要的。

回答

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

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

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

class Breakfast {

}

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

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

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

function does_user_want_beans($breakfast){
     if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
         return true;
     }
     return false;
}

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

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想法变得更加干净:

$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到底是什么以及为什么它在学术上更好的说法,有更好的解释,但这是我的实际原因,并且包含培根。

回答

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

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

回答

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

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

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

回答

学习OO的另一个指针:

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

回答

我一直在穿上你的鞋子,但是看完这本书后(几次!),我看到了曙光。我没有回头。我们将在Amazon上获得它。

我希望你坚持下去,得到它,并喜欢它。在一起时,它会让我们微笑。

作文胜于继承。

回答

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

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

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

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

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

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

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

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

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

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

注意:在我们首先熟悉OO编程的基础知识之前,我不会开始使用PHP框架。当我们可以扩展自己的类时,它们将更加强大。