2009-07-29 66 views
3

我是一個緩慢的學習者,我想當談到編碼時,我一直在學習PHP幾年,但我仍然不明白類,所以現在是時候我花點功夫去至少理解它們了更好。你能幫我理解PHP類更好一點嗎?

我對所有的東西都使用函數。人們經常在這裏向我發表評論,他們不能相信我有社交網站,也不會使用課堂。

我真的不明白他們的好處,你可以解釋除了它應該是簡單的多人來處理你的代碼的好處嗎?

對我來說好像只是類複雜簡單的任務

+1

一旦你瞭解了類和它們的用法,你就會明白爲什麼它們使開發變得更容易和更好的結構化。值得學習。 – Christian 2009-07-29 01:35:08

+1

哇..很多答案,其中每一個都很長。 – 2009-07-29 02:57:25

+1

@Christian:在這裏我們是3年後,現在我同意100% – JasonDavis 2012-06-15 00:05:32

回答

17

簡單地說(實際上,非常簡單),類允許您以邏輯單位組織代碼,併爲用戶創建的對象提供容器和模板。

假設你有一輛汽車......一輛汽車可以有容量和裏面的人。現在

class Car { 
    private $people = array(); 
    private $capacity; 

    function __construct($capacity) { $this->capacity = $capacity; } 

    function addPerson($name) { 
     if(count($this->people) >= $this->capacity) { 
      throw new Exception("Car is already at capacity"); 
     } else { 
      $this->people[] = $name; 
     } 
    } 
    function getPeople() { return $this->people; } 
    function getCapacity() { return $this->capacity; } 
} 

,我們就可以開始使用這些汽車:

$aliceCar = new Car(2); 
$aliceCar->addPerson("Alice"); 

$bobCar = new Car(4); 
$bobCar->addPerson("Bob"); 
$bobCar->addPerson("Jake"); 

我現在有2輛(實例),其中包含不同的數據。

echo implode(',', $aliceCar->getPeople()); // Alice 
echo $aliceCar->getCapacity(); // 2 

echo implode(',', $bobCar->getPeople()); // Bob,Jake 
echo $bobCar->getCapacity(); // 4 

我可能也想有一輛麪包車,這將對門的附加屬性:

class Van extends Car { 
    private $num_doors; 

    function __construct($capacity, $num_doors) { 
     parent::__construct($capacity); // Call the parent constructor 
     $this->num_doors = $num_doors; 
    } 

    function getNumDoors() { return $this->num_doors; } 
} 

現在讓我們使用的是麪包車:

$jakeVan = new Van(7, 5); 

// Van is ALSO a Car 
$jakeVan->addPerson("Ron"); //Jake is with Bob now, so his son is driving the Van 
$jakeVan->addPerson("Valery") //Ron's girlfriend 

echo implode(',', $jakeVan->getPeople()); // Ron,Valery 
echo $jakeVan->getCapacity(); // 7 
echo $jakeVan->getNumDoors(); // 5 

現在,也許你可以看到我們如何將這些概念應用於創建例如DBTableUser類。


事實上,很難真正開始解釋爲什麼類簡化自己的生活沒有進入面向對象編程(抽象,封裝,繼承,多態)的概念。

我建議你閱讀以下書。它將幫助您掌握面向對象的核心概念,並幫助您理解爲什麼對象能夠讓您的生活更輕鬆。如果不理解這些概念,很容易將課程視爲另一個複雜因素。

PHP 5個對象,模式與實踐

PHP 5 Objects, Patterns, and Practice http://ecx.images-amazon.com/images/I/51BF7MF03NL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

推介在Amazon.com

+0

+1 - 精彩的描述 – 2009-07-29 01:39:10

+1

+1本書 – Randell 2009-07-29 02:09:44

+0

感謝您的示例代碼,它的易於理解的例子。對我來說,不知道類,這似乎是如此多的代碼比如果你做了幾個函數 – JasonDavis 2009-07-29 02:45:01

2

在某些方面,你是正確的。類可以使複雜化簡單的任務,並且確實有很多可以在不使用它們的情況下完成。然而,課程也使生活變得更容易。

想象一下你的生活沒有功能。您將不得不使用GoTo語句將代碼塊組合在一起。呸。當然,你可以完成同樣的事情,但是你需要更加努力工作,並且與其他人分享你的工作會更加困難。

類提供了一種將類似代碼塊組合在一起的簡潔方法。而且,它們可以讓您輕鬆捕捉並處理狀態。

一個好的類定義是創建對象的藍圖。

+0

我有權說班級只是將功能組合在一起嗎? – JasonDavis 2009-07-29 01:25:48

+0

像我有5個不同的日期/時間功能,他們可以全部添加到1日期/時間課程? – JasonDavis 2009-07-29 01:26:23

+0

它們旨在將相關數據以及對這些數據進行操作的功能組合在一起。 – databyss 2009-07-29 01:27:46

1

帶班,你可以這樣做

class Stack { 
    private $theStack = array(); 

    // push item onto the stack 
    public function push(item) { ... } 

    // get the top item from the stack 
    public function pop() { ... } 
} 

這個簡單的例子有一定的好處。

  1. 代碼的類以外不能操縱用來實現棧
  2. 的全局命名空間是不是與無關的變量被污染的陣列
  3. 需要使用堆棧
  4. 代碼可以簡單地創建一個實例該類(即$ myStack = new Stack())
+0

最好的事情回合類^^ – 2009-07-29 01:38:25

+0

謝謝你的例子,你提到的代碼之外的類不能操縱數組,我想我不跟隨,因爲如果你正在編碼,那麼我不知道什麼東西會操縱它,除非你也想要它,並編碼它這樣做。也許我會明白有一天 – JasonDavis 2009-07-29 02:38:28

+0

hes在談論封裝。這基本上意味着數據隱藏讓您(程序員)在全局命名空間中意外創建覆蓋$ theStack。在一個充滿了函數且沒有封裝的世界裏,你不得不在全局命名空間中擁有$ theStack。想象一下,6個月後,在$ theStack初始化600行以下,您再次創建它,忘記它已經存在。你重寫它的值並且你的程序出乎意料地行爲。類允許模塊化和易於維護。 – cp3 2009-10-08 14:38:24

2

也許你可以爲自己做的最好的事情是購買/查找/借用一本關於面向對象編程的書。 PHP類與其他現代語言(Java,C#等)基本相同,一旦你學習了OOP,你將會理解在完全不受語言限制的編程級別的類,並且可以應用於任何OOP項目,PHP或除此以外。

1

類就像是一個計算器。你可以有一萬個不同的計算器來做同樣的事情,每個計算器都跟蹤他們自己的價值觀和數據。

 
$cal1 = new calculator; 
$cal2 = new calculator; 

$cal1->add(5); 
$cal2->add(3); 

echo $cal1->show(); // returns 5 

echo $cal2->show(); //returns 3 

每個計算器都可以執行相同的任務,並運行相同的代碼,但它們都包含不同的值。

如果您不使用類,您將不得不單獨創建每個計算器,爲其分配一個變量,然後複製並粘貼您希望一次使用的每個計算器。

 
function add_calc_1(); 
function add_calc_2(); 
function add_calc_3(); 
function subtract_calc_1(); 
function subtract_calc_2(); 
function subtract_calc_3(); 
function multiply_calc_1(); 
function multiply_calc_2(); 
function multiply_calc_3(); 
function divide_calc_1(); 
function divide_calc_2(); 
function divide_calc_3(); 

$total_1; 
$total_2; 
$total_3; 

相反,你可以定義一個類,它是一個計算器的代碼,然後只要你想,你可以創建許多不同的,每個都有自己的專櫃。

 
class calc 
{ 
    public $total; 
    function add(); 
    function subtract(); 
    function multiply(); 
    function divide(); 
} 
$cal1=new calc; 
$cal2=new calc; 
$cal3=new calc; 
+0

請修改您的代碼。這幾乎沒有意義。 – 2009-07-29 01:36:22

+0

我縮短了一點。我拿出所有功能的「內部」,主要是爲了說明這一點。 – 2009-07-29 01:37:15

+0

也拿出了PHP5的東西。 – 2009-07-29 01:38:05

0

我對我的數據庫表使用類。

例如,我們有

標識,名字,姓氏

爲此,我將使用性能IL使用getData_functions類

class user{ 

    public $Id, $name, $lastname 

    public function user($iId){ 

     Id = $iId; 
     firstname = mysql_get('firstname'); 
     lastname = mysql_get('lastname'); 
} 

檢索數據,而不是把它們放在構造函數中。注意:以上只是一個大的想法,而不是例如如何構建你的類

但後來,你可以爲多個用戶做到這一點

while(mysql_get('Id')){ 

    $user = new user('Id'); 
    $print $user->firstname . " " . $user->lastname; 
} 

他們使生活更輕鬆。

但我會更重要的是使生活更輕鬆dosent意味着它的速度更快。因爲一個設計糟糕的類可以慢下來。

但是這種功能是通用的,以我的全球性方案我不使用類他們。

0

作爲一個詼諧的軼事,我曾經這樣描述PHP腳本無類像肥皂劇 - 平坦,很難在現實生活中的重用。另一方面,OO-PHP更像真正的戲劇;對象是動態的,並且可以是多方面的,雖然它們的實例之間往往存在差異,但它們通常基於基本的戲劇性原型。

基本上我說的是更容易重新調整和重用面向對象的代碼,這使得實現開源框架和實用程序更容易。我發現在PHP腳本純粹是極難維護和重用,並傾向於允許糟糕的安全漏洞,有很多很好的,已經存在的面向對象的工具。

3

這是一個巨大的話題,甚至從最好的SOers的最佳答案只能希望劃傷表面,但我會給我兩分錢。

類是OOP的基礎。他們以一種非常基本的方式描繪了對象藍圖。他們爲程序員提供了許多功能,包括封裝和多態性。

封裝,繼承和多態是OOP非常關鍵的一個方面,所以我將重點關注我的例子。我將編寫一個結構化(僅函數),然後編寫代碼片段的OOP版本,我希望您能理解其優點。

首先,結構化的例子

<?php 

function speak($person) 
{ 
    switch($person['type']) 
    { 
    case 'adult': 
     echo "Hello, my name is " . $person['name']; 
     break; 
    case 'child': 
     echo "Goo goo ga ga"; 
     break; 
    default: 
     trigger_error('Unrecognized person type', E_USER_WARNING); 
    } 
} 

$adult = array(
    'type' => 'adult' 
    , 'name' => 'John' 
); 
$baby = array(
    'type' => 'baby' 
    , 'name' => 'Emma' 
); 

speak($adult); 
speak($baby); 

而現在,OOP例如

abstract class Person 
{ 
    protected $name; 

    public function __construct($name) 
    { 
    $this->name = $name; 
    } 
    abstract public function speak(); 
} 

class Adult extends Person 
{ 
    public function speak() 
    { 
    echo "Hello, my name is " . $this->name; 
    } 
} 

class Baby extends Person 
{ 
    public function speak() 
    { 
    echo "Goo goo ga ga"; 
    } 
} 

$adult = new Adult('John'); 
$baby = new Baby('Emma'); 

$adult->speak(); 
$baby->speak(); 

它不僅應該是很明顯,只是在創建新的數據結構(對象)是更容易,更容易控制,請注意第一個例子中的speak()函數中的邏輯,以及第二個中的speak()方法。

通知的第一個應如何明確檢查類型的人,纔可以採取行動?當你添加其他動作函數時會發生什麼,如walk(),sit()或其他你可能對數據有什麼作用? 這些功能的每個將不得不復制「類型」檢查,以確保它們正確執行。這是與封裝的相對的。數據和使用/修改它們的功能沒有以任何明確的方式連接。

而使用OOP示例,根據對象的創建方式調用正確的speak()方法。這是行爲中的繼承/多態。並且請注意,在這個例子中,作爲對象的一個​​方法,speak()是如何明確地連接到它所作用的數據的?

你正在踏入一個大的世界,我希望你的學習成功。如果您有任何問題,請告訴我。

+0

感謝這個例子,很高興看到它以我理解的方式和我不這樣做的方式,它就像一種完全不同的語言 – JasonDavis 2009-07-29 02:56:09

1

我看看你得到了很多偉大的相關詳細的答案了,但要保持在非常簡單的術語:

你知道的代碼塊是什麼。
你知道如果你想重用一段代碼,你把它放在一個函數中。
到目前爲止好。現在,類是關於組織函數和變量的。
如果你創建了很多功能,你必須非常小心,他們的名字不會發生衝突,你可能想要在不同的文件中組織你的功能,以保持相關的功能組合在一起。

Classes通過其最簡單的方式幫助您將相關功能分組到一個類別的功能。取而代之的

add_product_to_shop(); 
add_product_to_cart(); 
add_product_to_wish_list(); 

你組他們一個類中:

Shop::addProduct(); 
Cart::addProduct(); 
WishList::addProduct(); 

這裏ShopCartWishList是的類每個人都有自己的方法addProduct()功能)。與其他代碼片段相比,這是一個小小的改進,因爲函數名稱本身已經變得很短,很明顯這些函數並不是一起工作的,並且很容易將其他相關函數添加到同一個類中。

什麼類進一步允許你,但不僅是組合功能,而且也是變量。當涉及到命名時,變量通常比函數更糟,因爲您需要非常小心,不要覆蓋變量。通過將它們全部分組到各自的類中,您可以減少命名衝突。 (與此相關的概念也稱爲命名空間。)

什麼類還允許您執行的操作是從它們創建對象。如果該類是相關變量和函數的藍圖,則可以從該藍圖構建一個「實際對象」,甚至是幾個獨立於對方而行爲相同的「實際對象」。相反跟蹤的$shopping_cart1$shopping_cart2並確保您的功能作用於正確的變量,你只要讓你的藍圖的副本:

$cart = new Cart(); 
$cart->addProduct($x); 

$anotherCart = new Cart(); 
$anotherCart->addProduct($y); 

// $cart takes care of product $x, $anotherCart of product $y. 
// No extra overhead needed to duplicate functionality 
// or to make sure the addProduct() function adds to the right cart. 

你沒有在Web開發中需要這個,很多時候,尤其是PHP,但取決於您的應用程序,它可能是有用的。

什麼類進一步允許你稍微改變它們。假設您已經創建了一個功能齊全的功能集合,可以作爲購物車一起使用。現在,您希望創建另一個購物車,基本上可以採用相同的方式,但有一些細微差異(例如,應立即計算折扣)。您可以創建一個新類並指定它應該與舊購物車完全相同,但是可以覆蓋和修改一些特定的變量或函數(稱爲「繼承」)。

Classes的概念使您能夠做更多的可能性,並且上述每一點都需要更多的細節和細節。總的來說,類是用來保持聚集在一起的東西,把它們分開(命名空間),允許更容易的一致性檢查(getter/setter,在改變它們之前驗證變量)等等。