मैं एक साधारण, लेकिन वास्तविक दुनिया, वेब ऐप बनाने के लिए ओओपी अवधारणाओं को कैसे लागू कर सकता हूं? [बन्द है]


25

मैं OOP के चारों ओर अपना सिर लपेटने के लिए लंबे समय से कोशिश कर रहा हूं। मुझे इसके फायदे नजर आते हैं। मैंने कई, कई ट्यूटोरियल पढ़े हैं और इस विषय पर समान मात्रा में वीडियो देखा है। मुझे जानवर / बिल्ली / कुत्ते के उदाहरण मिलते हैं, मुझे कार / ड्राइव के उदाहरण मिलते हैं। मैं इनसे जूझ रहा हूं कि इन अवधारणाओं को वास्तविक दुनिया में कैसे लागू किया जाए। इसलिए, मैं OOP का उपयोग करके निर्माण करने के लिए तैयार हूं।

मैं वाक्यविन्यास या विशिष्ट कोड लिखने में सहायता के लिए नहीं कह रहा हूं - मैं खुद को दस्तावेज़ीकरण और मंचों आदि की खोज करके पा सकता हूं .. मुझे वास्तव में कुछ मार्गदर्शन की आवश्यकता है, और हर बार सही दिशा में एक धक्का। क्या कोई अनुभवी प्रोग्रामर मुझे सलाह देने के लिए तैयार हैं?

मेरी सीखने की परियोजना के रूप में मैं एक सरल वर्गीकृत "वेब ऐप" बनाना चाहूंगा। क्रेगलिस्ट के समान कुछ लेकिन गुंजाइश के मामले में नीचे पानी। मैं PHP5 और MySQL का उपयोग करना चाहूंगा, क्योंकि मैं उनसे परिचित हूं।

मान लीजिए कि केवल 2 उपयोग के मामले हैं:

  1. बिक्री के लिए कुछ पोस्ट करना
  2. खरीदने के लिए किसी चीज़ की खोज / खोज करना

वस्तुओं को "क्या" होना चाहिए? मैं सोच सकता हूं कि प्रत्येक वस्तु एक वस्तु हो सकती है, लेकिन किस बिंदु पर? और क्यों?

उदाहरण के लिए, उपयोगकर्ता "बिक्री के लिए पोस्ट आइटम" फॉर्म भरता है, क्या उस फॉर्म को एक ऑब्जेक्ट में बदल दिया जाना चाहिए जो किसी अन्य ऑब्जेक्ट को पास हो जाता है जो एक डेटाबेस में मान डालता है?

जब कोई अन्य उपयोगकर्ता ब्राउज़ कर रहा है और श्रेणी सी के सभी आइटम देखने का अनुरोध करता है तो क्या होगा? क्या यह समझ में आता है कि जब भी ऐप को अपने डेटाबेस से कनेक्ट करना होता है तो वह डेटाबेस ऑब्जेक्ट बनाता है और फिर आइटम ऑब्जेक्ट का एक गुच्छा प्राप्त करता है और उन्हें पृष्ठ पर प्रदर्शित करता है? ... यह लिखना निश्चित रूप से मुझे एहसास दिलाता है कि मैं अब भी ओओपी के बारे में कितना स्पष्ट हूं। कृपया मुझे ठीक करने में मदद करें।

यदि आपकी राय में, यह OOP के साथ शुरू करने के लिए एक अच्छी परियोजना नहीं है, तो कृपया एक और विचार सुझाने के लिए स्वतंत्र महसूस करें!


1
मैं एक ही नाव में हूं, मुझे लगता है कि मैं ओओपी को समझता हूं - जब मैंने जावा का प्रयास किया था, तब से कुछ समय हो गया है, लेकिन जब यह PHP की बात आती है, तो मुझे पता होगा कि इस तरह से चीजों को तुरंत 'सामान्य' तरीके से कैसे करना है लेकिन जब यह सोचने की बात आती है कि कैसे यह ओओपी का उपयोग करके किया जाएगा मैं जीने की इच्छा खो देता हूं।
martincarlin87

फॉर्म को ऑब्जेक्ट में नहीं बदला जाता है। एक वस्तु एक वर्ग का एक उदाहरण है। आप इसे इस तरह देख सकते हैं। $ आइटम-> saveItem ($ _ POST ['नाम'], $ _POST ['विवरण']); संपादित करें क्या वास्तव में मुझे पता लगाने में मदद मिली कि ओओपी एक सरल "गेस्टबुक" वेब-ऐप बना रहा है। उपयोगकर्ताओं को लॉग इन करें, संदेश पोस्ट करें, संदेश संपादित करें, संदेश हटाएं और संदेशों की खोज करें आदि

@pduersteler अच्छा विचार है, मैं इसे कैसे करूं? बेशक, स्टैकओवरफ्लो पर मेरा यह पहला सवाल है :)

@Bono हो सकता है कि आपके द्वारा बताई गई एक गेस्टबुक ऐप वास्तव में शुरू करने के लिए एक बेहतर जगह है। मैं जिस अन्य के बारे में सोच रहा था, वह एक बहुत ही सरल सूची ऐप था जहां उपयोगकर्ता सूची में लॉगिन / बनाते / हटाते हैं, उन सूचियों में आइटम जोड़ / हटाते हैं। क्या आप हमारे / मेरे साथ अपनी गेस्टबुक ऐप साझा करने का मन करेंगे?

मुझे इसे साझा करने में कोई आपत्ति नहीं होगी, हालांकि यह पोस्ट करने के लिए कोड का एक लूप होगा। यदि आप चाहते हैं तो मैं आपके साथ एक सरल उदाहरण वर्ग साझा कर सकता हूं। इसके अलावा, मुझे नहीं पता कि यह कोड कितनी अच्छी तरह काम करेगा, क्योंकि काफी स्पष्ट रूप से यह एक समय हो चुका है: पी मैं इसे नीचे पोस्ट करूंगा

जवाबों:


17

मैं ईमानदारी से सोचता हूं कि नए OO शिक्षार्थियों के लिए यहां की सलाह अब तक भयानक रही है। किसी वर्ग द्वारा परिभाषित "चीज़" के एक विशिष्ट उदाहरण के रूप में वस्तुओं को तुरंत सोचना शुरू करना एक अच्छा विचार नहीं है। एक मशीन के कंपोस्लाइज्ड घटकों के रूप में उनके बारे में सोचना बेहतर है जो एक-दूसरे के साथ कुछ बातचीत करते हैं, लेकिन एक-दूसरे के इंटर्नल नहीं। इनमें से प्रत्येक घटक राज्य बनाए रखता है

यदि आप DB इंटरैक्शन के लिए ORM (ऑब्जेक्ट-रिलेशनल-मैपिंग) का उपयोग करना चाहते हैं, तो जो भी फ्रेमवर्क आप उपयोग करते हैं या बनाते हैं, उसमें संभवतः कुछ उथली वस्तुएं होती हैं जो तालिकाओं का प्रतिनिधित्व करती हैं, जो संभवत: "चीजों" का संग्रह हैं, लेकिन मुझे व्यक्तिगत रूप से ORM पसंद नहीं है। , और मुझे नहीं लगता कि वे आदर्श OO प्रथाओं का प्रतिनिधित्व करते हैं, लेकिन वे बड़े वेब-ऐप्स के लिए लोकप्रिय हैं।

इसके अलावा, आपके पास संभवतः कुछ महत्वपूर्ण घटक होंगे जिन्हें वेब-ऐप मशीन को चलाने की आवश्यकता है जैसे एक या एक से अधिक DB कनेक्शन (आप एक वर्ग बना सकते हैं जो एक कनेक्शन बनाए रखता है और आप तैयार किए गए प्रश्नों को चला सकते हैं - PDOअपने आप में महान है , लेकिन मैं इसे लपेटूंगा), और शायद आपके विचारों के लिए एक टेम्पलेट प्रणाली। आप अपने नियंत्रकों को पीएचपी ऑब्जेक्ट भी मान सकते हैं। यदि आपके पास भरने के लिए एक फॉर्म है, तो आपके पास एक ऑब्जेक्ट हो सकता है जो पी / आर / जी, एक सीएसआरएफ-सुरक्षा टोकन के लिए फॉर्म वैल्यू बनाए रखता है, और इसके इनपुट पर सत्यापन कर सकता है।

आपको अपने वेब-ऐप डिज़ाइन और ऑब्जेक्ट ग्राफ़ का निर्माण करते समय वस्तुओं को चालू करने के लिए "चीजों" को देखने की कोशिश नहीं करनी चाहिए। इसके बजाय, आपको इसे बनाने के लिए आने वाले तार्किक घटकों के बारे में सोचना चाहिए। मुझे नहीं लगता कि आपको इसे मजबूर करने की कोशिश करनी चाहिए, और इसे स्वाभाविक रूप से आना चाहिए, लेकिन इसे सही ढंग से करना बहुत कठिन है और आप निश्चित रूप से रास्ते में कुछ डिज़ाइन निर्णय बदलने के लिए समाप्त हो जाएंगे।

मेरी अंतिम सलाह यह है: वंशानुक्रम पर रचना जाने का रास्ता है।


मेरे पास अंगूठे का एक नियम, विशेष रूप से गतिशील भाषाओं के लिए, केवल वर्गों को बनाने की कोशिश करना है यदि मैं बहुरूपता का लाभ उठाना चाहता हूं (अर्थात, यदि वे कक्षाएं एक ही विधि के विभिन्न संस्करणों को लागू करेंगे, और तर्क उस पर निर्भर करेगा किसी न किसी तरह)। अन्यथा, मैं इसे सरल रखने के लिए और अधिक "प्रक्रियात्मक" शैली में लिखने की कोशिश करता हूं।
हगोमग

9

यहां बताया गया है कि आप अपने पालतू जानवरों को खरीदने और बेचने के लिए ओओपी का उपयोग कैसे कर सकते हैं, उसी पद्धति का उपयोग कारों या पी को बेचने के लिए किया जा सकता है

<?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
अगर मुझे कारों या जानवरों के साथ एक और ऊप उदाहरण दिखाई देता है, तो मैं इसे खो देता हूँ
नील मैकगिगन

5

ओपी के अनुरोध पर मैं अपना गेस्टबुक कोड साझा करूंगा।
संदेश वर्ग:

<?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');

मैंने कुछ चर और फ़ंक्शन का नाम बदलकर आपको समझ में आने के लिए (डच से अंग्रेजी में अनुवाद: पी) किया है, इसलिए आपको कभी-कभी कुछ अजीब भावनाएं मिल सकती हैं, क्योंकि मैंने बस एक त्वरित प्रतिस्थापन किया था आदि इसके साथ मज़े करते हैं। इसके अलावा यह पूरा कोड नहीं है, क्योंकि इससे मुझे कोड के लायक 20 फाइलों की तरह पोस्टिंग मिलेगी: पी


3

जैसा कि धमाका पिल्स द्वारा उल्लेख किया गया है, एक जटिल एप्लिकेशन में अधिकांश ऑब्जेक्ट वास्तविक विश्व संस्थाओं (जैसे एक बोर्डिंग पास, चालान, या एमपी 3 फ़ाइल) के बजाय एप्लिकेशन घटकों (जैसे डेटाबेस कनेक्शन पूल, कमांड, डेटा संरचनाएं जैसे हैशमैप) से संबंधित हैं। )। डिज़ाइन पैटर्न पर कई अच्छी किताबें हैं जो आपको ऐसे तरीके दिखाती हैं कि लोगों ने इस क्षेत्र में आवर्ती समस्याओं का बहुत हल किया है। GOF पुस्तक जैसा कि ज्ञात है कि यह पूरी तरह से सूखा है, लेकिन हेड फर्स्ट डिज़ाइन पैटर्न अधिक सुलभ हो सकता है।

वास्तविक विश्व विश्लेषण और डिजाइन के संदर्भ में। संज्ञा और क्रिया के संदर्भ में विचार करना अक्सर सहायक होता है। उदाहरण के लिए एक वीडियो उधार देने वाली लाइब्रेरी (अब ये अप्रचलित हैं?) में ये चीजें हो सकती हैं / संज्ञा:

  • वीडियो
  • उधार लेने वाला

क्रियाओं के संदर्भ में:

  • एक उधारकर्ता लंबे समय तक एक वीडियो निकाल सकता है
  • एक उधारकर्ता एक वीडियो को स्टोर आदि में वापस कर सकता है।

ये तब संचालन के साथ कक्षाओं में बदल सकते हैं (यह एक लंबा समय है क्योंकि मैंने कोई भी पीएचपी किया है इसलिए मैं इससे बचूंगा):

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

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

यह सब बहुत अभ्यास करता है और चारों ओर खेलता है। सबसे अच्छी बात यह है कि असफल डिजाइनों में फंस जाओ और सीखो। मेरी राय में OO एक ऐसी चीज़ है जिसे आप अपने जीवनकाल में सीखते और विकसित कर सकते हैं (यह आसान नहीं है और किसी भी चीज़ का कोई सही समाधान नहीं है)। अच्छा डिज़ाइन अक्सर पुनरावृत्त होता है, इसलिए अपने "क्रेग की सूची" वेबएप के लिए कुछ अलग विचारों को आज़माने की उम्मीद करें।


1

सबसे अच्छी बात यह है कि अपने आवेदन के मूल पर ध्यान केंद्रित करने का एक तरीका खोजें - "पोस्ट", "उपयोगकर्ता", "पोस्ट :: FindByName ()", "उपयोगकर्ता-> मान्य ()" आदि, और चिंता न करें। नलसाजी के बारे में बहुत कुछ - कैसे डेटाबेस तालिकाओं के लिए पदों को गोंद करें, कैसे एक पोस्ट को विभिन्न खोजों के बीच सुसंगत रखने के लिए, और एक डेटाबेस रिकॉर्ड में "एंट्री पोस्ट" फ़ॉर्म को कैसे गोंद करें।

सौभाग्य से, बहुत सारे ढांचे हैं जो आपके लिए ऐसा करते हैं; OO वेब अनुप्रयोगों में प्रमुख प्रतिमान "मॉडल-व्यू-कंट्रोलर" है, जिसे MVC के रूप में भी जाना जाता है ; PHP में, कई ऑफ-द-शेल्फ MVC फ्रेमवर्क हैं जिनका आप उपयोग कर सकते हैं।

जब भी यह सीखने की आपकी आवश्यकता को बढ़ाता है - आपको अब MVC के साथ-साथ OO के बारे में भी सीखना होगा - इसका मतलब है कि आपके OO प्रयास ज्यादातर "मॉडल" परत के लिए विवश हैं, जो आपके व्यवसाय डोमेन का प्रतिनिधित्व करता है; यही वह जगह है जहाँ OO सबसे स्वाभाविक और अभिव्यंजक है। अधिकांश MVC फ्रेमवर्क आपको अपनी "मॉडल" परत को परिभाषित करने की अनुमति देते हैं, और फिर स्वचालित रूप से एक वेब साइट बनाते हैं जो मचान के रूप में ज्ञात तकनीक का उपयोग करते हुए - इस तरह, आपको अपने डोमेन मॉडल के लिए विभिन्न कार्यान्वयन के साथ प्रयोग करने का एक त्वरित तरीका मिलता है, बिना सभी पाइपलाइन अनपिक करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.