簡體   English   中英

你能幫助我更好地理解PHP類嗎?

[英]Can you help me understand PHP Classes a little better?

我是一個慢學習者,我想在編碼方面,我已經學習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

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


實際上,很難真正開始解釋為什么類在不涉及面向對象編程(抽象,封裝,繼承,多態)的概念的情況下簡化了一個人的生活。

我建議你閱讀以下書籍。 它將幫助您掌握OOP的核心概念,並幫助您理解為什么對象真正讓您的生活更輕松。 如果不理解這些概念,很容易將類視為另一個復雜問題。

PHP 5對象,模式和實踐

PHP 5對象,模式和實踐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上獲得

這是一個很大的話題,即使是最好的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()是一個對象的方法,它是如何明確地連接到它所作用的數據上的?

你正在踏入一個大世界,祝你學習愉快。 如果您有任何疑問,請告訴我。

在某些方面,你是對的。 可以使簡單的任務復雜化,並且在不使用它們的情況下確實可以實現很多。 但是,課程也讓生活變得更輕松。

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

類提供了一種將類似代碼塊組合在一起的簡潔方法。 此外,它們允許您非常輕松地捕獲和處理狀態。

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

您可以為自己做的最好的事情就是購買/查找/借閱面向對象編程的書。 PHP類基本上與其他現代語言(Java,C#等)相同,一旦你學習了OOP,你就會理解一個完全與語言無關的編程水平的類,並且可以應用於任何OOP項目,PHP或者除此以外。

有了課程,你可以做類似的事情

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. 需要使用堆棧的代碼可以簡單地創建類的實例(即$ myStack = new Stack())

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

$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;

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

例如我們有

Id,名字,姓氏

為此,我將使用一個班級

class user{

    public $Id, $name, $lastname

    public function user($iId){

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

對於性能,使用getData_functions來檢索數據而不是將它們放在構造函數中。 請注意,上面只是一個主要的想法,而不是如何構建類的示例

但是稍后您可以為多個用戶執行此操作

while(mysql_get('Id')){

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

他們讓生活更輕松。

但更重要的是,讓生活更輕松,意味着更快......因為設計糟糕的課程可以減慢速度。

但是對於我的全局程序通用的這種功能,我不使用它們的類。

作為一個jokey軼事,我曾經描述過沒有類的PHP腳本,就像肥皂劇那樣平坦,並且難以在現實生活中重復使用。 另一方面,OO-PHP有點像真正的戲劇; 對象是動態的,並且可以是多方面的,雖然它們的實例化之間往往存在差異,但它們通常基於基本的戲劇性原型。

基本上我所說的是,重新利用和重用面向對象的代碼更容易,這使得實現開源框架和實用程序更加容易。 我發現在PHP中使用純腳本非常難以維護和重用,並且往往會導致很多安全漏洞,因為有很多好的,預先存在的面向對象的實用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM