পিএইচপি একাধিক উত্তরাধিকার


97

পিএইচপি 5 এখনও একাধিক উত্তরাধিকার সমর্থন করে না এই সত্যটি ঘুরে দেখার জন্য আমি একটি ভাল, পরিষ্কার উপায়ের সন্ধান করছি। এখানে শ্রেণি শ্রেণিবিন্যাস:

বার্তা
- টেক্সটমেসেজ
-------- আমন্ত্রণ
পাঠ্যপুস্তক - ইমেলমেসেজ
-------- আমন্ত্রণ ইমেলমেসেজ

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

সমস্যাটি সমাধান করার জন্য সবচেয়ে হালকা ওজনের পদ্ধতির কী?

ধন্যবাদ!


4
এমন অনেকগুলি ক্ষেত্রে নেই যা উত্তরাধিকার (বা একাধিক উত্তরাধিকার) ন্যায্যযোগ্য। সলাইড নীতিগুলি দেখুন। উত্তরাধিকারের তুলনায় রচনা পছন্দ করুন।
ওন্দেজ মির্তেসস

4
@ ওন্ডিজমির্তেস আপনার অর্থ কী - "এমন অনেকগুলি ক্ষেত্রে নয় যা উত্তরাধিকার সূত্রে ন্যায়সঙ্গত?"
styler1972

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

4
: পিএইচপি 5.4 "বৈশিষ্ট্যগুলো" আছে stackoverflow.com/a/13966131/492130
f.ardelian

4
আমি প্রাথমিকদের কখনই উত্তরাধিকার ব্যবহার না করার পরামর্শ দেব । সাধারণভাবে, কেবলমাত্র দুটি পরিস্থিতিতে উত্তরাধিকার সূত্রে অনুমোদিত: ১) গ্রন্থাগার তৈরি করার সময় ব্যবহারকারীরা কম কোড লেখেন এবং ২) যখন প্রকল্পের নেতৃত্ব আপনি এটি ব্যবহারের দাবি করেন
গুরুগেট

উত্তর:


141

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

$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe <jdoe@yahoo.com>';
$m->to = 'Random Hacker <rh@gmail.com>';
$m->subject = 'Invitation email';
$m->importBody('invitation.html');

$d = new MessageDispatcher();
$d->dispatch($m);

এইভাবে আপনি বার্তা শ্রেণিতে কিছু বিশেষীকরণ যুক্ত করতে পারেন:

$htmlIM = new InvitationHTMLMessage(); // html type, subject and body configuration in constructor
$textIM = new InvitationTextMessage(); // text type, subject and body configuration in constructor

$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);

নোট করুন যে মেসেজডিজপাচার কোনও সিদ্ধান্ত নেবে যে এইচটিএমএল হিসাবে পাঠানো হবে বা typeমেসেজ অবজেক্টে সম্পত্তিটির উপর নির্ভর করে সাধারণ পাঠ্য পাঠানো হবে।

// in MessageDispatcher class
public function dispatch(Message $m) {
    if ($m->type == 'text/plain') {
        $this->sendAsText($m);
    } elseif ($m->type == 'text/html') {
        $this->sendAsHTML($m);
    } else {
        throw new Exception("MIME type {$m->type} not supported");
    }
}

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


13
আশ্চর্যজনকভাবে বিস্তৃত উত্তর, আপনাকে ধন্যবাদ! আমি আজ কিছু শিখেছি!
অ্যালেক্স ওয়েইনস্টেইন

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

12
দুর্ভাগ্যক্রমে পিএইচপি কৌশল প্যাটার্ন বাস্তবায়নের জন্য দুর্দান্ত নয়। যে পদ্ধতিগুলি ওভারলোডিংকে মেথড ওভারলোডিং সমর্থন করে সেগুলি এখানে আরও ভালভাবে কাজ করুন - কল্পনা করুন আপনার একই নামের দুটি পদ্ধতি রয়েছে: প্রেরণ (HTMLMessage M এম) এবং প্রেরণ (টেক্সটমেসেজ $) - এখন দৃ strongly়ভাবে টাইপ করা ভাষা সংকলক / ইন্টারপ্রেটার স্বয়ংক্রিয়ভাবে সঠিক "কৌশল" এর উপর ভিত্তি করে নিয়োগ করবে পরামিতি প্রকার। এটি বাদ দিয়ে, আমি মনে করি না যে নতুন কৌশল বাস্তবায়নের জন্য উন্মুক্ত হওয়া কৌশল প্যাটার্নটির সারমর্ম। নিশ্চিত যে এটি রাখা ভাল জিনিস, তবে প্রায়শই প্রয়োজন হয় না।
মিচা রুদনিকি

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

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

15

হতে পারে আপনি একটি 'হ'ল-এর' সম্পর্কের সাথে 'ইস-এ' সম্পর্কটি প্রতিস্থাপন করতে পারেন? একটি আমন্ত্রণের একটি বার্তা থাকতে পারে তবে এটি 'হ'ল' ম্যাসেজের প্রয়োজন হয় না। একটি আমন্ত্রণ ফি নিশ্চিত হতে পারে, যা বার্তার মডেলের সাথে ভালভাবে যায় না।

'রচনা বনাম উত্তরাধিকার' অনুসন্ধান করুন যদি আপনার এ সম্পর্কে আরও কিছু জানা দরকার।


9

আমি যদি এই থ্রেডে ফিলকে উদ্ধৃতি দিতে পারি ...

জাভা এর মতো পিএইচপি একাধিক উত্তরাধিকার সমর্থন করে না।

পিএইচপি 5.4 এ আসা বৈশিষ্ট্যগুলি হ'ল যা এই সমস্যার সমাধান দেওয়ার চেষ্টা করে।

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

এবং ক্রিস ....

পিএইচপি সত্যিই একাধিক উত্তরাধিকার সমর্থন করে না, তবে এটি বাস্তবায়নের কয়েকটি (কিছুটা অগোছালো) উপায় রয়েছে। কিছু উদাহরণের জন্য এই URL টি দেখুন:

http://www.jasny.net/articles/how-i-php-mpleple-inheritance/

ভেবেছিল তাদের দুজনেরই দরকারী লিঙ্ক রয়েছে। বৈশিষ্ট্য চেষ্টা করতে বা কিছু মিশ্রণ অপেক্ষা করতে পারে না ...


4
বৈশিষ্ট্যগুলি হ'ল উপায়
জোনাথন

6

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

"নকশার প্যাটার্ন" উত্তরটি হ'ল অংশীদারি কার্যকারিতাটি একটি পৃথক উপাদান হিসাবে বিমুক্ত করা এবং রানটাইমটিতে রচনা করা। আমন্ত্রণ কার্যকারিতাটি ক্লাস হিসাবে আউটস্ট্রাক করার কোনও উপায় সম্পর্কে ভাবেন যা উত্তরাধিকার ব্যতীত অন্য কোনওভাবে আপনার বার্তা শ্রেণীর সাথে যুক্ত হয়।


4

আমি পিএইচপি 5.4 এর বৈশিষ্ট্যগুলি এটিকে সমাধান করার উপায় হিসাবে ব্যবহার করছি। http://php.net/manual/en/language.oop5.traits.php

এটি প্রসারিত সহ ক্লাসিক উত্তরাধিকারের অনুমতি দেয়, তবে সাধারণ কার্যকারিতা এবং বৈশিষ্ট্যগুলিকে একটি 'বৈশিষ্ট্য' হিসাবে স্থাপনের সম্ভাব্যতা দেয়। যেমন ম্যানুয়ালটি বলে:

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



3

এটি উভয়ই একটি প্রশ্ন এবং সমাধান ...

Theন্দ্রজালিক _ কি হবে? কল () ,_get (), __set () পদ্ধতিগুলি? আমি এখনও এই সমাধানটি পরীক্ষা করিনি তবে আপনি যদি একটি মাল্টিইনারিট ক্লাস তৈরি করেন তবে কি হবে। শিশু শ্রেণিতে সুরক্ষিত চলকটিতে উত্তরাধিকার সূত্রে ক্লাসগুলির একটি অ্যারে থাকতে পারে। মাল্টি-ইন্টারফেস ক্লাসের কনস্ট্রাক্টর উত্তরাধিকারসূত্রে প্রাপ্ত প্রতিটি শ্রেণীর উদাহরণ তৈরি করতে এবং তাদের একটি ব্যক্তিগত সম্পত্তিতে লিঙ্ক করতে পারে, _ইেক্সট বলুন। __Call () পদ্ধতিটি কল করার জন্য সঠিক পদ্ধতি সনাক্ত করতে _ext অ্যারেতে প্রতিটি শ্রেণিতে মেথড_এক্সিস্টস () ফাংশনটি ব্যবহার করতে পারে। অভ্যন্তরীণ বৈশিষ্ট্যগুলি সনাক্ত করতে __get () এবং __set ব্যবহার করা যেতে পারে, বা রেফারেন্স সহ আপনার বিশেষজ্ঞ যদি আপনি শিশু বর্গ এবং উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণীর বৈশিষ্ট্যগুলি একই ডেটার উল্লেখ করতে পারেন। আপনার বস্তুর একাধিক উত্তরাধিকার সেই বিষয়গুলি ব্যবহার করে কোড করা স্বচ্ছ হবে be এছাড়াও, অভ্যন্তরীণ অবজেক্টগুলি উত্তরাধিকার সূত্রে অবিলম্বে অ্যাক্সেস করতে পারে যতক্ষণ প্রয়োজন _Ext অ্যারে শ্রেণীর নাম অনুসারে সূচিযুক্ত হয়। আমি এই সুপার-ক্লাসটি তৈরি করার কল্পনা করেছি এবং এখনও এটি বাস্তবায়ন করি নি বলে আমি মনে করি যে এটি যদি এর থেকে কাজ করে তবে কিছু খারাপ প্রোগ্রামিংয়ের অভ্যাস বাড়ে could


আমি মনে করি এটি সম্ভবপর। এটি একাধিক ক্লাসের কার্যকারিতা একত্রিত করবে, তবে বাস্তবে সেগুলি (অর্থে instanceof) উত্তরাধিকারী হবে না
ব্যবহারকারী 102008

এবং এটি অবশ্যই অভ্যন্তরীণ শ্রেণিতে
নিজেরাই

1

আপনি কী করছেন তা পরিষ্কার করতে আমার কাছে দুটি প্রশ্ন রয়েছে:

1) আপনার বার্তা অবজেক্টটিতে কি কেবল কোনও বার্তা রয়েছে যেমন শরীর, প্রাপক, সময়সূচির সময়? ২) আপনার আমন্ত্রণের উদ্দেশ্যটি নিয়ে আপনি কী করতে চান? কোনও ইমেলমেসেজের সাথে এটির তুলনায় বিশেষভাবে চিকিত্সা করা দরকার? 3) যদি তাই এটি সম্পর্কে এত বিশেষ কি? ৪) যদি তা হয় তবে বার্তাগুলির প্রকারগুলিকে একটি আমন্ত্রণের জন্য আলাদাভাবে পরিচালনা করার দরকার কী? 5) আপনি যদি কোনও স্বাগত বার্তা বা একটি ওকে বার্তা প্রেরণ করতে চান তবে কী হবে? এগুলিও কি নতুন জিনিস?

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

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


0

জাভা একই সমস্যা। সমস্যাটি সমাধানের জন্য বিমূর্ত ফাংশনগুলির সাথে ইন্টারফেসগুলি ব্যবহার করার চেষ্টা করুন


0

পিএইচপি সমর্থন ইন্টারফেস করে। আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে এটি একটি ভাল বাজি হতে পারে।


4
ইন্টারফেসগুলি কংক্রিট ফাংশন বাস্তবায়নের অনুমতি দেয় না, সুতরাং তারা এখানে সহায়ক নয়।
অ্যালেক্স ওয়েইনস্টেইন

4
ইন্টারফেসগুলি ক্লাসগুলির বিপরীতে একাধিক উত্তরাধিকারকে সমর্থন করে।
ক্রেগ লুইস

-1

বার্তা শ্রেণীর ঠিক নীচে একটি আমন্ত্রণ শ্রেণি সম্পর্কে কীভাবে?

সুতরাং শ্রেণিবিন্যাস যায়:

বার্তা
--- আমন্ত্রণ
------ টেক্সটমেসেজ
------ ইমেলমেসেজ

এবং আমন্ত্রণ ক্লাসে, আমন্ত্রণ টেক্সটমেসেজ এবং আমন্ত্রণ ইমেলম্যাসেজে কার্যকারিতা যুক্ত করুন add

আমি জানি যে আমন্ত্রণটি সত্যই কোনও বার্তা নয়, এটি বার্তার কার্যকারিতা। সুতরাং আমি নিশ্চিত নই যে এটি ভাল ওও ডিজাইন কিনা।

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