আমি লক্ষ্য করেছি যে পিএইচপি 5 হিসাবে ভাষাটিতে ইন্টারফেস যুক্ত করা হয়েছে। তবে, যেহেতু পিএইচপি খুব স্বচ্ছভাবে টাইপ করা হয় তাই মনে হয় ইন্টারফেস ব্যবহারের বেশিরভাগ সুবিধা হারাতে বসেছে। কেন এটি ভাষার অন্তর্ভুক্ত?
আমি লক্ষ্য করেছি যে পিএইচপি 5 হিসাবে ভাষাটিতে ইন্টারফেস যুক্ত করা হয়েছে। তবে, যেহেতু পিএইচপি খুব স্বচ্ছভাবে টাইপ করা হয় তাই মনে হয় ইন্টারফেস ব্যবহারের বেশিরভাগ সুবিধা হারাতে বসেছে। কেন এটি ভাষার অন্তর্ভুক্ত?
উত্তর:
পিএইচপি-তে ইন্টারফেসের মূল সুবিধা হ'ল ক্লাসগুলি একাধিক ইন্টারফেস প্রয়োগ করতে পারে। এটি আপনাকে এমন কয়েকটি ক্লাসগুলিতে অনুমতি দেয় যা কিছু কার্যকারিতা ভাগ করে নেয় তবে অগত্যা কোনও পিতামাতার ক্লাসটি ভাগ করে না। কিছু উদাহরণের মধ্যে ক্যাশে, আউটপুট, বা নির্দিষ্ট উপায়ে শ্রেণীর বৈশিষ্ট্য অ্যাক্সেস অন্তর্ভুক্ত থাকতে পারে।
আপনার কোডে, আপনি পরীক্ষা করতে পারেন কোনও শ্রেণি শ্রেণীর নাম পরীক্ষা করার পরিবর্তে প্রদত্ত ইন্টারফেস প্রয়োগ করে কিনা। তারপরে, নতুন ক্লাস যুক্ত হওয়ার পরে আপনার কোডটি এখনও কাজ করবে।
পিএইচপি কিছু পূর্বনির্ধারিত ইন্টারফেস সরবরাহ করে যা বিভিন্ন পরিস্থিতিতে কার্যকর হতে পারে: http://php.net/manual/en/reided.interfaces.php ।
সম্পাদনা - একটি উদাহরণ যুক্ত করা
আপনার যদি মাইন্টারফেস নামের একটি ইন্টারফেস থাকে এবং আপনি বিভিন্ন শ্রেণীর একাধিক অবজেক্টের সাথে কাজ করছেন যা কিছু কার্যকারিতা ভাগ করে নিতে পারে বা নাও করতে পারে, ইন্টারফেস আপনাকে এ জাতীয় কিছু করার অনুমতি দেয়:
// Assume $objects is an array of instances of various classes
foreach($objects as $obj) {
if($obj instanceof MyInterface) {
$obj->a();
$obj->b();
$obj->c();
}
}
পিএইচপি খুব শিথিলভাবে টাইপ করা হয় তবে পদ্ধতি পরামিতিগুলির মতো বিষয় সম্পর্কে এটি দৃ strongly়ভাবে টাইপ করা যেতে পারে।
নিম্নলিখিত উদাহরণ বিবেচনা করুন:
interface Car { function go(); }
class Porsche { function go() {} }
function drive(Car $car) {}
$porsche = new Porsche();
drive($porsche);
উপরের কোডটি আউটপুট দেবে:
আর্গুমেন্ট 1 ড্রাইভে পাস করেছে () অবশ্যই ইন্টারফেস কার প্রয়োগ করতে হবে, দেওয়া পোর্শের উদাহরণ
null
যদিও প্যারামিটারের জন্য আপনার ডিফল্ট মান থাকতে পারে ।
drive
একটি দরকার হয় Car
, তবে null
যাইহোক যাইহোক কোনওভাবে উপকারী হবে না ...
function addView($name, Template $template, SecurityMode $securityMode = null, $methodName = null);
আপনার একটি $methodName
কিন্তু নাও থাকতে পারে $securityMode
।
ইন্টারফেসগুলি আপনাকে ওপেন-ক্লোজড নীতিটি বাস্তবায়িত করতে, আলগাভাবে কাপল কোড বেস বজায় রাখতে এবং অনেকগুলি ওওপি নকশার নিদর্শনগুলি বাস্তবায়নের অনুমতি দেয়।
উদাহরণস্বরূপ, যদি একটি শ্রেণি অন্য শ্রেণিকে আর্গুমেন্ট হিসাবে গ্রহণ করে:
class A {
public function __construct(B $class_b) {
// use class b
$class_b->run();
}
}
আপনার ক্লাস ‘এ’ এবং ‘বি’ শ্রেণিতে এখন আঁটসাঁটো মিলন রয়েছে, এবং ক্লাস ‘এ’ বি বাদে অন্য কোনও শ্রেণি ব্যবহার করতে পারে না ইঙ্গিতটি প্রকারটি নিশ্চিত করে যে আপনার পক্ষে সঠিক ধরণের যুক্তি রয়েছে, তবে এখন এ এবং বিয়ের সম্পর্ককে সীমাবদ্ধ করেছে mented
বলুন যে আপনি ক্লাস এ চান তবে রান () পদ্ধতি আছে এমন সমস্ত ধরণের ক্লাস ব্যবহার করতে সক্ষম হতে চান। এটি মূলত (তবে বেশ নয়) কম্যান্ড ডিজাইনের প্যাটার্ন। সমাধানের জন্য, আপনি একটি কংক্রিট শ্রেণীর পরিবর্তে ইন্টারফেস ব্যবহার করে ইঙ্গিতটি টাইপ করবেন। বি তাদের সেই ইন্টারফেসটি বাস্তবায়ন করবে এবং ক্লাস এ এর আর্গুমেন্ট হিসাবে স্বীকৃত হবে This এভাবে ক্লাস এ যে কোনও শ্রেণি গ্রহণ করতে পারে যা সেই ইন্টারফেসটিকে তার নির্মাণকারীর পক্ষে আর্গুমেন্ট হিসাবে ব্যবহার করে।
এই ধরণের কোডিংটি বেশিরভাগ ওওপি ডিজাইনের নিদর্শনগুলিতে ব্যবহৃত হয় এবং পরবর্তী সময়ে কোডের অনেক সহজ পরিবর্তনের জন্য অনুমতি দেয়। এগুলি এজিআইএল প্রোগ্রামিংয়ের মৌলিক অংশগুলির of
@ পিজেস্কেপটিকের একটি ভাল উত্তর রয়েছে , এবং @ কমিল টোমকের সেই উত্তর সম্পর্কে একটি ভাল মন্তব্য রয়েছে।
পিএইচপি এর মতো গতিময় টাইপ করা ভাষা সম্পর্কে দুর্দান্ত বিষয় হ'ল আপনি অবজেক্টগুলিতে পদ্ধতি ব্যবহার করার চেষ্টা করতে পারেন এবং পদ্ধতিটি না থাকলে এটি আপনাকে চিৎকার করবে না।
পিএইচপি-র মতো গতিসম্পন্ন টাইপযুক্ত ভাষার সমস্যাটি হ'ল আপনি বস্তুগুলিতে পদ্ধতিগুলি ব্যবহার করার চেষ্টা করতে পারেন এবং পদ্ধতিটি না থাকলে এটি আপনাকে চিৎকার করবে।
ইন্টারফেসগুলি একটি অজানা বস্তুর কল করার পদ্ধতিগুলি এবং পদ্ধতিগুলি রয়েছে কিনা তা নিশ্চিত হওয়ার সুবিধাজনক উপায় যুক্ত করে (এটি যে তারা প্রয়োজনীয়ভাবে সঠিক বা কাজ করতে যাচ্ছে না)। এটি কোনও ভাষার প্রয়োজনীয় অংশ নয়, তবে কোডিং আরও সুবিধাজনক করে তোলে। এটি দৃ strongly়ভাবে টাইপযুক্ত ওওপি বিকাশকারীকে দৃ strongly়ভাবে টাইপযুক্ত পিএইচপি কোড লেখার অনুমতি দেয়, যা পরে কোনও পৃথক পিএইচপি বিকাশকারী দ্বারা লিখিতভাবে আলগা টাইপ করা পিএইচপি কোডের পাশাপাশি কাজ করতে পারে।
যেমন একটি ফাংশন:
foo( IBar $bar )
{
$baz = $bar->baz();
...
}
এর চেয়ে বেশি সুবিধাজনক:
foo( $bar )
{
if ( method_exists( $bar, 'baz' ) )
{
$baz = $bar->baz();
}
else
{
throw new Exception('OMGWTF NO BAZ IN BAR!');
}
...
}
এবং আইএমএইচও সহজ, পঠনযোগ্য কোড হ'ল আরও ভাল কোড।
আপনি যদি হাঁস-টাইপার ব্যবহার করেন তবে তারা সম্পূর্ণরূপে অকেজো, আপনি যখন হাঁস-টাইপিং করেন তখন লাইব্রেরি / ফ্রেমওয়ার্কের সাথে কাজ করা বেশ বিরক্তিকর যা কোনও টাইপ-হিন্টিং ব্যবহার করে।
এটি সব ধরণের গতিশীল মেটা-প্রোগ্রামিং (যাদু পদ্ধতি) এর জন্যও প্রযোজ্য।
পিএইচপি হয় না ঢিলেঢালাভাবে বা দৃঢ়ভাবে কিন্তু পরিবর্তনশীল টাইপ করা ।
ইন্টারফেস সম্পর্কে, আপনার নিজেকে প্রথমে জিজ্ঞাসা করা উচিত: ইন্টারফেসের বেশিরভাগ সুবিধা কী কী?
ওওপি-তে, ইন্টারফেসগুলি কেবলমাত্র ধরণের সম্পর্কে নয়, আচরণগতভাবেও হয়।
যেহেতু পিএইচপি-তেও একটি প্রকারের ইঙ্গিত বৈশিষ্ট্য রয়েছে , আপনি জাভা হিসাবে খাঁটি oo ভাষায় যেমন ইন্টারফেস ব্যবহার করতে পারেন।
interface File
{
public function getLines();
}
CSVFile implements File
{
public function getLines()
{}
}
XMLFile implements File
{
public function getLines()
{}
}
JSONFile implements File
{
public function getLines()
{}
}
class FileReader
{
public function read(File $file)
{
foreach($file->getLines() as $line)
{
// do something
}
}
}
পিএইচপি ইন্টারফেস প্রয়োগের সাথে সাথে, আপনি পিএইচপিউনিট ব্যবহার করে বিমূর্ত ক্লাসগুলির জন্য মক তৈরি করতে পারেন - এবং এটি একটি বৈশিষ্ট্যের নরক:
public function testSomething()
{
$mock = $this->getMockForAbstractClass('File');
$mock->expects($this->once())
->method('getLines')
->will($this->returnValue(array()));
// do your assertions
}
সুতরাং, মূলত, ভাষা বৈশিষ্ট্যগুলি ব্যবহার করে আপনার পিএইচপিতে একটি সলিড সামঞ্জস্যপূর্ণ অ্যাপ্লিকেশন থাকতে পারে , যার মধ্যে একটি ইন্টারফেস।
ইন্টারফেসগুলি নির্ভরতার ইনজেকশনের জন্য কংক্রিটের চেয়ে অনেক বেশি কার্যকর। খোলামেলা উদাহরণ হিসাবে:
interface Istore {
public function save();
}
class Article_DB implements Istore
{
public function save($data)
{
// do save to format needed.
}
}
class Article
{
private $content;
public function content($content)
{
$this->content = $content;
}
public function save(Istore $store)
{
$store->save($this->content);
}
}
$article = new Article();
$article->content('Some content');
$store = new Article_DB();
$article->save($store);
এখন বলুন যদি আপনার প্রয়োজনীয়তা পরিবর্তন হয় এবং আপনি কোনও পিডিএফ সংরক্ষণ করতে চান। আপনি নিবন্ধ ক্লাসকে দূষিত করার পরিবর্তে সেই উদ্দেশ্যে একটি নতুন ক্লাস তৈরি করতে পারেন।
class Article_PDF implements Istore
{
public function save($data)
{
// do save to format needed.
}
}
$article = new Article();
$article->content('Some content');
$store = new Article_PDF();
$article->save($store);
আর্টিক্যাল ক্লাসে এখন একটি চুক্তি রয়েছে যা ক্লাসগুলি সেভ করতে ব্যবহার করে অবশ্যই Istore ইন্টারফেস প্রয়োগ করতে হবে। এটি কোথায় সংরক্ষণ করে বা কীভাবে এটি সংরক্ষণ করে তা বিবেচ্য নয়।
আপনি "জাল" রিয়েল অবজেক্টগুলি সরবরাহ করতে পারেন যা ইন্টারফেস প্রয়োগ করে। এরপরে আপনি প্রকৃত সার্ভার, ফাইল সিস্টেম, সকেট, ডাটাবেস ইত্যাদির প্রয়োজন ছাড়াই আপনার কোডের একটি অংশকে পরীক্ষা করতে পারেন
প্রচুর লোক সম্ভবত এইভাবে উত্তর দেওয়ার জন্য আমাকে ঘৃণা করবে তবে আপনার টাইপিং সমস্যার সমাধান পিএইচপি দিয়ে খুব সহজেই ঠিক করা যেতে পারে। হ্যাঁ পিএইচপি খুব শিথিলভাবে টাইপ করা হয় তাই টাইপগুলি ডিফল্টরূপে ধরে নেওয়া হয়, যা কিছু সমস্যা তৈরি করতে পারে, বিশেষত তুলনামূলক ক্রিয়ায় যা এটির সাথে বেশিরভাগ মানুষের সমস্যা problem বলা হচ্ছে, পিএইচপি কোনও জোরালোভাবে টাইপিত ভাষার মতোই কঠোর হতে পারে যদি আপনি যা প্রয়োজন তার মধ্যে যেটি ব্যবহার করছেন তা castালাই করুন এবং তারপরে বিটওয়াইজ তুলনা অপারেটরগুলি ব্যবহার করুন। আমি যা বলছি তার সম্পর্কে আমি এখানে সবচেয়ে সহজ উদাহরণটি বলতে পারি:
$ myVar = (অন্তর্) 0; ; myOtherVar = '0';
তুলনা করা ($ myVar == $ myVar) সমান (বুল) সত্য হবে
তবে তুলনা করা ($ myVar === $ myVar) অন্য কোনও "টাইপড" তুলনার মতো মিথ্যা (মুল) মিথ্যা হবে
আমি সত্যিই কামনা করি যে বিকাশকারীরা এই বিষয়গুলি নিয়ে বিতর্ক বন্ধ করে দেবেন, যদি আপনার পিএইচপি কাজ করার পদ্ধতিতে জাভাতে প্রোগ্রাম যায় এবং বাঁচতে দেয় বা জীবনযাপন করতে পারে বা আপনি যা চান তা এটি করবে এমনভাবে ব্যবহার করে .. এটি সম্পর্কে তাত্পর্যপূর্ণভাবে কীভাবে আপনার পক্ষে ভাল হয়? সারাদিন ঘুরে দাঁড়ানোর একটা অজুহাত দিবেন? আপনি অন্য কারও চেয়ে ভাল দেখাচ্ছে? আচ্ছা এটি দুর্দান্ত যে আপনি নিজের সম্পর্কে এত উচ্চমান বোধ করছেন যে আপনি অন্য কাউকে খারাপ দেখাতে ইচ্ছুক কিন্তু বাস্তবে এটি আপনার পছন্দ এবং যে কারও উপর আপনার বিশ্বাসকে জোর করে চাপিয়ে দেওয়ার কারণে তারা কেবল তিনটি বিষয় ঘটাতে স্বাচ্ছন্দ্য বোধ না করে এমনভাবে কোড তৈরি করে:
1) তারা আপনার পথটিকে কোড করবে তবে আপনার মানদণ্ড অনুসারে "অগোছালো" (মনে করুন, আপনি কি কখনও কোনও জাভা প্রোগ্রামারকে তাদের প্রথম পিএইচপি প্রোগ্রাম তৈরি করতে দেখেছেন বা এর বিপরীতে? এটি তাদের পদ্ধতি পরিবর্তন করতে পারে বা আরও খারাপ হতে পারে))
2) আপনি whine সম্পর্কে অন্য কিছু পাবেন
3) সম্ভবত তাদের উত্পাদন করতে বেশি সময় লাগবে। এবং এটি সম্ভবত আপনাকে স্বল্প মেয়াদে আরও ভাল দেখায়, তবে সামগ্রিকভাবে দলটি এর জন্য আরও খারাপ দেখবে (মনে রাখবেন আপনি অন্য কারও চেয়ে ধীর গতিতে দেখবেন এবং যতক্ষণ না টিম যুক্তিসঙ্গত সময়সীমার মধ্যে ডেলিভারিযোগ্যগুলি পূরণ করে ততক্ষণ খারাপ নয়) তবে যিনি সাধারণত কিছুটা দ্রুত সঞ্চালন করেছেন তার প্রতি আপনার অভ্যাস জোর করে ফেললে আপনার পুরো দলটি এভাবে ধীর হয়ে যায়, খুব দাবিদার ওয়ার্কফ্লোতে আরও খারাপ দেখাবে)
আমি ব্যক্তিগতভাবে প্রসেসরাল পিএইচপি কোডটি লেখার পক্ষে পছন্দ করি যদিও আমি কয়েকটি পৃথক ভাষায় ওওপি ব্যবহার করে সম্পূর্ণ প্রোগ্রাম লিখে এবং করতে পারি। বলা হচ্ছে, আমি ভাল ওওপি কোড এবং খারাপ ওওপি কোড এবং সেই বিষয়ে ভাল প্রসেসালাল কোড এবং খারাপ পদ্ধতিগত কোড দেখেছি ... এর অনুশীলনের সাথে আসলে কিছুই করার নেই, তবে আপনি যে অভ্যাসগুলি ব্যবহার করেন এবং তারপরেও, অনেক কিছুই আমার ব্যাখ্যা অনুভূতি ... এর অর্থ এই নয় যে আমি সেই বিকাশকারীদের সম্পর্কে খারাপ কথা বলতে যাচ্ছি বা "আমার উপায় সেরা" বিএসের সাথে দাম্ভিক কথা বলতে যাচ্ছি, এটি আমার পক্ষে ঠিক, এবং আমি যে সংস্থার জন্য কাজ করি তা সুন্দর। আমার কাজ নিয়ে খুশি এবং আমি এতে গর্বিত। একটি স্ট্যান্ডার্ড প্রতিষ্ঠিত হওয়ার কারণ রয়েছে তবে আপনি যে স্ট্যান্ডার্ডটি চয়ন করেছেন তার মধ্যে যা অন্তর্ভুক্ত করা হয়েছে তা অত্যন্ত গুরুত্বপূর্ণ ... আমাকে আমার বুক থেকে নামিয়ে দেওয়ার জন্য ধন্যবাদ Thanks দিন শুভ হোক.
উদাহরণ: আপনার ডেটা ক্যাশে করা দরকার। কিভাবে? ক্যাচিংয়ের জন্য প্রচুর আলাদা ইঞ্জিন রয়েছে, কোনটি সেরা? আপনার কী বিমূর্ত স্তর রয়েছে যার কী কী, পাওয়া, রাখা, পরিষ্কার ইত্যাদি পদ্ধতিগুলির সেট সহ কিছু আইচি ক্যাড্রাইভার ইন্টারফেস রয়েছে কেবলমাত্র বর্তমান প্রকল্পে আপনার যা প্রয়োজন তা এটি প্রয়োগ করুন এবং যখন আপনার অন্য প্রয়োজন হবে তখন এটি পরিবর্তন করুন। অথবা টোস্ট্রিংয়ের সহজ ব্যবহার। আপনার কাছে বিভিন্ন প্রদর্শনযোগ্য অবজেক্টের একটি সেট রয়েছে। আপনি কেবল স্ট্রিংয়েবল ইন্টারফেস প্রয়োগ করেছেন (যা স্ট্রিং পদ্ধতি বর্ণনা করে [পিএইচপি-তে আসলে এর মতো কোনও ইন্টারফেস নেই, তবে উদাহরণস্বরূপ]) এবং কেবলমাত্র আপনার স্ট্রিংয়ের (স্ট্রিং) withজেক্টের সাথে ইন্টারঅ্যাক্ট করে। এ 1 এর পরিবর্তে (সত্য) {কেস $ isজেট: "কর 1" এর পরিবর্তে আপনাকে যা করতে হবে তা সব আছে; বিরতি; ...
সহজ। সুতরাং "কেন?" কোনও প্রশ্ন নেই। "এটি কীভাবে আরও ভালভাবে ব্যবহার করবেন?" ;-) শুভকামনা।
আমার ধারণা.
পিএইচপি অনেক এন্ট্রি লেভেলের প্রোগ্রামাররা ব্যবহার করে , এন্ট্রি লেভেলের প্রোগ্রামারদের কলেজে জাভা শেখানো হয়।
তাদের প্রোগ্রামিং ১০১ কোর্সের পরে তারা জেন্ডকে কড়া নাড়তে শুরু করে তারা জাভা বৈশিষ্ট্য চায় কারণ এগুলি তাদের নিজের শর্তে (বা হাঁসের টাইপিং বোঝার) উপর চিন্তা করা কঠিন, যখন আপনি কেবল ২০ বছর বয়সী।
জেনড বাস্তববাদী, তারা ঠিক যেখানে ডানদিকে ভান করা ছাড়া এটি বৈশিষ্ট্য যুক্ত করা আরও সহজ ।
এটি আরও ব্যবহারকারীদের ছেড়ে দেওয়ার পরিবর্তে ক্রয় করে, তাই এটি অবশ্যই ভাল।
এই প্রক্রিয়ার আর একটি উদাহরণ? নেট এবং জাভা কোর্সের বাইরে থাকা লোকেরাও ফাউন্ডেশন ক্লাসের ফ্রেমওয়ার্ক চায় , জেনড ফ্রেমওয়ার্কটি বের না করা পর্যন্ত তারা এগুলি নিয়ে ব্যস্ত থাকে । এটি আরও বেশি ব্যবহারকারীদের কেনে। হতেই লাগলো...
(পিএইচপি দলের একমাত্র ভাষার বৈশিষ্ট্যটি বছরের পর বছর ধরে লড়াই করেছে বলে জানা যায় goto
)
PHP12
সম্ভবত বিশ্বের সমস্ত সিনট্যাক্স বৈশিষ্ট্য থাকবে (আমি আশা করি এটি একটি বিমূর্ত স্তর রানটাইম পাবেন না, শক্ত, এটিই পার্লকে মেরেছিল) ফাংশনাল এবং ডেটাটাইপ দৃষ্টান্তের জন্য একটি পলক দিয়ে, এবং এখনও নেই goto
।