ฉันจะใช้แนวคิด OOP เพื่อสร้างแอปพลิเคชันเว็บที่เรียบง่าย แต่มีอยู่จริงได้อย่างไร [ปิด]


25

ฉันพยายามมาเป็นเวลานานแล้วที่จะปิดหัว OOP ฉันเห็นข้อดีของมัน ฉันได้อ่านแบบฝึกหัดจำนวนมากและดูวิดีโอในหัวข้อที่เท่ากัน ฉันได้ตัวอย่างสัตว์ / แมว / สุนัขฉันได้รับตัวอย่างรถยนต์ / ไดรฟ์ สิ่งที่ฉันกำลังดิ้นรนคือจะใช้แนวคิดเหล่านี้ในแอปพลิเคชันที่ใช้งานจริง ดังนั้นฉันได้กำหนดให้สร้างโดยใช้ OOP

ฉันไม่ได้ขอความช่วยเหลือเกี่ยวกับไวยากรณ์หรือการเขียนรหัสเฉพาะ - ฉันสามารถพบว่าตัวเองในเอกสารและโดยการค้นหาฟอรั่ม ฯลฯ สิ่งที่ฉันต้องการจริงๆคือแนวทางและการผลักดันในทิศทางที่ถูกต้องทุกครั้ง มีโปรแกรมเมอร์โปรแกรมเมอร์คนใดที่เต็มใจให้คำปรึกษากับฉันหรือไม่?

ในฐานะที่เป็นโครงการเรียนรู้ของฉันฉันต้องการที่จะสร้างคลาสสิฟายด์ "app เว็บ" สิ่งที่คล้ายกับ Craigslist แต่มีวิธีการลดลงในแง่ของขอบเขต ฉันต้องการใช้ PHP5 และ MySQL เพราะฉันคุ้นเคยกับพวกเขา

สมมติว่ามีเพียง 2 กรณีใช้งาน:

  1. โพสต์บางสิ่งเพื่อขาย
  2. การสืบค้น / ค้นหาสิ่งที่จะซื้อ

สิ่งที่ "สิ่ง" ควรเป็นวัตถุ? ฉันสามารถจินตนาการได้ว่าแต่ละรายการอาจเป็นวัตถุ แต่ ณ จุดใด และทำไม?

ตัวอย่างเช่นผู้ใช้กรอกฟอร์ม "โพสต์รายการขาย" ควรเปลี่ยนรูปแบบเป็นวัตถุที่ได้รับการส่งผ่านไปยังวัตถุอื่นที่แทรกค่าลงในฐานข้อมูลหรือไม่

จะเป็นอย่างไรเมื่อผู้ใช้รายอื่นเรียกดูและขอดูรายการหมวดหมู่ C ทั้งหมด มันสมเหตุสมผลหรือไม่ที่ทุกครั้งที่แอพต้องเชื่อมต่อกับฐานข้อมูลแอปจะสร้างออบเจ็กต์ฐานข้อมูลจากนั้นจะได้รับออบเจ็กต์ไอเท็มจำนวนมากแล้วแสดงบนหน้า? …การเขียนสิ่งนี้ทำให้ฉันรู้ว่า clueless ฉันยังคงเกี่ยวกับ OOP โปรดช่วยฉันแก้ไข

หากในความเห็นของคุณนี่ไม่ใช่โครงการที่ดีที่จะเริ่มลุยใน OOP โปรดอย่าลังเลที่จะแนะนำแนวคิดอื่น!


1
ฉันอยู่ในเรือลำเดียวกันฉันคิดว่าฉันเข้าใจ OOP มานานแล้วตั้งแต่ฉันลองใช้ Java แต่เมื่อพูดถึง PHP ฉันจะรู้วิธีทำสิ่งต่าง ๆ เช่นนี้ในทันที 'ปกติ' แต่เมื่อคิดว่าจะทำอย่างไร มันจะทำได้โดยใช้ OOP ฉันจะเสียชีวิต
martincarlin87

แบบฟอร์มไม่ได้กลายเป็นวัตถุ วัตถุคือตัวอย่างของการเรียน. คุณสามารถเห็นมันเป็นอย่างนี้ $ item-> saveItem ($ _ POST ['name'], $ _POST ['description']); แก้ไขสิ่งที่ช่วยให้ฉันรู้ได้อย่างชัดเจนว่า OOP คือการสร้างแอปพลิเคชัน "สมุดเยี่ยม" บนเว็บ ให้ผู้ใช้เข้าสู่ระบบโพสต์ข้อความแก้ไขข้อความข้อความลบและค้นหาข้อความ ฯลฯ

@pduersteler ความคิดที่ดีฉันจะไปเกี่ยวกับการทำเช่นนั้นได้อย่างไร เป็นที่ยอมรับนี้เป็นคำถามแรกของฉันใน StackOverflow :)

@Bono อาจเป็นแอปสมุดเยี่ยมอย่างที่คุณพูดถึงเป็นจุดเริ่มต้นที่ดีกว่า อีกอันที่ฉันคิดคือแอพลิสต์ง่าย ๆ ที่ผู้ใช้ล็อกอินสร้าง / แก้ไข / ลบรายการเพิ่ม / แก้ไข / ลบไอเท็มในรายการเหล่านั้น คุณจะแบ่งปันแอพสมุดเยี่ยมกับเราได้ไหม

ฉันจะไม่รังเกียจที่จะแบ่งปันมันถึงแม้ว่าจะเป็นการโพสต์แบบ loooot ฉันสามารถแบ่งปันคลาสตัวอย่างง่ายๆกับคุณถ้าคุณต้องการ นอกจากนี้ฉันไม่ทราบว่ารหัสนี้จะทำงานได้ดีเพียงใดเพราะค่อนข้างตรงไปตรงมา: P ฉันจะโพสต์ด้านล่าง

คำตอบ:


17

ฉันคิดอย่างจริงใจว่าคำแนะนำที่นี่แย่มากสำหรับผู้เรียน OO ใหม่จนถึงตอนนี้ ไม่ใช่ความคิดที่ดีที่จะเริ่มคิดสิ่งของในฐานะตัวแทนของอินสแตนซ์เฉพาะของ "สิ่ง" ที่กำหนดโดยบางคลาส เป็นการดีกว่าที่จะคิดว่าพวกเขาเป็นส่วนประกอบที่จัดแบ่งประเภทของเครื่องที่มีปฏิสัมพันธ์กับคนอื่น แต่ไม่ใช่ภายในของกันและกัน แต่ละองค์ประกอบเหล่านี้ยังคงสถานะ

ถ้าคุณต้องการใช้ ORM (การทำแผนที่วัตถุสัมพันธ์) สำหรับการโต้ตอบของ DB กรอบใดก็ตามที่คุณใช้หรือสร้างจะมีวัตถุตื้นบางตัวที่แทนตารางซึ่งอาจเป็นสิ่ง "คอลเลกชัน" แต่ฉันไม่ชอบ ORM ส่วนตัว และฉันไม่คิดว่าพวกเขาจำเป็นต้องมีแนวทางปฏิบัติ OO ที่เหมาะสม แต่เป็นที่นิยมสำหรับเว็บแอปขนาดใหญ่

นอกจากนั้นคุณอาจจะมีองค์ประกอบที่สำคัญบางอย่างที่ความต้องการเครื่องเว็บแอปเพื่อให้ทำงานดังกล่าวเป็นหนึ่งหรือมากกว่าการเชื่อมต่อฐานข้อมูล (คุณสามารถสร้างชั้นที่เก็บการเชื่อมต่อและคุณสามารถเรียกใช้แบบสอบถามที่เตรียมจาก - PDOเป็นที่ดีในตัวเอง แต่ฉันจะปิดมัน) และอาจเป็นระบบเทมเพลตสำหรับมุมมองของคุณ คุณอาจต้องการให้ตัวควบคุมของคุณเป็นวัตถุ PHP เช่นกัน หากคุณมีแบบฟอร์มให้กรอกคุณอาจมีวัตถุที่รักษาค่าแบบฟอร์มสำหรับ P / R / G โทเค็นการป้องกัน CSRF และสามารถทำการตรวจสอบความถูกต้องของอินพุต

คุณไม่ควรพยายามมองหา "สิ่งต่าง ๆ " เพื่อเปลี่ยนเป็นวัตถุเมื่อสร้างการออกแบบเว็บแอพและกราฟวัตถุ คุณควรคิดถึงองค์ประกอบทางตรรกะที่มารวมกันเพื่อสร้างมันขึ้นมาแทน ฉันไม่คิดว่าคุณควรจะพยายามบังคับมันและมันควรจะเป็นไปตามธรรมชาติ แต่มันยากมากที่จะทำอย่างถูกต้องและคุณจะต้องตัดสินใจเปลี่ยนการออกแบบไปพร้อมกัน

คำแนะนำสุดท้ายของฉันคือ: การรวมตัวกันของมรดกเป็นวิธีที่จะไป


กฎง่ายๆที่ฉันมีเป็นพิเศษสำหรับภาษาแบบไดนามิกคือการพยายามสร้างคลาสเฉพาะถ้าฉันต้องการใช้ประโยชน์จากความหลากหลาย (นั่นคือถ้าคลาสเหล่านั้นจะใช้วิธีการแบบเดียวกันในเวอร์ชันที่แตกต่างกันและตรรกะจะขึ้นอยู่กับสิ่งนั้น อย่างใด) มิฉะนั้นฉันพยายามที่จะเขียนในรูปแบบ "ขั้นตอน" ที่ผิดพลาดเพื่อให้ง่ายขึ้น
hugomg

9

นี่คือวิธีที่คุณสามารถใช้ OOP เพื่อซื้อและขายสัตว์เลี้ยงของคุณวิธีการเดียวกันนี้สามารถใช้ในการขายรถยนต์หรือเครื่องบินได้ p

<?php
// define a superclass .. no instances will be made of 'animal' itself,
// but it is useful to define common characteristics and behaviours
// (ie: properties and methods) of all our classes of animals
class Animal {

    // this constructor function is called whenever a new instance
    // of the Animal class is created (or any class that inherits from Animal)
    function Animal ($colour) {

        // install the argument as an attribute of any instances of Animal
        $this->colour = $colour;
    }

    // this method will be available to all classes that inherit from Animal
    function report () {
        return "This ".$this->colour." ".get_class($this)." has ".$this->legs." legs.<br />";
    }
}

// this class inherits from Animal
class Cat extends Animal {

    // set the legs attribute
    public $legs = 4;

    // create a method that can be called from any instances of Cat
    function make_noise () {
        echo "MEOW!<br />";
    }
}

// this class inherits from Cat, and from Animal
class Panther extends Cat {

    // specifies the colour attribute
    public $colour = "black";

    // overwrites the constructor function that would otherwise be
    // inherited from Animal, with a blank constructor.
    function Panther () {}

    // overwrites the method inherited from Cat
    function make_noise () {
        echo "ROARRRR!<br />";
    }
}

// this class inherits from Animal
class Snake extends Animal {
    public $legs = 0;
}

// this class is unrelated to the others
class PetShop {

    // set up an array to store the pets that the shop will stock
    public $pets = array ();

    // set up a variable to store the total cash in the pet shop
    public $cash;

    // this method creates a new object and adds it to the pets array
    function add_pet ($petclass, $price, $colour) {

        // set up a variable containing the number of elements in the pets array
        $n_pets = count($this->pets);

        // add to the pets array, a new instance of the class specified as
        // the first argument in this method, using the last argument as the
        // colour argument that is passed to the specified class's constructor
        $this->pets[$n_pets] = new $petclass($colour);

        // add a 'price' attribute to the pet object
        $this->pets[$n_pets]->price = $price;
    }

    // this method removes the specified pet from the array and adds the price
    // to the pet shop's cash variable
    function sell_pet ($n) {

        // add pet's price to the cash total
        $this->cash += $this->pets[$n]->price;

        // remove the pet object from the array
        array_splice($this->pets, $n, 1);

        // give a message about the sale
        echo "SALE: Pet no. ".$n." sold. Total cash is now \$".$this->cash.".<br /><br />";
    }

    // this method reports on the pet shop's stock
    function show_pets () {

        // show the number of pets available
        echo "<B>Shop stock:</B><br />We have ".count($this->pets)." pets for sale.";
        echo "<br /><br />";

        // iterate through the pets array and show information about each one
        for ($i = 0; $i < count($this->pets); $i++) {
            echo "<B>Pet No. ".$i.": </b>".$this->pets[$i]->report();
            echo "Price: \$".$this->pets[$i]->price."<br />";
        }
        echo "<br />";
    }
}

// instantiate a new PetShop object
$shop = new PetShop ();

// add three pets to the shop
$shop->add_pet(cat, 20, "tabby");
$shop->add_pet(snake, 40, "brown");
$shop->add_pet(snake, 60, "black");

// show the pet's stock
$shop->show_pets();

// sell the first pet in the stock
$shop->sell_pet(0);

// show the pet's stock after the sale
$shop->show_pets();
?>

28
หากฉันเห็นตัวอย่างเพิ่มเติมเกี่ยวกับรถยนต์หรือสัตว์ฉันจะเสียมันไป
Neil McGuigan

5

ตามคำร้องขอของ OP ฉันจะแบ่งปันรหัสสมุดเยี่ยมของฉัน
คลาสข้อความ:

<?php 
Class message
{
    private $db;
    private $messageID;
    private $message;
    private $name;
    private $mail;

    public function setmessageID($messageID)
    {
        $this->messageID = $messageID;
    }

    public function getmessageID()
    {
        return $this->messageID;
    }

    public function setmessage($message)
    {
        $this->message = $message;
    }

    public function getmessage()
    {
        return $this->message;
    }

    public function setname($name)
    {
        $this->name = $name;
    }

    public function getname()
    {
        return $this->name;
    }

    public function setMail($mail)
    {
        $this->mail = $mail;
    }

    public function getMail()
    {
        return $this->mail;
    }
}

คลาสอ็อบเจ็กต์การเข้าถึงข้อมูลข้อความ:

<?php 
class messageDAO
{
    private $db;
    private $aantalMessages;
    private $messages;
    private $message;

    //bij laden roept hij automatisch Db class aan (en de daarbij gezeten functies)
    public function __construct(Db $db)
    {
        $this->db = $db;
    }

    public function getMessages()
    {
        return $this->messages;
    }

    public function getAantalMessages()
    {
        return $this->aantalMessages;
    }

    //Function to retrieve messages
    public function findMessages($args)
    {       
        $dbh = $this->db->DBH();

        //$offset for pagination
        $offset = ($args['currentPage'] - 1) * $args['itemsPerPage'];

        $sth = $dbh->prepare("SELECT    SQL_CALC_FOUND_ROWS
                                                    messageen.messageID, 
                                                    messageen.message, 
                                                    messageen.name, 
                                                    messageen.mail
                                            FROM    `messageen` 
                                            ORDER BY messageen.datumToegevoegd DESC 
                                            LIMIT   ?, ?");
        $sth->bindParam(1, $offset, PDO::PARAM_INT);
        $sth->bindParam(2, $args['itemsPerPage'], PDO::PARAM_INT);
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);

        $messages = array();

        while($row = $sth->fetch())
        {
            $message = new message();
            $message->setMessageID(htmlentities(strip_tags($row['messageID'])));
            $message->setSessage(htmlentities(strip_tags($row['message'])));
            $message->setName(htmlentities(strip_tags($row['name'])));
            $message->setMail(htmlentities(strip_tags($row['mail'])));  
            $messages[] = $message; 
        }

        $sth = $dbh->prepare("SELECT FOUND_ROWS() as numberOfMessages");
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);
        $this->numberOfMessages = $sth->fetch();

        return $messages;
    }

    public function setMessageToEdit($args)
    {   
        $sth = $this->db->DBH()->prepare("SELECT    messages.message
                                            FROM    `messages`
                                            WHERE   messages.messageID = ?");
        $sth->bindParam(1, $args['messageID']);
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);
        //return the retrieved message
        while($row = $sth->fetch())
        {
            $message = new message();
            $message->setMessage(htmlentities(strip_tags($row['message'])));
            $message->setMessageID(intval($args['messageID']));
        }

        return $message;
    }

    //functie om messageen aan te passen
    public function save(message $message)
    {   
        //insert part
        //if(isset($message->getname()) && isset($message->getmessage()) && isset($message->getMail()))
        //{
            $sth = $this->db->DBH()->prepare("INSERT INTO   `messages`
                                                    SET     messages.name = ?,
                                                            messages.mail = ?,
                                                            messages.message = ?,
                                                            messages.dateAdded = NOW()");
            $sth->bindParam(1, $message->getName());
            $sth->bindParam(2, $message->getMail());
            $sth->bindParam(3, $message->getMessage());
            $sth->execute();
        //}

        //update part       
        /*if(isset($message->getmessageID()) && isset($message->getmessage()))
        {
            $sth = $this->db->DBH()->prepare("UPDATE    `messageen`
                                                SET     messageen.message = ? 
                                                WHERE   messageen.messageID = ?
                                                LIMIT   1");
            $sth->bindParam(1, $message->getmessage());
            $sth->bindParam(2, $message->getmessageID());
            $sth->execute();
        }*/
    }
}

index.php

<?php
//include file loader.php
include("includes/loader.php");

$guestbook = new guestbook($db);
$user = new user($db);
$messageDAO = new messageDAO($db);

//Make a array named error
$error = array();

//Get action (login/setmessage/editmessage/deletemessage)
if(isset($_GET['action']))
{   
    switch ($_GET['action'])
    {   
        //if login submit is pressed
        case 'login':
            //Check if filled
            if(isset($_POST['username']) && isset($_POST['username']))
            {
                $error['usernameEmpty'] = (bool) !strlen(trim($_POST['username']));
                $error['passwordEmpty'] = (bool) !strlen(trim($_POST['password']));
            }

            if(in_array(1, $error))
            {
                //Assign $error to smarty
                $smarty->assign('error', $error);
            }

            else
            {
                if(isset($_POST['username']) && isset($_POST['username']))
                {
                    $user->setLoggedIn(array('username'=>$_POST['username'],
                    'password'=>$_POST['password']));

                    if($user->getLoggedIn() != true)
                    {                   
                        $smarty->assign('loggedInError', $user->getLoggedIn());
                    }
                }
            }
            break;

        //Als if "place message" is pressed
        case 'placemessage':
            //if user is not logged in
            if($user->getLoggedIn() != true)
            {
                //Controleren of message-velden wel zijn ingevuld
                $error['nameEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags($_POST['messagename']))));
                $error['mailEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags($_POST['messageMail']))));
                $error['messageEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags(str_replace('place message...','', $_POST['messageInput'])))));

                if($error['mailEmpty'] != 1)
                {
                    $error['mailInvalid'] = !filter_input((INPUT_POST), 'messageMail', FILTER_VALIDATE_EMAIL);
                }

                if(in_array(1, $error))
                {
                    $smarty->assign('error', $error);
                }

                else
                {
                    $message = new message();

                    $message->setname($_POST['messagename']);
                    $message->setMail($_POST['messageMail']);
                    $message->setmessage($_POST['messageInput']);

                    dump($message);

                    //place message             
                    $messageDAO->save($message);
                }
            }

            //if user is logged in
            else 
            {
                //is message filled?
                $error['messageEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags(str_replace('place hier uw message...','', $_POST['messageInput'])))));

                if($error['messageEmpty'] != 1)
                {   
                    $user->setUser();

                    $guestbook->placemessage(array('name'=>$user->getLoggedInUsername(), 
                    'mail'=>$user->getLoggedInUserMail(),
                    'messageInput'=>$_POST['messageInput']));
                }

                else 
                {
                    $smarty->assign('error', $error);
                }
            }
            break;

        case 'deletemessage':
            $user->setUser();

            if($user->getLoggedInUserAdmin() == 1)
            {
                if(isset($_GET['messageID']) && is_numeric($_GET['messageID']) && isset($_GET['key']))
                {
                    $guestbook->setURLKey($_GET['messageID']);

                    if($guestbook->getURLKey() == $_GET['key'])
                    {                   
                        $guestbook->verwijdermessage(array('messageID'=>$_GET['messageID']));
                    }
                }
            }
            die(header("location: /index.php"));
            break;
    }
}

if(isset($_GET['pagina']) && is_numeric($_GET['pagina']))
{

    $currentpage = $_GET['pagina'];
}

else
{
    //$currentpage is 1
    $currentpage = 1;
}

$user->setUser();

//assign var to smarty
$smarty->assign('messages', $messageDAO->findmessages(array('currentpage'=>$currentpage, 'itemsPerPagina'=>10)));
$smarty->assign('user', $user);

//Pagination

$numbermessages = $messageDAO->getnumbermessages();


$totalpages = ceil($numbermessages['numbermessages'] / 10);


if($currentpage < 1)
{
    //$currentpage is 1
    $currentpage = 1;
}


if($currentpage > $totalpages)
{

    $currentpage = $totalpages;
}

$smarty->assign('numbermessages', $messageDAO->getnumbermessages());
$smarty->assign('guestbook', $guestbook);
$smarty->assign('currentpage', $currentpage);
$smarty->assign('totalpages', $totalpages);

//display index.tpl
$smarty->display('index.tpl');

ฉันเปลี่ยนชื่อตัวแปรและฟังก์ชั่นบางอย่างเพื่อให้เหมาะสมกับคุณ (แปลจากภาษาดัทช์เป็นภาษาอังกฤษ: P) ดังนั้นคุณอาจพบประโยคแปลก ๆ บางครั้งเพราะฉันเพิ่งเปลี่ยนได้อย่างรวดเร็ว ฯลฯ ขอให้สนุกกับมัน นี่ไม่ใช่รหัสทั้งหมดเพราะนั่นจะส่งผลให้ฉันโพสต์เช่นรหัสไฟล์ 20 ไฟล์: P


3

ตามที่อธิบายไว้โดย Explosion Pills ในแอปพลิเคชันที่ซับซ้อนวัตถุส่วนใหญ่เกี่ยวข้องกับส่วนประกอบของแอปพลิเคชัน (เช่นกลุ่มการเชื่อมต่อฐานข้อมูลคำสั่งโครงสร้างข้อมูลเช่น hashmaps) มากกว่าเอนทิตีโลกแห่งความเป็นจริง (เช่นบอร์ดดิ้งพาสใบแจ้งหนี้หรือไฟล์ mp3 ) มีหนังสือดีๆหลายเล่มเกี่ยวกับรูปแบบการออกแบบที่แสดงให้คุณเห็นถึงวิธีการที่ผู้คนได้แก้ไขปัญหาที่เกิดขึ้นซ้ำ ๆ ในพื้นที่นี้ หนังสือ GOF ที่เป็นที่รู้จักนั้นมีความละเอียดถี่ถ้วน แต่แห้งมากรูปแบบ Head First Design อาจเข้าถึงได้มากขึ้น

ในแง่ของการวิเคราะห์และออกแบบโลกแห่งความเป็นจริง มันมักจะเป็นประโยชน์ในการคิดในแง่ของคำนามและคำกริยา ตัวอย่างเช่นห้องสมุดยืมวิดีโอ (ตอนนี้ล้าสมัยแล้วหรือยัง) อาจมีคำนาม / สิ่งต่อไปนี้:

  • วีดีโอ
  • ผู้ยืม

ในแง่ของคำกริยา:

  • ผู้กู้สามารถนำวิดีโอออกมาได้เป็นระยะเวลาหนึ่ง
  • ผู้กู้สามารถคืนวิดีโอไปที่ร้านค้า ฯลฯ

สิ่งเหล่านี้สามารถเปลี่ยนเป็นคลาสพร้อมการดำเนินการ (เป็นเวลานานตั้งแต่ฉันทำ PHP ใด ๆ ดังนั้นฉันจะหลีกเลี่ยง):

class Borrower
{
  public void borrow(Video video, int daysToBorrow)
  {
     ...
  }

  public void returnVideo(Video video, boolean calculateFine)
  {
     ...
  }
}

ทุกอย่างต้องใช้เวลาฝึกฝนและเล่นเป็นอย่างมาก สิ่งที่ดีที่สุดที่ต้องทำคือติดขัดและเรียนรู้จากการออกแบบที่ล้มเหลว ในความคิดของฉัน OO เป็นสิ่งที่คุณสามารถเรียนรู้และพัฒนาต่อไปตลอดชีวิตของคุณ (มันไม่ใช่เรื่องง่ายและไม่มีอะไรที่สมบูรณ์แบบในการแก้ไขปัญหา) การออกแบบที่ดีมักจะซ้ำไปซ้ำมาดังนั้นคาดว่าจะลองใช้แนวคิดที่แตกต่างกันเล็กน้อยสำหรับเว็บแอป "Craig's List"


1

สิ่งที่ดีที่สุดที่ต้องทำคือหาวิธีจดจ่อกับแกนหลักของแอปพลิเคชั่นของคุณ - "โพสต์", "ผู้ใช้", "โพสต์ :: FindByName ()", "ผู้ใช้ -> ตรวจสอบ ()" เป็นต้นและไม่ต้องกังวล มากเกินไปเกี่ยวกับการประปา - วิธีการติดกาวโพสต์ไปยังตารางฐานข้อมูลวิธีการแสดงผลสำหรับการโพสต์ที่สอดคล้องกันระหว่างการค้นหาที่แตกต่างกันและวิธีการกาวแบบฟอร์ม "ใส่โพสต์" เพื่อบันทึกฐานข้อมูล

โชคดีที่มีกรอบมากมายที่ทำเพื่อคุณ กระบวนทัศน์ที่โดดเด่นในเว็บแอพพลิเคชัน OO คือ "Model-View-Controller" หรือที่เรียกว่าMVC ; ใน PHP มีเฟรมเวิร์ก MVC จำนวนหนึ่งที่คุณสามารถใช้ได้

ขณะนี้ขยายความต้องการของคุณเพื่อเรียนรู้ - ตอนนี้คุณต้องเรียนรู้เกี่ยวกับ MVC เช่นเดียวกับ OO - นั่นหมายความว่าความพยายามของ OO ของคุณส่วนใหญ่ถูก จำกัด อยู่กับเลเยอร์ "Model" ซึ่งแสดงถึงโดเมนธุรกิจของคุณ นั่นคือสิ่งที่ OO เป็นธรรมชาติและแสดงออกที่สุด เฟรมเวิร์ก MVC ส่วนใหญ่อนุญาตให้คุณกำหนดเลเยอร์ "โมเดล" ของคุณจากนั้นสร้างเว็บไซต์โดยอัตโนมัติโดยใช้เทคนิคที่รู้จักกันในชื่อ scaffolding - ด้วยวิธีนี้คุณจะได้รับวิธีการทดสอบที่รวดเร็วสำหรับการติดตั้งโดเมนแบบต่างๆ ต้องปลดท่อประปาทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.