मैंने देखा कि PHP5 के रूप में, इंटरफेस को भाषा में जोड़ा गया है। हालाँकि, चूंकि PHP इतनी शिथिल टाइप की है, इसलिए ऐसा लगता है कि इंटरफेस का उपयोग करने का अधिकांश लाभ खो गया है। इसे भाषा में क्यों शामिल किया गया है?
मैंने देखा कि PHP5 के रूप में, इंटरफेस को भाषा में जोड़ा गया है। हालाँकि, चूंकि PHP इतनी शिथिल टाइप की है, इसलिए ऐसा लगता है कि इंटरफेस का उपयोग करने का अधिकांश लाभ खो गया है। इसे भाषा में क्यों शामिल किया गया है?
जवाबों:
PHP में इंटरफेस का मुख्य लाभ यह है कि कक्षाएं कई इंटरफेस को लागू कर सकती हैं। यह आपको उन कक्षाओं को समूहीकृत करने की अनुमति देता है जो कुछ कार्यक्षमता साझा करते हैं लेकिन जरूरी नहीं कि वे मूल वर्ग को साझा करते हों। कुछ उदाहरणों में एक निश्चित तरीके से वर्ग के कैशिंग, आउटपुट या एक्सेसिंग गुण शामिल हो सकते हैं।
अपने कोड में, आप यह देख सकते हैं कि कोई वर्ग वर्ग नाम की जाँच करने के बजाय दिए गए इंटरफ़ेस को लागू करता है या नहीं। फिर, जब नई कक्षाएं जोड़ी जाएंगी, तब भी आपका कोड काम करेगा।
PHP कुछ पूर्वनिर्धारित इंटरफेस प्रदान करती है जो विभिन्न स्थितियों में काम आ सकते हैं: http://php.net/manual/en/reserved.interfaces.php ।
EDIT - एक उदाहरण जोड़ना
यदि आपके पास MyInterface नाम का एक इंटरफ़ेस है और आप विभिन्न वर्गों की कई वस्तुओं के साथ काम कर रहे हैं जो कुछ कार्यक्षमता साझा कर सकते हैं या नहीं कर सकते हैं, तो इंटरफेस आपको कुछ ऐसा करने की अनुमति देता है:
// Assume $objects is an array of instances of various classes
foreach($objects as $obj) {
if($obj instanceof MyInterface) {
$obj->a();
$obj->b();
$obj->c();
}
}
PHP शिथिल टाइप की है, लेकिन इसे विधि पैरामीटर जैसी चीजों के बारे में दृढ़ता से टाइप किया जा सकता है।
निम्नलिखित उदाहरण पर विचार करें:
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();
}
}
आपकी कक्षा A और वर्ग B में अब एक तंग युग्मन है, और वर्ग A, B को छोड़कर किसी अन्य वर्ग का उपयोग नहीं कर सकता है। प्रकार संकेत यह सुनिश्चित करता है कि आपके पास सही प्रकार का तर्क है, लेकिन अब A और B के बीच संबंध को मजबूत कर दिया है।
चलो कहते हैं कि आप चाहते हैं कि क्लास ए उन सभी प्रकार की कक्षाओं का उपयोग करने में सक्षम हो जो एक रन () विधि है। यह मूल रूप से (लेकिन काफी नहीं) COMMAND डिजाइन पैटर्न है। हल करने के लिए, आप इसके बजाय एक ठोस वर्ग के बजाय एक इंटरफ़ेस का उपयोग करके संकेत देंगे। B वे उस इंटरफ़ेस को लागू करेंगे, और वर्ग ए के लिए एक तर्क के रूप में स्वीकार किया जाएगा। इस तरह वर्ग ए किसी भी वर्ग को स्वीकार कर सकता है जो उस इंटरफ़ेस को अपने निर्माता के लिए तर्क के रूप में उपयोग करता है।
इस प्रकार के कोडिंग का उपयोग अधिकांश ओओपी डिज़ाइन पैटर्न में किया जाता है, और बाद के समय में कोड के आसान परिवर्तन के लिए अनुमति देता है। ये एजाइल प्रोग्रामिंग के मूल सिद्धांतों का हिस्सा हैं।
@pjskeptic के पास एक अच्छा उत्तर है , और @Kamil Tomšík के पास उस उत्तर पर एक अच्छी टिप्पणी है।
PHP जैसी गतिशील रूप से टाइप की जाने वाली भाषाओं के बारे में महान बात यह है कि आप वस्तुओं पर विधियों का उपयोग करने का प्रयास कर सकते हैं और यह तब तक आपके ऊपर नहीं चिल्लाएगा जब तक कि विधि वहां मौजूद न हो।
PHP जैसी गतिशील रूप से टाइप की जाने वाली भाषाओं के साथ समस्या यह है कि आप ऑब्जेक्ट पर विधियों का उपयोग करने का प्रयास कर सकते हैं और जब यह विधि नहीं होगी तो यह आप पर चिल्लाएगा।
इंटरफेस किसी अज्ञात वस्तु पर कॉल करने के तरीकों का एक सुविधाजनक तरीका जोड़ते हैं और यह निश्चित करते हैं कि तरीके वहां हैं (ऐसा नहीं है कि वे आवश्यक रूप से सही हैं या काम पर जा रहे हैं)। यह किसी भाषा का आवश्यक हिस्सा नहीं है, लेकिन यह कोडिंग को अधिक सुविधाजनक बनाता है। यह दृढ़ता से टाइप किए गए OOP डेवलपरों को दृढ़ता से टाइप किए गए PHP कोड लिखने की अनुमति देता है, जो तब एक अलग PHP डेवलपर द्वारा लिखे गए शिथिल टाइप PHP कोड के साथ काम कर सकते हैं।
एक समारोह की तरह:
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!');
}
...
}
और IMHO सरल, पठनीय कोड बेहतर कोड है।
वे पूरी तरह से बेकार हैं यदि आप बतख-टाइपर हैं, वास्तव में जब आप बतख-टाइपिंग करते हैं, तो यह पुस्तकालयों / ढांचे के साथ काम करने के लिए बहुत कष्टप्रद है जो किसी भी प्रकार-संकेत का उपयोग करते हैं।
यह सभी प्रकार के डायनामिक मेटा-प्रोग्रामिंग (मैजिक मेथड्स) के लिए भी लागू होता है।
PHP नहीं है शिथिल या दृढ़ता, लेकिन गतिशील टाइप किया ।
इंटरफेस के बारे में, पहली बात जो आपको खुद से पूछनी चाहिए वह यह है: इंटरफेस के सबसे अधिक फायदे क्या हैं?
ओओपी में, इंटरफेस केवल प्रकारों के बारे में नहीं हैं, बल्कि व्यवहार के बारे में भी हैं।
चूंकि PHP में एक प्रकार का संकेत सुविधा भी है , इसलिए आप इंटरफेस का उपयोग उसी तरह कर सकते हैं जैसे आप शुद्ध oo भाषा में करते हैं, जैसे कि Java।
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
}
}
}
PHP इंटरफ़ेस के कार्यान्वयन के साथ, आप PHPUnit का उपयोग करके अमूर्त वर्गों के लिए mocks भी बनाते हैं - और यह एक फीचर का एक नरक है:
public function testSomething()
{
$mock = $this->getMockForAbstractClass('File');
$mock->expects($this->once())
->method('getLines')
->will($this->returnValue(array()));
// do your assertions
}
तो, मूल रूप से, आप भाषा सुविधाओं का उपयोग करके PHP में एक ठोस संगत अनुप्रयोग हो सकते हैं , उनमें से एक इंटरफेस है।
कंक्रीट की तुलना में बहुत अधिक निर्भरता इंजेक्शन के लिए इंटरफेस उपयोगी होते हैं। एक नंगे स्वरुप के उदाहरण के रूप में:
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);
अनुच्छेद श्रेणी में अब एक अनुबंध है जो इसे बचाने के लिए उपयोग करने वाली कक्षाओं को इस्तोर इंटरफ़ेस को लागू करना होगा। यह परवाह नहीं करता है कि यह कहाँ बचाता है या यह कैसे बचाता है।
आप इंटरफ़ेस को लागू करने वाली "नकली" वास्तविक वस्तुएं प्रदान कर सकते हैं। फिर आप वास्तविक सर्वर, फ़ाइल सिस्टम, सॉकेट, डेटाबेस आदि की आवश्यकता के बिना अपने कोड के एक हिस्से का परीक्षण कर सकते हैं।
बहुत से लोग शायद इस तरह से जवाब देने के लिए मुझसे नफरत करेंगे लेकिन आपकी टाइपिंग समस्याओं का समाधान आसानी से PHP के साथ तय किया जा सकता है। हां PHP शिथिल टाइप की जाती है इसलिए डिफ़ॉल्ट रूप से टाइप किए जाते हैं, जो कर सकते हैं विशेष रूप से तुलना के संचालन में कुछ समस्याओं के कारण है, जो इसके साथ सबसे लोगों की समस्या है। कहा जा रहा है कि, PHP किसी भी दृढ़ता से टाइप की गई भाषा के समान ही सख्त हो सकती है यदि आप उस प्रकार का उपयोग कर रहे हैं जो आप उस प्रकार में उपयोग कर रहे हैं जिसकी आपको आवश्यकता है, और फिर बिटवाइज़ तुलना ऑपरेटरों का उपयोग करें। यहां सबसे आसान उदाहरण है कि मैं जो कह रहा हूं उसके बारे में सोच सकता हूं:
$ myVar = (int) 0; $ myOtherVar = '0';
तुलना करना ($ myVar == $ myVar) बराबर (बूल) सही होगा
लेकिन तुलना ($ myVar === $ myVar) बराबर (बूल) किसी भी "टाइप की गई" की तरह ही झूठी होगी
मैं वास्तव में चाहता हूं कि डेवलपर्स इन चीजों के बारे में बहस करना बंद कर दें, अगर आपको PHP के काम करने के तरीके में कोई समस्या है या तो जावा में प्रोग्राम करें और जियो और जीने दो, या इसे इस तरह से उपयोग करें कि यह वही करेगा जो आप इसे चाहते हैं .. क्या अच्छा है इसके बारे में कुतिया वैसे भी तुम्हारे लिए है? क्या आप पूरे दिन खराब करने का बहाना देते हैं? क्या आप किसी और से बेहतर दिखते हैं? वैसे यह बहुत अच्छा है कि आप अपने बारे में बहुत अधिक महसूस करते हैं कि आप किसी और को बुरा दिखने के लिए तैयार हैं लेकिन वास्तव में यह आपकी प्राथमिकता है और किसी पर भी आपका विश्वास करने के लिए मजबूर करता है वास्तव में उन्हें एक तरह से कोड बनाता है जो तीन चीजों को पैदा करने में सहज नहीं हैं:
1) वे आपके मानकों द्वारा आपके तरीके को "लेकिन गड़बड़" कोड देंगे (सोचिए, क्या आपने कभी एक जावा प्रोग्रामर को अपना पहला PHP प्रोग्राम या इसके विपरीत बनाते देखा है? यह उसी तरह होगा जो उनकी कार्यप्रणाली को बदल देगा या शायद और भी बदतर हो जाएगा।)
2) आपको कुछ और मिल जाएगा
3) उन्हें उत्पादन करने में शायद अधिक समय लगेगा। और शायद यह आपको अल्पावधि में बेहतर बना देगा, लेकिन एक पूरे के रूप में टीम इसके लिए बदतर दिखाई देगी (याद रखें कि आप किसी और की तुलना में धीमी गति से कोड कर सकते हैं और यह जरूरी नहीं है कि जब तक टीम एक उचित समय सीमा में डिलिवरेबल्स को पूरा करती है, तब तक यह बुरा नहीं है) लेकिन अपनी आदतों को किसी ऐसे व्यक्ति पर मजबूर करना, जिसने आम तौर पर थोड़ी तेजी से प्रदर्शन किया है, आपकी पूरी टीम को धीमा कर सकता है इस प्रकार, बहुत अधिक मांग में खराब दिखते हैं)
मैं व्यक्तिगत रूप से प्रक्रियात्मक PHP कोड लिखना पसंद करता हूं, हालांकि, मैं कुछ अलग भाषाओं में OOP का उपयोग करके पूर्ण कार्यक्रम लिख सकता हूं। यह कहा जा रहा है, मैंने अच्छा OOP कोड और बुरा OOP कोड, और अच्छा प्रक्रियात्मक कोड और उस प्रक्रिया के लिए बुरा प्रक्रियात्मक कोड देखा है ... इसका वास्तव में अभ्यास से कोई लेना-देना नहीं है, लेकिन उन आदतों के साथ जिनका आप उपयोग करते हैं और तब भी, बहुत सारी चीजें मेरी व्याख्या की गई भावनाएं हैं ... इसका मतलब यह नहीं है कि मैं उन डेवलपर्स के बारे में बुरी बात करने जा रहा हूं या "मेरा रास्ता सबसे अच्छा है" के साथ अपनी बड़ाई करने के लिए कह रहा हूं बीएस, यह सिर्फ मेरे लिए सही है, और जिस कंपनी के लिए मैं काम करता हूं वह बहुत सुंदर है मेरे काम से खुश हूं और मुझे उस पर गर्व है। ऐसे कारण हैं कि एक मानक स्थापित किया जाना चाहिए, लेकिन आप जो मानक चुनते हैं, उसमें आप बहुत महत्वपूर्ण हैं ... मुझे मेरी छाती से दूर जाने के लिए धन्यवाद। आपका दिन अच्छा रहे।
उदाहरण: आपको अपना डेटा कैश करना होगा। कैसे? कैशिंग के लिए कई अलग-अलग इंजन हैं, जो सबसे अच्छा है? कौन परवाह करता है अगर आपके पास अमूर्त परत है जिसमें कुछ ICacheDriver इंटरफ़ेस है जिसमें कुंजी, गेट, पुट, क्लियर आदि जैसे तरीकों का एक सेट है, बस इसे लागू करें जो आपको वर्तमान प्रोजेक्ट में चाहिए और जब आपको दूसरे की आवश्यकता हो तो इसे बदल दें। या स्टर्लिंग का सरल उपयोग। आपके पास विभिन्न प्रदर्शन योग्य वस्तुओं का एक सेट है। आप बस स्ट्रिंग इंटरफ़ेस को लागू करते हैं (जो कि स्ट्रींग विधि का वर्णन करता है [PHP में वास्तव में ऐसा कोई इंटरफेस नहीं है, लेकिन उदाहरण के लिए)) और बस (स्ट्रिंग) $ obj के साथ अपनी सभी वस्तु पर अंतर करना। स्विच (सच्चा) {केस $ obj isntanceof A1: "do 1" के बजाय आपको बस इतना करना है; टूटना; ...}
सरल। तो कोई सवाल नहीं है "क्यों?"। वहाँ है "कैसे है कि बेहतर उपयोग करने के लिए?"। ;-) सौभाग्य।
मेरा अनुमान।
PHP का उपयोग कई एंट्री लेवल प्रोग्रामर्स द्वारा किया जाता है , कॉलेज में एंट्री लेवल प्रोग्रामर्स को जावा सिखाया जाता है ।
अपने प्रोग्रामिंग 101 कोर्स के बाद वे Zend को घूरना शुरू कर देते हैं, वे जावा सुविधाएँ चाहते हैं क्योंकि यही तरीका उन्हें सोचने के लिए सिखाया गया है, अपनी शर्तों पर एक सोच (या बतख टाइपिंग को समझना) यह कठिन है, जब आप केवल 20 हैं।
Zend व्यावहारिक है, यह सुविधा के अलावा अन्य को जोड़ना आसान है , जहां वे सही तरीके से दिखाते हैं।
यह भी उन्हें छोड़ने के बजाय अधिक उपयोगकर्ताओं में खरीदता है , इसलिए यह अच्छा होना चाहिए।
इस प्रक्रिया का एक और उदाहरण? .NET और जावा पाठ्यक्रम से बाहर के लोग भी फाउंडेशन क्लासेस के फ्रेमवर्क चाहते हैं , वे इसके बारे में तब तक नग करते हैं जब तक ज़ेंड ज़ेड फ्रेमवर्क से बाहर नहीं निकलता । यह और भी अधिक उपयोगकर्ताओं में खरीदता है। और पर और पर...
(केवल वही भाषा सुविधा जो PHP टीम को ज्ञात है कि वर्षों से, के खिलाफ संघर्ष किया गया है goto
)
PHP12
शायद दुनिया की सभी वाक्यविन्यास विशेषताएं होंगी (मुझे आशा है कि यह एक अमूर्त परत रनटाइम प्राप्त नहीं करता है, कठिन, जैसा कि पर्ल को मार डाला गया है) कार्यात्मक और डेटाटाइप प्रतिमानों के लिए एक पलक के साथ, और अभी भी नहीं goto
।