我是一個緩慢的學習者,我想當談到編碼時,我一直在學習PHP幾年,但我仍然不明白類,所以現在是時候我花點功夫去至少理解它們了更好。你能幫我理解PHP類更好一點嗎?
我對所有的東西都使用函數。人們經常在這裏向我發表評論,他們不能相信我有社交網站,也不會使用課堂。
我真的不明白他們的好處,你可以解釋除了它應該是簡單的多人來處理你的代碼的好處嗎?
對我來說好像只是類複雜簡單的任務
我是一個緩慢的學習者,我想當談到編碼時,我一直在學習PHP幾年,但我仍然不明白類,所以現在是時候我花點功夫去至少理解它們了更好。你能幫我理解PHP類更好一點嗎?
我對所有的東西都使用函數。人們經常在這裏向我發表評論,他們不能相信我有社交網站,也不會使用課堂。
我真的不明白他們的好處,你可以解釋除了它應該是簡單的多人來處理你的代碼的好處嗎?
對我來說好像只是類複雜簡單的任務
簡單地說(實際上,非常簡單),類允許您以邏輯單位組織代碼,併爲用戶創建的對象提供容器和模板。
假設你有一輛汽車......一輛汽車可以有容量和裏面的人。現在
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
現在,也許你可以看到我們如何將這些概念應用於創建例如DBTable
和User
類。
事實上,很難真正開始解釋爲什麼類簡化自己的生活沒有進入面向對象編程(抽象,封裝,繼承,多態)的概念。
我建議你閱讀以下書。它將幫助您掌握面向對象的核心概念,並幫助您理解爲什麼對象能夠讓您的生活更輕鬆。如果不理解這些概念,很容易將課程視爲另一個複雜因素。
推介在Amazon.com
+1 - 精彩的描述 – 2009-07-29 01:39:10
+1本書 – Randell 2009-07-29 02:09:44
感謝您的示例代碼,它的易於理解的例子。對我來說,不知道類,這似乎是如此多的代碼比如果你做了幾個函數 – JasonDavis 2009-07-29 02:45:01
在某些方面,你是正確的。類可以使複雜化簡單的任務,並且確實有很多可以在不使用它們的情況下完成。然而,課程也使生活變得更容易。
想象一下你的生活沒有功能。您將不得不使用GoTo語句將代碼塊組合在一起。呸。當然,你可以完成同樣的事情,但是你需要更加努力工作,並且與其他人分享你的工作會更加困難。
類提供了一種將類似代碼塊組合在一起的簡潔方法。而且,它們可以讓您輕鬆捕捉並處理狀態。
一個好的類定義是創建對象的藍圖。
我有權說班級只是將功能組合在一起嗎? – JasonDavis 2009-07-29 01:25:48
像我有5個不同的日期/時間功能,他們可以全部添加到1日期/時間課程? – JasonDavis 2009-07-29 01:26:23
它們旨在將相關數據以及對這些數據進行操作的功能組合在一起。 – databyss 2009-07-29 01:27:46
帶班,你可以這樣做
class Stack {
private $theStack = array();
// push item onto the stack
public function push(item) { ... }
// get the top item from the stack
public function pop() { ... }
}
這個簡單的例子有一定的好處。
最好的事情回合類^^ – 2009-07-29 01:38:25
謝謝你的例子,你提到的代碼之外的類不能操縱數組,我想我不跟隨,因爲如果你正在編碼,那麼我不知道什麼東西會操縱它,除非你也想要它,並編碼它這樣做。也許我會明白有一天 – JasonDavis 2009-07-29 02:38:28
hes在談論封裝。這基本上意味着數據隱藏讓您(程序員)在全局命名空間中意外創建覆蓋$ theStack。在一個充滿了函數且沒有封裝的世界裏,你不得不在全局命名空間中擁有$ theStack。想象一下,6個月後,在$ theStack初始化600行以下,您再次創建它,忘記它已經存在。你重寫它的值並且你的程序出乎意料地行爲。類允許模塊化和易於維護。 – cp3 2009-10-08 14:38:24
也許你可以爲自己做的最好的事情是購買/查找/借用一本關於面向對象編程的書。 PHP類與其他現代語言(Java,C#等)基本相同,一旦你學習了OOP,你將會理解在完全不受語言限制的編程級別的類,並且可以應用於任何OOP項目,PHP或除此以外。
類就像是一個計算器。你可以有一萬個不同的計算器來做同樣的事情,每個計算器都跟蹤他們自己的價值觀和數據。
$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;
請修改您的代碼。這幾乎沒有意義。 – 2009-07-29 01:36:22
我縮短了一點。我拿出所有功能的「內部」,主要是爲了說明這一點。 – 2009-07-29 01:37:15
也拿出了PHP5的東西。 – 2009-07-29 01:38:05
我對我的數據庫表使用類。
例如,我們有
標識,名字,姓氏
爲此,我將使用性能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意味着它的速度更快。因爲一個設計糟糕的類可以慢下來。
但是這種功能是通用的,以我的全球性方案我不使用類他們。
作爲一個詼諧的軼事,我曾經這樣描述PHP腳本無類像肥皂劇 - 平坦,很難在現實生活中的重用。另一方面,OO-PHP更像真正的戲劇;對象是動態的,並且可以是多方面的,雖然它們的實例之間往往存在差異,但它們通常基於基本的戲劇性原型。
基本上我說的是更容易重新調整和重用面向對象的代碼,這使得實現開源框架和實用程序更容易。我發現在PHP腳本純粹是極難維護和重用,並傾向於允許糟糕的安全漏洞,有很多很好的,已經存在的面向對象的工具。
這是一個巨大的話題,甚至從最好的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()是如何明確地連接到它所作用的數據的?
你正在踏入一個大的世界,我希望你的學習成功。如果您有任何問題,請告訴我。
感謝這個例子,很高興看到它以我理解的方式和我不這樣做的方式,它就像一種完全不同的語言 – JasonDavis 2009-07-29 02:56:09
我看看你得到了很多偉大的相關詳細的答案了,但要保持在非常簡單的術語:
你知道的代碼塊是什麼。
你知道如果你想重用一段代碼,你把它放在一個函數中。
到目前爲止好。現在,類是關於組織函數和變量的。
如果你創建了很多功能,你必須非常小心,他們的名字不會發生衝突,你可能想要在不同的文件中組織你的功能,以保持相關的功能組合在一起。
Classes通過其最簡單的方式幫助您將相關功能分組到一個類別的功能。取而代之的
add_product_to_shop();
add_product_to_cart();
add_product_to_wish_list();
你組他們一個類中:
Shop::addProduct();
Cart::addProduct();
WishList::addProduct();
這裏Shop
,Cart
和WishList
是的類每個人都有自己的方法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,在改變它們之前驗證變量)等等。
一旦你瞭解了類和它們的用法,你就會明白爲什麼它們使開發變得更容易和更好的結構化。值得學習。 – Christian 2009-07-29 01:35:08
哇..很多答案,其中每一個都很長。 – 2009-07-29 02:57:25
@Christian:在這裏我們是3年後,現在我同意100% – JasonDavis 2012-06-15 00:05:32