পিএইচপি: কখন অ্যারে ব্যবহার করবেন এবং বেশিরভাগ-ডেটা-স্টোরিং কোড কনস্ট্রাক্টের জন্য কখন অবজেক্ট ব্যবহার করবেন?


37

পিএইচপি হ'ল একটি মিশ্র দৃষ্টান্তের ভাষা, অ্যারে হিসাবে অ-অবজেক্ট ডেটা ব্যবহার এবং ফেরত দেওয়ার অনুমতি দেয়। প্রোগ্রামিং কোন নির্দিষ্ট পরিস্থিতিতে কী ব্যবহার করতে চায় তা সিদ্ধান্ত নেওয়ার সময় অ্যারে বনাম অবজেক্টের নির্বাচনের জন্য কিছু গাইডলাইন পরিষ্কার করার চেষ্টা করার জন্য আমি একটি প্রশ্ন উত্থাপন করি।

এটি পিএইচপি ল্যাঙ্গুয়েজ কনস্ট্রাক্টস ব্যবহার করে ডেটা এনকোড করার উপায়গুলি এবং একটি উপায় সম্ভবত ডেটা পাসিং উদ্দেশ্যে (যেমন পরিষেবা-ওরিয়েন্টেড আর্কিটেকচার বা ওয়েব পরিষেবাদি) জন্য অন্যটিকে বেছে নেওয়া উচিত সম্পর্কে সত্যিই একটি প্রশ্ন।

উদাহরণ

ধরুন আপনার কাছে {মূল্য, নাম, অংশ_সংখ্যা, আইটেম_কাউন্ট isting সমন্বিত একটি আইটেম টাইপ রয়েছে} আপনার প্রোগ্রামটি এই জাতীয় বেশ কয়েকটি আইটেমের প্রকারের প্রদর্শন করার জন্য কল করে, যেখানে আপনি প্রতিটি আইটেমের ধরণকে বহিরাগত ধারক হিসাবে কোনও অ্যারে ব্যবহার করার সিদ্ধান্ত নেন । [এছাড়াও আপনি পিএইচপি ব্যবহার করতে পারেন ArrayObjectOO যেমন পণ্য দৃষ্টান্ত জন্য, কিন্তু আমার প্রশ্ন সম্পর্কে নয় যে (বাইরের) অ্যারে]। আমার প্রশ্নটি আইটেমের ধরণের ডেটা কীভাবে এনকোড করতে হবে এবং কোন দৃষ্টান্তটি ব্যবহার করতে হবে সে সম্পর্কে। পিএইচপি আপনাকে ব্যবহার করতে দেয় PHP Native Arraysবা PHP Objects

আমি এই জাতীয় ডেটা এখানে দুটি উপায়ে এনকোড করতে পারি, এরকম:

//PHP's associative arrays:
$ret = array(
    0 => array(
        'cost' => 10.00, 
        'name' => 'item1',
        'part_number' => 'zyz-100', 
        'item_count' => 15
        ),
    1 => array(
        'cost' => 34.00, 
        'name' => 'item2', 
        'part_number' => 'abc-230', 
        'item_count' => 42
        ),
  );

বনাম

//here ItemType is encapsulated into an object
$ret = array(
  0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
  1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);

class ItemType
{
    private $price;
    private $name;
    private $partNumber;
    private $itemCount;

    function __construct($price, $name, $partNumber, $itemCount) {..}
}

আমি কি ভাবছি

অ্যারে এনকোডিং হালকা ওজনযুক্ত এবং আরও বেশি JSON- প্রস্তুত, তবে জগাখিচুড়ি করা সহজতর হতে পারে। মিশে যাওয়া অ্যারে কীগুলির মধ্যে একটিকে মিসস্পেল করুন এবং আপনার একটি ত্রুটি থাকতে পারে যা ধরা আরও কঠিন। তবে এটি একটি ঝোঁক পরিবর্তন করা সহজ। বলুন যে আমি item_countআর সঞ্চয় করতে চাই না, আমি item_countঅ্যারেতে সমস্ত দৃষ্টান্ত সহজেই মুছে ফেলার জন্য যে কোনও পাঠ্য-প্রক্রিয়াকরণ সফটওয়্যার ব্যবহার করতে পারি এবং তারপরে সেগুলি ব্যবহার করে এমন অন্যান্য ফাংশন আপডেট করতে পারি। এটি আরও ক্লান্তিকর প্রক্রিয়া হতে পারে তবে এটি সহজ।

অবজেক্ট ওরিয়েন্টেড এনকোডিং আইডিই এবং পিএইচপি ভাষা সুবিধাগুলির জন্য কল করে এবং আগে থেকে কোনও ত্রুটি ধরা সহজ করে তোলে তবে প্রোগ্রামিং এবং কোডিং প্রথম স্থানে কঠিন is আমি আরও শক্ত বলি, কারণ আপনাকে নিজের অবজেক্ট সম্পর্কে কিছুটা ভাবতে হবে, আগে ভাবুন এবং ওও কোডিং অ্যারে স্ট্রাকচারগুলি টাইপ করার চেয়ে কিছুটা বেশি জ্ঞানীয় লোড নেয়। এটি বলেছিল, একবার এটি কোড আপ হয়ে গেলে, কিছু পরিবর্তন সম্ভবত কার্যকর করা সহজ, এক অর্থে, অপসারণ item_count, উদাহরণস্বরূপ, কোডের কম লাইনে পরিবর্তন প্রয়োজন। কিন্তু এগুলি পরিবর্তনের জন্য অ্যারে পদ্ধতির তুলনায় এখনও একটি উচ্চতর জ্ঞানীয় লোডের প্রয়োজন হতে পারে, যেহেতু উচ্চ-স্তরের ওও সুবিধা জড়িত involved

প্রশ্ন

কিছু ক্ষেত্রে এটি স্পষ্ট, যেমনগুলির ক্ষেত্রে যেমন আমাকে ডেটাতে হেরফের করতে হবে to তবে কিছু ক্ষেত্রে, যেখানে আমাকে "আইটেম টাইপ" ডেটা মাত্র কয়েকটি লাইন সংরক্ষণ করতে হবে সেখানে অ্যারে ব্যবহার করবেন কিনা বা অবজেক্টগুলি নির্মাণ করবেন কিনা তা স্থির করার চেষ্টা করার সময় আমার ঝুঁকির বিষয়ে স্পষ্ট নির্দেশিকা বা বিবেচনা নেই। দেখে মনে হচ্ছে আমি কেবল একটি মুদ্রা টস করতে এবং একটি বাছাই করতে পারি। এখানে ক্ষেত্রে যে কি?


2
উল্লেখ্য আপনি একটি বস্তু একটি অ্যারে কাস্ট করে একটি হালকা বস্তুর পেতে পারেন: (object)['foo'=>'bar']। ফলস্বরূপ মানটি StdClassশ্রেণীবদ্ধ হয়, এর সম্পূর্ণরূপে JSON- এনকোড হবে json_encode()এবং বৈশিষ্ট্যগুলির নাম সহজেই অ্যারে সূচকগুলির নামে পরিবর্তন করা যেতে পারে (যা সর্বদা এত সহজ নয়, যখন এটি কোনও ভেরিয়েবলের মাধ্যমে পরোক্ষভাবে অ্যাক্সেস করা হয়)। যাইহোক, এই জাতীয় মানগুলি নিয়ে বিভিন্ন অপারেশন রয়েছে; উদাহরণস্বরূপ, অ্যারে ইউনিয়নগুলি হওয়ায় আপনার অবজেক্ট ইউনিয়ন নেই এবং আপনি সরাসরি array_*()ফাংশনগুলি ব্যবহার করতে পারবেন না ।
outis

3
: আপনি 3 অপশন আছে 1: array , 2: User-defined Class , 3: stdClass । গতির দিক দিয়ে পারফরম্যান্স তুলনা করার সময় arrayএবং একই সাথে User-defined classযেমন (যেমন আপনার ItemType) বেশ একই রকম হয় তবে সংজ্ঞায়িত classএগুলি ব্যবহার করে arrayএসএমএসের চেয়ে কম মেমরি ব্যবহার করে । stdClassঅন্যদিকে তিনটি বিকল্পের মধ্যে সবচেয়ে ধীর এবং সবচেয়ে বেশি মেমরি ব্যবহার করে।
অ্যান্ডি

উত্তর:


33

আমি এটি যেভাবে দেখছি, এটি পরবর্তীকালে আপনি ডেটা দিয়ে কী করবেন তা নির্ভর করে। কয়েকটি সাধারণ চেকের ভিত্তিতে আপনি নির্ধারণ করতে পারেন যে দুটি ডাটা স্ট্রাকচারের মধ্যে কোনটি আপনার পক্ষে ভাল:

  1. এই ডেটাটির সাথে কি কোনও যুক্তি যুক্ত রয়েছে?

    উদাহরণস্বরূপ, $priceসেন্টের একটি পূর্ণসংখ্যার সংখ্যা হিসাবে সংরক্ষণ করা হয়, তাই $ 9.99 মূল্যযুক্ত একটি পণ্য থাকবে price = 999এবং না price = 9.99? (সম্ভবত, হ্যাঁ) বা কোনও partNumberনির্দিষ্ট রেজেক্সের সাথে মিলের দরকার আছে? অথবা, আপনার অনুসন্ধানের মধ্যে itemCountএটি উপলব্ধ কিনা তা সহজেই খতিয়ে দেখা দরকার? ভবিষ্যতে আপনার এই কাজগুলি করতে হবে? যদি তা হয় তবে আপনার সেরা বেটটি এখনই একটি ক্লাস তৈরি করা। এর অর্থ হ'ল আপনি ডেটা কাঠামোর মধ্যে অন্তর্নির্মিত বাধা এবং যুক্তি সংজ্ঞায়িত করতে পারেন: private $myPriceসেট করে সেট করে 999তবে $item->getPriceString()ফিরে আসে $9.99এবং $item->inStock()আপনার অ্যাপ্লিকেশনটিতে ডাকা হবে।

  2. আপনি কি একাধিক পিএইচপি ফাংশনে এই ডেটাটি চলে যাচ্ছেন?

    যদি তাই হয় তবে একটি ক্লাস ব্যবহার করুন। যদি আপনি এই ডেটাটি একবারে কিছু রূপান্তর সম্পাদন করতে তৈরি করে থাকেন বা অন্য অ্যাপ্লিকেশনে (জাভাস্ক্রিপ্ট বা অন্যথায়) JSON ডেটা হিসাবে প্রেরণ করতে পারেন তবে একটি অ্যারে সহজ পছন্দ। তবে যদি আপনার কাছে আরও দুটি পিএইচপি ফাংশন থাকে যা এই ডেটাটিকে প্যারামিটার হিসাবে গ্রহণ করে, একটি শ্রেণি ব্যবহার করুন। আর কিছু না হলে এটি আপনাকে সংজ্ঞায়িত করতে দেয় someFunction(MyProductClass $product) {এবং আপনার ফাংশনগুলি ইনপুট হিসাবে কী প্রত্যাশা করে তা খুব পরিষ্কার। আপনি যখন আপনার কোডটি স্কেল করেছেন এবং আরও ফাংশন করেছেন প্রতিটি ফাংশন কোন ধরণের ডেটা গ্রহণ করে তা জানা আরও সহজ হবে। দেখা someFunction($someArrayData) {প্রায় পরিষ্কার হিসাবে না। এছাড়াও, এটি ধরণের সামঞ্জস্যতা প্রয়োগ করে না এবং এর অর্থ (যেমন আপনি বলেছেন) অ্যারের নমনীয় কাঠামোটি পরে বিকাশের ব্যথা ঘটাতে পারে

  3. আপনি কি একটি লাইব্রেরি তৈরি করছেন বা ভাগ করা কোড বেস?

    যদি তাই হয়, একটি ক্লাস ব্যবহার করুন! আপনার লাইব্রেরিটি ব্যবহার করছেন এমন কিছু নতুন বিকাশকারী, বা কোম্পানির অন্য কোনও বিকাশকারী যারা আপনার কোড আগে কখনও ব্যবহার করেন নি সে সম্পর্কে চিন্তা করুন। শ্রেণীর সংজ্ঞাটি দেখতে এবং সেই শ্রেণিটি কী করে তা বুঝতে বা তাদের লাইব্রেরিতে একটি নির্দিষ্ট শ্রেণীর অবজেক্ট গ্রহণ করে এমন অনেকগুলি ক্রিয়াকলাপ দেখে তাদের পক্ষে কাঠামোটি উত্পন্ন করার জন্য প্রয়োজনীয় কাঠামোটি চেষ্টা করার চেয়ে অনুমান করা আরও সহজ হবে they অ্যারে সংখ্যা এছাড়াও, এটি # 1 দিয়ে ডেটা ধারাবাহিকতার বিষয়গুলিকে স্পর্শ করে: আপনি যদি একটি লাইব্রেরি বা ভাগ করা কোড ভিত্তি বিকাশ করে থাকেন তবে আপনার ব্যবহারকারীদের জন্য ভাল হোন: তাদের এমন শ্রেণি দিন যা ডেটা ধারাবাহিকতা প্রয়োগ করে এবং আপনার ডেটার নকশায় ত্রুটিগুলি থেকে রক্ষা করে classes ।

  4. এটি কি কোনও অ্যাপ্লিকেশনটির একটি ছোট অংশ বা কেবলমাত্র ডেটা ট্রান্সফর্মেশন? আপনি কি উপরের কোনওটির সাথে খাপ খায় না?

    একটি ক্লাস খুব বেশি হতে পারে; কোনও অ্যারে ব্যবহার করুন যদি এটি আপনার পক্ষে উপযুক্ত হয় এবং আপনি এটি আরও সহজ পান। উপরে উল্লিখিত হিসাবে, আপনি যদি কেবল জেএসএন বা ওয়াইএমএল বা এক্সএমএল বা যেকোন কিছু প্রেরণের জন্য কাঠামোগত ডেটা তৈরি করছেন, প্রয়োজন না থাকলে ক্লাস নিয়ে বিরক্ত করবেন না। আপনি যদি বৃহত্তর অ্যাপ্লিকেশনটিতে একটি ছোট মডিউল লিখছেন, এবং আপনার কোডের সাথে অন্য কোনও মডিউল / টিমকে ইন্টারফেসের প্রয়োজন নেই, সম্ভবত একটি অ্যারে যথেষ্ট।

শেষ পর্যন্ত, আপনার কোডের স্কেলিংয়ের প্রয়োজনীয়তাগুলি বিবেচনা করুন এবং কাঠামোগত অ্যারের চেয়ে দ্রুত বিবেচনা করা দ্রুত সমাধান হতে পারে তবে একটি শ্রেণি অনেক বেশি স্থিতিস্থাপক এবং স্কেলযোগ্য সমাধান।

এছাড়াও, নিম্নলিখিতটি বিবেচনা করুন: আপনার যদি কোনও শ্রেণি থাকে এবং আপনি JSON এ আউটপুট নিতে চান json_data()তবে ক্লাসের কোনও ডেটা JSON-ifiable অ্যারে প্রদান করে যা আপনার ক্লাসের কোনও পদ্ধতি নির্ধারণ করতে পারবেন না এমন কোনও কারণ নেই । আমার পিএইচপি অ্যাপ্লিকেশনগুলিতে আমি যা করেছি যেখানে জেএসএন হিসাবে ক্লাসের ডেটা প্রেরণের দরকার ছিল। উদাহরণ হিসাবে:

class Order {
    private $my_total;
    private $my_lineitems;

    public function getItems() { return $this->my_lineitems; }
    public function addItem(Product $p) { $this->my_lineitems[] = $p; }
    public function getTotal() { return $this->my_total; }

    public function forJSON() {
        $items_json = array();
        foreach($this->my_lineitems as $item) $items_json[] = $item->forJSON();
        return array(
            'total' => $this->getTotal(),
            'items' => $items_json
        );
    }
}

$o = new Order();
// do some stuff with it
$json = json_encode($o->forJSON());

আপনি এর উপাদানগুলি পরিবর্তন করছেন না my_lineitems, সুতরাং রেফারেন্সের মাধ্যমে সেগুলি পাওয়া অপ্রয়োজনীয়, বিশেষত যেহেতু ভেরিয়েবলগুলি কেবলমাত্র বস্তুর কাছে একটি সনাক্তকারী রাখে, অবজেক্টটি নিজেই নয়। php.net/manual/en/language.oop5.references.php
চিনোটো ভোকরো

একমত। আমি মনে করি যে এটি একটি বৃহত্তর অ্যাপ্লিকেশনগুলির একটি স্নিপেট ছিল যা কোনও কারণে বা কোনও কিছুর জন্য রেফারেন্সের প্রয়োজন ছিল ...
জোশ

2

আপনি জসনসারিয়ালাইজেবল ইন্টারফেস ব্যবহার করে জেসন স্ট্রাকচার বাস্তবায়ন করতে পারেন এবং কোনওভাবেই নেস্টেড অ্যারে / ক্লাস ব্যবহার করতে পারেন। ক্লাসটি গেট / সেট অপারেশনগুলিতে দ্রুত এবং ডিবাগ করা সহজ। সঙ্গে এরে আপনি কোন ঘোষণা প্রয়োজন।

class Order implements \JsonSerializable{
    private $my_total;
    private $my_lineitems;

    public function getItems() { return $this->my_lineitems; }
    public function addItem(Product $p) { $this->my_lineitems[] = $p; }
    public function getTotal() { return $this->my_total; }

    public function jsonSerialize(){
        return [
            'total'=>$this->my_total,
            'products'=>$this->my_lineitems;
        ];
    }
}

class Product implements \JsonSerializable{
    private $name;
    private $price;

    public function jsonSerialize(){ 
        return [
            'name'=>$this->name, 
            'price'=>$this->price
        ];
    }
}

$order = new Order();
$order->addProduct(new Product('Product1', 15));
$order->addProduct(new Product('Product2', 35));
$order->addProduct(new Product('Product3', 42));
$json = json_encode(['order'=>$order, 'username'=>'Eughen']);
/*
json = {
    order: {
        total: 92, 
        products: [
            {
                name: 'Product1',
                price: 15
            }, 
            {
                name: 'Product2',
                price: 35
            },
            {
                name: 'Product3',
                price: 42
            }
        ]
    }, 
    username: 'Eughen'
}
*/

এই প্রশ্নটি বিদ্যমান স্বীকৃত উত্তরকে কী যুক্ত করে?
esoterik

@ এসোটারিক বাসা বাঁধছেন json_encode(['order'=>$o]);existsing গ্রহণযোগ্য উত্তর ফাঁকা হল: {"order":{}}। অবশ্যই আপনি ব্যবহার করতে পারবেন: $o->forJSON()প্রতিবার প্রতিটি স্তরের প্রতিটি বস্তুর উপর, তবে এটি সত্যিকারের ভাল নকশা নয়। কারণ সব সময় আপনার মতো কিছু লেখার দরকার রয়েছে: $items_json = array(); foreach($this->my_lineitems as $item) $items_json[] = $item->forJSON();
এল '
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.