কোনও পিএইচপি প্রকল্পে সাহায্যকারী বস্তুগুলি সংরক্ষণ, অ্যাক্সেস এবং সংগঠিত করার জন্য কোন প্যাটার্ন বিদ্যমান? [বন্ধ]


114

আপনি কীভাবে কোনও পিএইচপি ভিত্তিক, অবজেক্ট ওরিয়েন্টড প্রজেক্টে ডেটাবেস ইঞ্জিন, ব্যবহারকারীর বিজ্ঞপ্তি, ত্রুটি পরিচালনা এবং এ জাতীয় সহায়তাকারী অবজেক্টগুলিকে কীভাবে সংগঠিত ও পরিচালনা করেন?

বলুন আমার কাছে একটি বড় পিএইচপি সিএমএস রয়েছে। সিএমএস বিভিন্ন ক্লাসে সংগঠিত হয়। কয়েকটি উদাহরণ:

  • ডাটাবেস অবজেক্ট
  • ইউজার ম্যানেজমেন্ট
  • আইটেমগুলি তৈরি / পরিবর্তন / মুছতে একটি এপিআই
  • শেষ ব্যবহারকারীকে বার্তা প্রদর্শন করার জন্য একটি বার্তা অবজেক্ট object
  • একটি প্রসঙ্গ হ্যান্ডলার যা আপনাকে ডান পৃষ্ঠায় নিয়ে যায়
  • একটি নেভিগেশন বার ক্লাস যা বোতামগুলি দেখায়
  • একটি লগিং অবজেক্ট
  • সম্ভবত, কাস্টম ত্রুটি পরিচালনা

প্রভৃতি

আমি চিরন্তন প্রশ্নটির সাথে কাজ করছি, কীভাবে এই বিষয়বস্তুর প্রয়োজনমতো সিস্টেমের প্রতিটি অংশে অ্যাক্সেসযোগ্য করা যায়।

আমার প্রথম উদ্বেগ, বহু বছর আগে একটি $ অ্যাপ্লিকেশন গ্লোবাল ছিল যা এই ক্লাসগুলির সূচনাপ্রাপ্ত দৃষ্টান্ত ধারণ করে।

global $application;
$application->messageHandler->addMessage("Item successfully inserted");

আমি তখন সিঙ্গলটন প্যাটার্ন এবং একটি কারখানার ফাংশনে পরিবর্তিত হয়েছি:

$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");

তবে আমি তাতেও খুশি নই। ইউনিট পরীক্ষা এবং এনক্যাপসুলেশন আমার কাছে আরও বেশি গুরুত্বপূর্ণ হয়ে ওঠে এবং আমার গ্লোবাল / সিঙ্গেলটনের পিছনের যুক্তিটি বুঝতে ওওপির প্রাথমিক ধারণাটি নষ্ট করে দেয়।

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

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

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

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


1
আমি কেবল একটি অত্যন্ত অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি যা একটি অনুগ্রহ ছিল। : আপনি সেখানে কিছু উত্তর প্রশংসা পারে stackoverflow.com/questions/1967548/...
philfreo

3
কেবল একটি মাথা আপ, রেফারেন্স দ্বারা একটি নতুন অবজেক্ট ফেরত - মত $mh=&factory("messageHandler");অর্থহীন এবং কোনও কার্যকারিতা সুবিধা দেয় না। তদ্ব্যতীত, এটি 5.3 এ অবচয় করা হয়েছে।
রাইগুয়

উত্তর:


68

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

http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-join-new-project.html http://googletesting.blogspot.com/2008/05/tott-used-d dependancy -আইনজেকশন-টু এইচটিএমএল http://googletesting.blogspot.com/2008/08/ कहीं-have-all-singletons-gone.html

বিকল্প

  1. একটি পরিষেবা সরবরাহকারী

    http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

  2. নির্ভরতা ইনজেকশন

    http://en.wikipedia.org/wiki/Dependency_injection

    এবং একটি পিএইচপি ব্যাখ্যা:

    http://components.symfony-project.org/dependency-injection/trunk/book/01-Dependency-Injection

এই বিকল্পগুলি সম্পর্কে এটি একটি ভাল নিবন্ধ:

http://martinfowler.com/articles/injection.html

নির্ভরতা ইনজেকশন (ডিআই) প্রয়োগ করছে:

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

যদিও এটি 'সত্য' একক বাস্তবায়ন না হলেও আমি এখনও ফ্ল্যাভিয়াসকে ভুল বলে মনে করি got গ্লোবাল রাষ্ট্র খারাপ । নোট করুন যে এই জাতীয় সমাধানগুলি স্থিতিশীল পদ্ধতিগুলি পরীক্ষা করতেও কঠিন ব্যবহার করে

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

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

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


ডিআই এর জন্য +1 যদিও আমি এটি যতটা চাই তা ব্যবহার করি না, তবে আমি এটি যে পরিমাণে কম পরিমাণে ব্যবহার করেছি তা খুব সহায়ক হয়েছে।
অনুরাগ

1
@ কোয়েন: পিএইচপি-তে কোনও ডিআই / এসপি প্রয়োগের একটি পিএইচপি উদাহরণ দেওয়ার বিষয়ে যত্নশীল? আপনার পছন্দসই বিকল্প নিদর্শন ব্যবহার করে @ ফ্ল্যাভিয়াস কোড প্রয়োগ করা যেতে পারে?
অ্যালিক্স অ্যাক্সেল

আমার উত্তরে ডিআই বাস্তবায়ন এবং ধারকটিতে একটি লিঙ্ক যুক্ত করা হয়েছে।
টমাস

আমি এখন এই সমস্ত পড়ছি কিন্তু আমি এখনও এটি সব পড়েনি, আমি জিজ্ঞাসা করতে চাই, একটি নির্ভরতা ইনজেকশন কাঠামোটি কি মূলত একটি রেজিস্ট্রি হতে পারে?
জেসনডাভিস

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

16
class Application {
    protected static $_singletonFoo=NULL;

    public static function foo() {
        if(NULL === self::$_singletonFoo) {
            self::$_singletonFoo = new Foo;
        }
        return self::$_singletonFoo;
    }

}

এইভাবেই আমি এটি করব। এটি চাহিদা অনুযায়ী বস্তু তৈরি করে:

Application::foo()->bar();

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

বিঃদ্রঃ : আমি যা উপস্থাপন করেছি তা এমনকি আসল একক প্যাটার্নও নয়। একটি সিঙ্গলটন কনস্ট্রাক্টর (Foo :: __ কনস্ট্রাক্টর ()) কে বেসরকারী হিসাবে সংজ্ঞায়িত করে কেবল নিজের একটি উদাহরণের অনুমতি দেয়। এটি কেবলমাত্র "বৈশ্বিক" পরিবর্তনশীল সমস্ত "অ্যাপ্লিকেশন" উদাহরণগুলির জন্য উপলব্ধ। এ কারণেই আমি মনে করি যে এটির ব্যবহারটি বৈধ কারণ এটি ওওপি নীতিগুলিকে অবজ্ঞা করে না। অবশ্যই, বিশ্বের যে কোনও কিছুই হিসাবে, এই "প্যাটার্ন "টিকেও অতিরিক্ত ব্যবহার করা উচিত নয়!

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

সংশোধিত আপনার মধ্যে যাদের জন্য টিডিডি নিয়ে উদ্বেগ রয়েছে , আপনি এখনও এটি নির্ভরতা-ইনজেকশনের জন্য কিছু ওয়্যারিং তৈরি করতে পারেন। এটি দেখতে এটি দেখতে পারে:

class Application {
        protected static $_singletonFoo=NULL;
        protected static $_helperName = 'Foo';

        public static function setDefaultHelperName($helperName='Foo') {
                if(is_string($helperName)) {
                        self::$_helperName = $helperName;
                }
                elseif(is_object($helperName)) {
                        self::$_singletonFoo = $helperName;
                }
                else {
                        return FALSE;
                }
                return TRUE;
        }
        public static function foo() {
                if(NULL === self::$_singletonFoo) {
                        self::$_singletonFoo = new self::$_helperName;
                }
                return self::$_singletonFoo;
        }
}

উন্নতির জন্য যথেষ্ট জায়গা রয়েছে। এটি কেবল একটি পিসি, আপনার কল্পনা ব্যবহার করুন।

কেন এমন হয়? ঠিক আছে, বেশিরভাগ সময় অ্যাপ্লিকেশনটি ইউনিট-পরীক্ষিত হবে না, বাস্তবে এটি চালিত হবে, আশা করা যায় উত্পাদন পরিবেশে । পিএইচপি এর শক্তি তার গতি। পিএইচপি হয় না এবং জাভা এর মতো কোনও "পরিষ্কার ওওপি ভাষা" হবে না।

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

স্টিরিওটাইপড "বিধিগুলি" যেমন "সিঙ্গলেটগুলি খারাপ" তাদের পক্ষে দুষ্টির উত্স, তারা অলস লোকদের পক্ষে যা তারা নিজেরাই চিন্তা করতে রাজি নয়।

হ্যাঁ, আমি জানি, পিএইচপি ম্যানিফেস্টো প্রযুক্তিগতভাবে বলছে, খারাপ। তবুও এটি একটি সফল ভাষা, হ্যাকিশ পদ্ধতিতে।

অভিযোজ্য বস্তু

একটি ফাংশন শৈলী:

function app($class) {
    static $refs = array();

    //> Dependency injection in case of unit test
    if (is_object($class)) {
        $refs[get_class($class)] = $class;
        $class = get_class($class);
    }

    if (!isset($refs[$class]))
        $refs[$class] = new $class();

    return $refs[$class];
}

//> usage: app('Logger')->doWhatever();

2
আমি উত্তরটি অগ্রাহ্য করেছি কারণ আমি বিশ্বাস করি যে সমস্যাটি পরিচালনা করার জন্য সিঙ্গলটন প্যাটার্নের পরামর্শ দেওয়া শক্ত ওওপি নীতিগুলির পরিপন্থী।
koen

1
@ কোয়েন: আপনি যা বলছেন তা সত্য, সাধারণভাবে বলছি, তবে যতক্ষণ না আমি তার সমস্যাটি বুঝতে পেরেছি, সে আবেদনের জন্য সহায়কদের কথা বলছে, এবং একটি আবেদনের মধ্যে কেবল একটি ... আহ, অ্যাপ্লিকেশন।
ফ্ল্যাভিয়াস

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

আমার কাছ থেকেও। এটি কেবল সিঙ্গলটন ডিপির অর্ধেক হতে পারে তবে এটি কুৎসিত: "এটিতে বিশ্বব্যাপী প্রবেশাধিকার সরবরাহ করুন"।
ঠিক কেউ

2
এটি প্রকৃতপক্ষে তার বিদ্যমান পদ্ধতিকে আরও পরিষ্কার করে তোলে।
ড্যানিয়েল ভন ফ্যাঙ্গ

15

আমি নির্ভরতা ইনজেকশন ধারণা পছন্দ করি:

"নির্ভরতা ইনজেকশনটি যেখানে উপাদানগুলি তাদের নির্মাতা, পদ্ধতিগুলির মাধ্যমে বা সরাসরি ক্ষেত্রগুলিতে তাদের নির্ভরতা দেওয়া হয় (( পিকো ধারক ওয়েবসাইট থেকে )"

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

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


আমি পিএইচপি-তে
ক্লোজারগুলির

আমারও তার নিজের সাইটের বন্ধকরণ
টমাস

2
আসুন আশা করি, মূলধারার ওয়েবহাউসগুলি শীঘ্রই পিএইচপি 5.3 এ স্থানান্তরিত হবে, কারণ এখনও পুরো বৈশিষ্ট্যযুক্ত পিএইচপি 5.3 সার্ভারটি দেখা সাধারণ নয়
জুরজ ব্লাহুনকা

তাদের যখন আরও বেশি সংখ্যক প্রকল্পের জেন্ডার ফ্রেমওয়ার্ক ২.০ এর মতো পিএইচপি 5.3 প্রয়োজন হবে তখন ফ্রেমওয়ার্ক.জেন্ড
টমাস

1
নির্ভরতা ইনজেকশন এছাড়াও সম্পর্কে প্রশ্নে উত্তর গৃহীত হয় decupling from GOD object: stackoverflow.com/questions/1580210/... একটি খুব সুন্দর উদাহরণ
Juraj Blahunka

9

সর্বোত্তম পদ্ধতির মধ্যে সেই সংস্থানগুলির জন্য কোনও ধরণের ধারক রাখা । এই ধারকটি বাস্তবায়নের কয়েকটি সাধারণ উপায় :

একক বস্তু

প্রস্তাবিত নয় কারণ এটি পরীক্ষা করা শক্ত এবং বিশ্বব্যাপী রাষ্ট্রকে বোঝায়। (Singletonitis)

রেজিস্ট্রি

সিঙ্গলটোনাইটিস দূর করে, বাগ আমি রেজিস্ট্রিও সুপারিশ করিনা, কারণ এটিও এক ধরণের সিঙ্গলটন। (ইউনিট পরীক্ষা থেকে হার্ড)

উত্তরাধিকার

করুণা, পিএইচপি-তে কোনও একাধিক উত্তরাধিকার নেই, সুতরাং এটি সমস্ত শৃঙ্খলে সীমাবদ্ধ।

নির্ভরতা ইনজেকশন

এটি একটি ভাল পদ্ধতির, তবে একটি বড় বিষয়।

ঐতিহ্যগত

এটি করার সহজতম উপায় হ'ল কন্সট্রাক্টর বা সেটার ইনজেকশন (সেটার ব্যবহার করে বা ক্লাস কনস্ট্রাক্টরের মধ্যে নির্ভরশীলতা পাস করুন)।

ফ্রেমওয়ার্ক

আপনি নিজের নিজস্ব নির্ভরতা ইনজেক্টর রোল করতে পারেন বা কিছু নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক ব্যবহার করতে পারেন, যেমন। Yadif

অ্যাপ্লিকেশন রিসোর্স

আপনি অ্যাপ্লিকেশন বুটস্ট্র্যাপে আপনার প্রতিটি সংস্থান সূচনা করতে পারেন (যা একটি ধারক হিসাবে কাজ করে) এবং অ্যাপ্লিকেশন বুটস্ট্র্যাপ অবজেক্টে যে কোনও জায়গায় অ্যাক্সেস করতে পারে।

এটি জেন্ড ফ্রেমওয়ার্ক 1.x এ প্রয়োগ করা পদ্ধতি

রিসোর্স লোডার

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

নির্দিষ্ট স্তর ইনজেকশন

অ্যাপ্লিকেশনটিতে সর্বদা কোথাও সংস্থানগুলির প্রয়োজন হয় না। কখনও কখনও আপনার কেবল তাদের প্রয়োজন যেমন কন্ট্রোলারগুলিতে (এমভি সি )। তারপরে আপনি কেবলমাত্র সেখানে সংস্থানগুলি ইনজেক্ট করতে পারেন।

এর সাধারণ পন্থাটি ইনজেকশন মেটাডেটা যুক্ত করতে ডকব্লক মন্তব্যগুলি ব্যবহার করা।

এখানে আমার দৃষ্টিভঙ্গি দেখুন:

জেন্ড ফ্রেমওয়ার্কে নির্ভরতা ইনজেকশনটি কীভাবে ব্যবহার করবেন? - স্ট্যাক ওভারফ্লো

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

অ্যাপ্লিকেশনগুলি খুব বড় হতে পারে এবং প্রতিটি অনুরোধে সমস্ত সংস্থান লোড করা খুব ব্যয়বহুল। এই অ্যাপসভার ইন-পিএইচপি - গুগল কোডে প্রকল্প হোস্টিং সহ অনেকগুলি পন্থা রয়েছে ।


6

আপনি যদি বিশ্বজুড়ে অবজেক্টগুলি তৈরি করতে চান তবে রেজিস্ট্রি প্যাটার্নটি আপনার জন্য আকর্ষণীয় হতে পারে। অনুপ্রেরণার জন্য, জেন্ড রেজিস্ট্রিটি দেখুন

এছাড়াও রেজিস্ট্রি বনাম সিঙ্গলটন প্রশ্ন।


আপনি যদি জেন্ডার ফ্রেমওয়ার্কটি ব্যবহার করতে না চান, পিএইচপি
টমাস

আমি একটি টাইপ করা রেজিস্ট্রি প্যাটার্ন পছন্দ করি, যেমন রেজিস্ট্রি :: গেটড্যাটাবেস ("মাস্টার"); রেজিস্ট্রি :: GetSession ($ user-> SessionKey ()); রেজিস্ট্রি :: GetConfig ( "স্থানীয়"); [...] এবং প্রতিটি ধরণের জন্য একটি ইন্টারফেস সংজ্ঞায়িত। এইভাবে আপনি নিশ্চিত হন যে আপনি ভুলক্রমে কোনও ভিন্ন কিছুর জন্য ব্যবহৃত কীটি ওভাররাইট করবেন না (যেমন আপনার কাছে "মাস্টার ডেটাবেস" এবং "মাস্টার কনফিগারেশন" থাকতে পারে। ইন্টারফেসগুলি ব্যবহার করে আপনি নিশ্চিত হন যে কেবল বৈধ অবজেক্ট ব্যবহার করা হয়েছে। অফার এটি পারে এছাড়াও একাধিক রেজিস্ট্রি ক্লাস ব্যবহার করে প্রয়োগ করা যেতে পারে তবে imho একটি এককটি সহজ ব্যবহার করা সহজ এবং তবুও এর সুবিধাগুলি রয়েছে
মরফিলদুর

অথবা অবশ্যই পিএইচপি-তে নির্মিত একটি
G _

4

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

1) অবজেক্টটির অনেক কার্যকর পদ্ধতি থাকতে পারে বা একাধিকবার কল করা দরকার যার ক্ষেত্রে আমি সিঙ্গলটন / রেজিস্ট্রি প্রয়োগ করি:

$object = load::singleton('classname');
//or
$object = classname::instance(); // which sets self::$instance = $this

২) অবজেক্টটি কেবল সেই পদ্ধতি / ক্রিয়াকলাপের জীবন যাপনের জন্যই এটি উপস্থিত রয়েছে যার ক্ষেত্রে কোনও দীর্ঘায়িত অবজেক্টের রেফারেন্সকে দীর্ঘায়িত রাখা থেকে বিরত রাখতে একটি সাধারণ সৃষ্টি উপকারী।

$object = new Class();

অস্থায়ী বস্তু সংরক্ষণের ফলে যেকোন ক্ষেত্রে মেমরি ফাঁস হতে পারে কারণ তাদের উল্লেখগুলি স্ক্রিপ্টের বাকী অংশে স্মৃতিতে রাখার কথা ভুলে যেতে পারে।


3

আমি প্রাথমিক জিনিসগুলি ফাংশনে ফিরতে যাব:

A('Users')->getCurrentUser();

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


-1

কেন সূক্ষ্ম ম্যানুয়ালটি পড়ছেন না?

http://php.net/manual/en/language.oop5.autoload.php


ধন্যবাদ জিসিবি, তবে ক্লাসগুলি লোড করা আমার উদ্বেগ নয়, আমার প্রশ্নটি আরও স্থাপত্য প্রকৃতির।
পেক্কা

যদিও এটি তাত্ত্বিকভাবে প্রশ্নের উত্তর দিতে পারে, তবে এখানে উত্তরের প্রয়োজনীয় অংশগুলি অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্ক সরবরাহ করা ভাল।
jjnguy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.