স্থির বনাম তাত্ক্ষণিক ক্লাস কখন ব্যবহার করবেন


170

পিএইচপি আমার প্রথম প্রোগ্রামিং ভাষা is তাত্ক্ষণিক বস্তু বনাম স্ট্যাটিক ক্লাস কখন ব্যবহার করতে পারি সে সম্পর্কে আমি আমার মাথাটি প্রায় পুরোপুরি গুটিয়ে রাখতে পারি না।

আমি বুঝতে পারি যে আপনি অনুলিপি করতে পারেন এবং বস্তুর ক্লোন করতে পারেন। তবে আমার সমস্ত সময়ে পিএইচপি ব্যবহার করে যে কোনও অবজেক্ট বা ফাংশন সর্বদা একক রিটার্ন (অ্যারে, স্ট্রিং, ইনট) মান বা শূন্য হিসাবে শেষ হয়।

আমি ভিডিও গেমের চরিত্র শ্রেণীর মতো বইগুলিতে ধারণাগুলি বুঝতে পারি। ডুপ্লিকেট কার অবজেক্ট এবং নতুনটিকে লাল করে তুলুন , এটি সমস্ত কিছু বোধগম্য হয় তবে পিএইচপি এবং ওয়েব অ্যাপ্লিকেশনগুলিতে এর প্রয়োগটি কী নয়।

একটি সহজ উদাহরণ। একটি ব্লগ. কোনও ব্লগের কোন বিষয়গুলি স্থির বা তাত্ক্ষণিকভাবে কার্যকর হিসাবে কার্যকর করা হবে? ডিবি ক্লাস? বিশ্বব্যাপী সুযোগে কেন কেবল ডিবি অবজেক্ট ইনস্ট্যান্ট করবেন না? পরিবর্তে প্রতিটি বস্তু স্থির করে না কেন? অভিনয় সম্পর্কে কি?

সব কি কেবল স্টাইল? এই জিনিসগুলি করার কি কোনও সঠিক উপায় আছে?

উত্তর:


123

এটি বেশ আকর্ষণীয় প্রশ্ন - এবং উত্তরগুলি আকর্ষণীয়ও হতে পারে ^^

জিনিসগুলি বিবেচনা করার সহজ উপায় হ'ল:

  • একটি ইনস্ট্যান্সিয়েটেড ক্লাস ব্যবহার করুন যেখানে প্রতিটি বস্তুর নিজস্ব ডেটা থাকে (যেমন ব্যবহারকারীর নাম রয়েছে)
  • একটি স্ট্যাটিক ক্লাস ব্যবহার করুন যখন এটি কেবল একটি সরঞ্জাম যা অন্যান্য স্টাফগুলিতে কাজ করে (উদাহরণস্বরূপ, বিবি কোডের জন্য এইচটিএমএলে একটি সিনট্যাক্স রূপান্তরকারী; এটির নিজস্ব জীবন নেই)

(হ্যাঁ, আমি স্বীকার করি, সত্যিই অতি মাত্রায় সরলীকৃত ...)

স্ট্যাটিক পদ্ধতি / ক্লাস সম্পর্কে একটি বিষয় হ'ল তারা ইউনিট পরীক্ষার সুবিধা দেয় না (কমপক্ষে পিএইচপিতে, তবে সম্ভবত অন্যান্য ভাষায়ও)।

স্ট্যাটিক ডেটা সম্পর্কে আরেকটি বিষয় হ'ল এটির একটি মাত্র উদাহরণ আপনার প্রোগ্রামে বিদ্যমান: আপনি যদি মাইক্লাস :: $ মাইডাটা কোথাও কোনও মূল্যে সেট করেন তবে তার এই মানটি থাকবে এবং কেবল যেখানেই থাকবে - ব্যবহারকারী সম্পর্কে কথা বললে, আপনার কেবলমাত্র একজন ব্যবহারকারী থাকতে সক্ষম হবেন - যা এত বড় নয়, তাই না?

একটি ব্লগ সিস্টেমের জন্য, আমি কী বলতে পারি? স্থির হিসাবে আমি লেখার মতো অনেক কিছুই নেই, আসলে আমার মনে হয়; সম্ভবত ডিবি-অ্যাক্সেস ক্লাস, তবে সম্ভবত শেষ পর্যন্ত না ^^


সুতরাং মূলত কোনও ফটো, ব্যবহারকারী, পোস্ট ইত্যাদির মতো অনন্য জিনিসের সাথে কাজ করার সময় অবজেক্টগুলি ব্যবহার করুন এবং সাধারণ জিনিসের জন্য স্ট্যাটিক ব্যবহার করুন?
রবার্ট রোচা 21

1
ব্যবহারকারীর সম্পর্কে ভালভাবে বলতে গেলে, প্রতিটি অনুরোধে আপনার কেবলমাত্র একটি সক্রিয় ব্যবহারকারী রয়েছে। অনুরোধ স্থির সক্রিয় ব্যবহারকারীকে
ঘৃণা করা অর্থপূর্ণ

69

স্থির পদ্ধতি ব্যবহারের বিরুদ্ধে প্রধান দুটি কারণ হ'ল:

  • স্ট্যাটিক পদ্ধতি ব্যবহার করে কোড পরীক্ষা করা শক্ত
  • স্ট্যাটিক পদ্ধতি ব্যবহার করে কোডটি প্রসারিত করা শক্ত

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

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

পরিবর্তে থাকার কারণে:

class HttpClient
{
    public function request()
    {
        return HttpResponse::build();
    }
}

আমাদের বরং করা উচিত:

class HttpClient
{
    private $httpResponseFactory;

    public function __construct($httpResponseFactory)
    {
        $this->httpResponseFactory = $httpResponseFactory;
    }

    public function request()
    {
        return $this->httpResponseFactory->build();
    }
}

এবং তারপরে, সূচক / প্রধান পৃষ্ঠায়, আমরা করতাম (এটি হ'ল অবজেক্ট ওয়্যারিং স্টেপ, বা প্রোগ্রামটি ব্যবহারের জন্য উদাহরণগুলির গ্রাফ তৈরির সময়):

$httpResponseFactory = new HttpResponseFactory;
$httpClient          = new HttpClient($httpResponseFactory);
$httpResponse        = $httpClient->request();

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

মিউকো হেভরি সিঙ্গলটনের এবং সিঙ্গলটনের মধ্যেও একটি স্পষ্ট পার্থক্য তৈরি করে (মূলধন এস সহ বা ছাড়াই)। পার্থক্য খুব সহজ। একটি নিম্ন কেস "s" সহ সিঙ্গেলটনগুলি সূচক / প্রধানতে তারের দ্বারা প্রয়োগ করা হয়। আপনি এমন কোনও শ্রেণীর কোনও অবজেক্ট ইনস্ট্যান্ট করেন যা সিঙ্গলটন প্যাটার্নটি প্রয়োগ করে না এবং যত্ন নেবেন যে আপনি কেবলমাত্র এই দৃষ্টান্তটি অন্য যে কোনও প্রয়োজনে প্রেরণ করবেন। অন্যদিকে, সিঙ্গেলটন, মূলধন "এস" সহ ধ্রুপদী (বিরোধী) প্যাটার্নের প্রয়োগ। মূলত ছদ্মবেশে একটি গ্লোবাল যা পিএইচপি বিশ্বে খুব বেশি ব্যবহার করে না। আমি এখন পর্যন্ত একটিও দেখিনি। আপনি যদি চান যে আপনার একক ডিবি সংযোগটি আপনার সমস্ত শ্রেণীর দ্বারা ব্যবহৃত হয় তবে এটি এটি করা ভাল:

$db = new DbConnection;

$users    = new UserCollection($db);
$posts    = new PostCollection($db);
$comments = new CommentsCollection($db);

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

/**
 * An example of a test using PHPUnit. The point is to see how easy it is to
 * pass the UserCollection constructor an alternative implementation of
 * DbCollection.
 */
class UserCollection extends PHPUnit_Framework_TestCase
{
    public function testGetAllComments()
    {
        $mockedMethods = array('query');
        $dbMock = $this->getMock('DbConnection', $mockedMethods);
        $dbMock->expects($this->any())
               ->method('query')
               ->will($this->returnValue(array('John', 'George')));

        $userCollection = new UserCollection($dbMock);
        $allUsers       = $userCollection->getAll();

        $this->assertEquals(array('John', 'George'), $allUsers);
    }
}

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

স্থিতিশীল পদ্ধতি যা স্থির বৈশিষ্ট্যের সাথে লেনদেন করে না সেগুলির কার্যকারিতা হওয়া উচিত। পিএইচপি এর ফাংশন রয়েছে এবং আমাদের সেগুলি ব্যবহার করা উচিত।


1
@ আইনুট, আমি যে একটুখানি সন্দেহ করি না। আমি বুঝতে পারি যে পাশাপাশি অবস্থান / ভূমিকারও মূল্য আছে; যাইহোক, এক্সপি / অ্যাগিল সম্পর্কিত সমস্ত কিছুর মতো এটির সত্যিই এক ফ্লুজ নাম রয়েছে।
জেসন

2
"নির্ভরতা ইনজেকশন" আমি বিশ্বাস করি এটি এর জন্য অত্যধিক জটিল শব্দযুক্ত শব্দ। প্রচুর পরিমাণে এবং এর উপর প্রচুর পড়া এবং সমস্ত গুগল-ল্যান্ড। "সিঙ্গলেটন" যতদূর যেতে পারে, এখানে এমন একটি বিষয় যা আমাকে সত্যিই ভাবতে বাধ্য করেছে: স্লাইডারসনেট.এন.গো_ও_হ, পিএইচপি সিঙ্গেলনগুলি কেন সত্যই কোনও অর্থ বোধ করে না সে সম্পর্কে একটি আলোচনা। আশা করি এটি কোনও পুরানো প্রশ্নের ক্ষেত্রে কিছুটা অবদান রাখবে :)
ডুয়াদওয়াদ

22

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

titleএকটি অ স্থিতিশীল সদস্য হতে হবে। এটিতে that ব্লগ পোস্টের শিরোনাম রয়েছে। আমাদের একটি পদ্ধতিও বলা হতে পারে find_related()। এটি অচল নয় কারণ এর জন্য ব্লগ পোস্ট শ্রেণির নির্দিষ্ট উদাহরণ থেকে তথ্য প্রয়োজন।

এই শ্রেণিটি এরকম কিছু দেখায়:

class blog_post {
    public $title;
    public $my_dao;

    public function find_related() {
        $this->my_dao->find_all_with_title_words($this->title);
    }
}

অন্যদিকে, স্ট্যাটিক ফাংশনগুলি ব্যবহার করে আপনি এর মতো ক্লাস লিখতে পারেন:

class blog_post_helper {
    public static function find_related($blog_post) {
         // Do stuff.
    }
}

এই ক্ষেত্রে, যেহেতু ফাংশনটি স্থিতিশীল এবং কোনও নির্দিষ্ট ব্লগ পোস্টে অভিনয় করে না, তাই আপনাকে অবশ্যই যুক্তি হিসাবে ব্লগ পোস্টে পাস করতে হবে।

মূলত এটি অবজেক্ট ওরিয়েন্টড ডিজাইন সম্পর্কে একটি প্রশ্ন। আপনার ক্লাসগুলি আপনার সিস্টেমে বিশেষ্য, এবং তাদের উপর যে ক্রিয়াগুলি কাজ করে সেগুলি ক্রিয়াপদ। স্ট্যাটিক ফাংশন পদ্ধতিগত হয়। আপনি আর্গুমেন্ট হিসাবে ফাংশন অবজেক্টে পাস।


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

ওও দৃশ্যে, আপনি নিজের BlogPostশ্রেণিতে এমন পদ্ধতি লিখেন যা পৃথক পোস্টগুলিতে কাজ করে এবং আপনি স্ট্যাটিক পদ্ধতিগুলি লেখেন যা পোস্টগুলির সংগ্রহগুলিতে কাজ করে।


4
এই উত্তরটি বেশ ভাল, বিশেষত আপনি যে আপডেটটি করেছেন তা নিয়ে, কারণ এই কারণেই আমি এই প্রশ্নটি শেষ করেছি। আমি "::" বনাম "$ এটি" এর কার্যকারিতাটি বুঝতে পারি, তবে আপনি যখন অ্যাকাউন্টে যোগ করেন, আপনি ব্লগপোস্টগুলি উদাহরণস্বরূপ একটি ডিবি থেকে একটি সহযোগী অ্যারেতে উত্তোলনের বিষয়ে তুলে ধরেছেন .. এটি সম্পূর্ণ নতুন মাত্রা যুক্ত করে, এটি হ'ল এছাড়াও এই প্রশ্নের অন্তর্নিহিত সুরে।
গারবেন জ্যাকবস

এটি বহুল জিজ্ঞাসিত পিএইচপি প্রশ্নের একটি সেরা ব্যবহারিক (বনাম তাত্ত্বিক) উত্তর, সংযোজনটি খুব সহায়ক। আমি মনে করি এটিই উত্তর যা অনেক পিএইচপি প্রোগ্রামাররা খুঁজছেন, উর্ধ্বে!
আজমেডওয়ে

14

সব কি কেবল স্টাইল?

একটি দীর্ঘ পথ, হ্যাঁ। আপনি কখনও স্থির সদস্য ব্যবহার না করে পুরোপুরি ভাল অবজেক্ট ওরিয়েন্টেড প্রোগ্রাম লিখতে পারেন। আসলে কিছু লোক যুক্তিযুক্ত যে স্থির সদস্যদের প্রথম স্থানে একটি অশুচি। আমি আপনাকে পরামর্শ দেব - ওওপ একটি শিক্ষানবিস হিসাবে - আপনি স্থির সদস্যদের একসাথে এড়াতে চেষ্টা করুন। এটি আপনাকে পদ্ধতিগত শৈলীর পরিবর্তে কোনও বিষয় ভিত্তিক লেখার দিকে জোর করবে ।


13

বিশেষত পিএইচপি ব্যবহার করার সময় আমার এখানে বেশিরভাগ উত্তরের আলাদা ধারণা রয়েছে। আমি মনে করি যে সমস্ত ক্লাস স্থিতিশীল হওয়া উচিত যদি না আপনার কাছে যুক্তিসঙ্গত কারণ না থাকে। কিছু "কেন নয়" কারণগুলি হ'ল:

  • আপনার ক্লাসের একাধিক উদাহরণ প্রয়োজন
  • আপনার ক্লাসটি বাড়ানো দরকার
  • আপনার কোডের অংশগুলি অন্য কোনও অংশের সাথে শ্রেণীর ভেরিয়েবলগুলি ভাগ করতে পারে না

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

সাধারণত, আপনি এইচটিএমএল ক্লাসটি ব্যবহার করবেন:

html::set_attribute('class','myclass');
html::tag('div');
$str=html::get_buffer();

যতবার get_buffer () বলা হয়, এটি সবকিছু পুনরায় সেট করে যাতে এইচটিএমএল লেখক ব্যবহার করার জন্য পরবর্তী শ্রেণিটি একটি পরিচিত অবস্থায় শুরু হয়।

আমার সমস্ত স্ট্যাটিক ক্লাসে একটি init () ফাংশন রয়েছে যা ক্লাসটি প্রথমবার ব্যবহারের আগে ডাকা প্রয়োজন। এটি প্রয়োজনের চেয়ে সম্মেলনের দ্বারা আরও বেশি।

এক্ষেত্রে স্থির শ্রেণীর বিকল্প অগোছালো। এইচটিএমএল লেখকের একটি উদাহরণ পরিচালনা করতে আপনি এমন প্রতিটি শ্রেণীর চাইবেন না যে এইচটিএমএলকে একটি ছোট্ট বিট লিখতে হবে।

এখন আমি স্থির ক্লাস কখন ব্যবহার করবেন না তার একটি উদাহরণ দেব give আমার ফর্ম শ্রেণি পাঠ্য ইনপুট, ড্রপডাউন তালিকা এবং আরও অনেক কিছু ফর্ম উপাদানের একটি তালিকা পরিচালনা করে। এটি সাধারণত এটির মতো ব্যবহৃত হয়:

$form = new form(stuff here);
$form->add(new text(stuff here));
$form->add(new submit(stuff here));
$form->render(); // Creates the entire form using the html class

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

রূপান্তরকরণ / ফর্ম্যাটিং স্ট্রিংগুলির মতো বেশিরভাগ ইউটিলিটি ক্লাসগুলি স্থির শ্রেণীর হওয়ার জন্য ভাল প্রার্থী। আমার নিয়মটি সহজ: পিএইচপি-তে সমস্ত কিছু স্থির থাকে যদি না এর কারণ হয়।


আপনি কি নীচের পয়েন্টটির উদাহরণ লিখতে পারেন "আপনার কোডের অংশগুলি অন্য কোনও অংশের সাথে শ্রেণীর ভেরিয়েবলগুলি ভাগ করতে পারে না" # জেজি ইসতিয়াত
খুরশেদ আলমে

10

"অন্য কোনও পদ্ধতির অভ্যন্তরে স্থির পদ্ধতি কল করা বৈশ্বিক পরিবর্তনশীল আমদানির চেয়ে খারাপ।" ("আরও খারাপ" সংজ্ঞায়িত করুন) ... এবং "স্থিতিশীল পদ্ধতিগুলি যে স্থির বৈশিষ্ট্যগুলি নিয়ে কাজ করে না সেগুলি ফাংশন হওয়া উচিত"।

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

  • কোনও নাম সংঘর্ষ এড়ানো এগুলি - তাদের সমস্ত নামস্থান দিন
  • কোনও প্রকল্প জুড়ে ছড়িয়ে ছিটিয়ে পরিবর্তে এগুলিকে শারীরিকভাবে একত্রে রাখুন - অন্যান্য বিকাশকারীরা ইতিমধ্যে যা উপলব্ধ তা সহজেই খুঁজে পেতে পারেন এবং চাকাটি পুনরায় উদ্ভাবনের সম্ভাবনা কম
  • যেকোন যাদু মানের জন্য গ্লোবাল সংজ্ঞায়নের পরিবর্তে আমাকে ক্লাস কনসেটগুলি ব্যবহার করতে দিন

এটি একত্রে উচ্চতর সংহতি এবং নিম্ন মিলনকে কার্যকর করার এক সহজ উপায়।

এবং এফডব্লিউআইডাব্লু - "স্ট্যাটিক ক্লাস" হিসাবে কমপক্ষে পিএইচপি 5 এ তেমন কিছুই নেই; পদ্ধতি এবং বৈশিষ্ট্য অচল হতে পারে। শ্রেণীর তাত্পর্য রোধ করতে, কেউ এটিকে বিমূর্তও ঘোষণা করতে পারেন।


2
"শ্রেণীর তাত্পর্য রোধ করতে, কেউ এটিকে বিমূর্ত ঘোষণা করতে পারে, এছাড়াও" - আমি এটি অনেক পছন্দ করি। আমি এর আগে লোকেরা __ কনস্ট্রাক্ট () কে একটি ব্যক্তিগত ফাংশন তৈরি করার বিষয়ে পড়েছিলাম, তবে আমি মনে করি যদি আমার কখনও প্রয়োজন হয় তবে আমি সম্ভবত বিমূর্ত ব্যবহার করবো
কাভি সিগেল

7

প্রথমে নিজেকে জিজ্ঞাসা করুন, এই বিষয়টি কী উপস্থাপন করছে? একটি বস্তু উদাহরণ গতিশীল ডেটা পৃথক সেট অপারেটিং জন্য ভাল।

একটি ভাল উদাহরণ হবে ORM বা ডাটাবেস বিমূর্ত স্তর। আপনার একাধিক ডাটাবেস সংযোগ থাকতে পারে।

$db1 = new Db(array('host' => $host1, 'username' => $username1, 'password' => $password1));
$db2 = new Db(array('host' => $host2, 'username' => $username2, 'password' => $password2));

এই দুটি সংযোগ এখন স্বাধীনভাবে কাজ করতে পারে:

$someRecordsFromDb1 = $db1->getRows($selectStatement);
$someRecordsFromDb2 = $db2->getRows($selectStatement);

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

উদাহরণস্বরূপ, যদি Db অবজেক্টের getRows পদ্ধতিটি Db_Row অবজেক্টগুলির একটি অ্যারে প্রদান করে, আপনি এখন প্রতিটি সারিটিতে একে অপরের থেকে স্বাধীনভাবে পরিচালনা করতে পারেন:

foreach ($someRecordsFromDb1 as $row) {
    // change some values
    $row->someFieldValue = 'I am the value for someFieldValue';
    $row->anotherDbField = 1;

    // now save that record/row
    $row->save();
}

foreach ($someRecordsFromDb2 as $row) {
    // delete a row
    $row->delete();
}

স্ট্যাটিক ক্লাসের একটি ভাল উদাহরণ হ'ল এমন কিছু যা রেজিস্ট্রি ভেরিয়েবলগুলি পরিচালনা করে, বা সেশন ভেরিয়েবলগুলি যেহেতু কেবলমাত্র একজন ব্যবহারকারী বা রেজিস্ট্রি প্রতি ব্যবহারকারী থাকবে session

আপনার আবেদনের একটি অংশে:

Session::set('someVar', 'toThisValue');

এবং অন্য অংশে:

Session::get('someVar'); // returns 'toThisValue'

যেহেতু প্রতি সেশনে একবারে কেবলমাত্র একজন ব্যবহারকারী হতে চলেছেন, সেশনের জন্য উদাহরণ তৈরি করার কোনও মানে নেই।

আমি আশা করি এটি পরিষ্কার করার সাথে সাথে অন্যান্য উত্তরগুলির সাথে সহায়তা করবে। পার্শ্ব নোট হিসাবে, " সংহতি " এবং " সংযুক্তি " পরীক্ষা করে দেখুন । আপনার কোড লেখার সময় এগুলি ব্যবহার করার জন্য কিছু খুব খুব ভাল অনুশীলনের রূপরেখা দেয় যা সমস্ত প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য।


6

যদি আপনার ক্লাস স্থির হয় তার অর্থ আপনি এর বিষয়টিকে অন্য শ্রেণিতে পাস করতে পারবেন না (যেহেতু কোনও উদাহরণ নেই) সুতরাং এর অর্থ আপনার সমস্ত ক্লাস সরাসরি স্ট্যাটিক ক্লাসটি ব্যবহার করবে যার অর্থ আপনার কোডটি এখন ক্লাসের সাথে দৃ tight়ভাবে মিলিত হয়েছে ।

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

এবং হ্যাঁ এটি অন্যান্য অনেক কারণগুলির মধ্যে একটি মাত্র যার মধ্যে ইতিমধ্যে উল্লেখ করা হয়েছে।


3

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


3

আমি বলতে চাই যে এখানে অবশ্যই একটি ক্ষেত্রে আছে যেখানে আমি স্থির ভেরিয়েবলগুলি চাই - ক্রস-ভাষা অ্যাপ্লিকেশনগুলিতে। আপনার কাছে এমন একটি শ্রেণি থাকতে পারে যাতে আপনি কোনও ভাষা পাস করেন (উদাঃ _S _SESSION ['ভাষা']) এবং এর ফলে এটি এমনভাবে তৈরি করা অন্যান্য ক্লাসগুলিতেও প্রবেশ করে:

Srings.php //The main class to access
StringsENUS.php  //English/US 
StringsESAR.php  //Spanish/Argentina
//...etc

স্ট্রিংস :: গেটস্ট্রিং ("সামস্ট্রিং") ব্যবহার করা আপনার অ্যাপ্লিকেশন থেকে আপনার ভাষার ব্যবহার বিমূর্ত করার একটি দুর্দান্ত উপায়। আপনি দয়া করে এটি করতে পারেন তবে এই ক্ষেত্রে প্রতিটি স্ট্রিং ফাইলের স্ট্রিং মানগুলির সাথে ধ্রুবক রয়েছে যা স্ট্রিংস শ্রেণীর দ্বারা অ্যাক্সেস করা বেশ ভাল কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.