PHP में DSL: व्यवसाय के लिए डोमेन-विशिष्ट भाषाएँ बनाना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

क्या होगा अगर कोड आपके व्यवसाय की भाषा बोले?

\n\n

कल्पना करें: एक सेल्स मैनेजर अपनी समझ में आने वाली अंग्रेज़ी में डिस्काउंट की शर्त लिखता है, और सिस्टम खुद उसे काम करने वाले कोड में बदल देता है। या फिर एक अकाउंटेंट टैक्स कैलकुलेशन को इस तरह डिस्क्राइब करता है, "अगर रकम 1000 से ज़्यादा है और क्लाइंट EU से है, तो 5% रेट लागू करें।" बिना एक लाइन PHP लिखे। यह कल्पना जैसा लगता है? PHP में डोमेन-विशिष्ट भाषाओं (DSL) की दुनिया में आपका स्वागत है।

\n\n

ज़्यादातर डेवलपर्स PHP को वेब की भाषा के रूप में जानते हैं, लेकिन कम ही लोग इसकी सुपरपावर — DSL बनाना — का उपयोग करते हैं। यह सिर्फ एक तकनीकी ट्रिक नहीं है, बल्कि एक शक्तिशाली टूल है जो बिज़नेस रूल्स की अव्यवस्था को सुंदर, पढ़ने योग्य कोड में बदल देता है। इस लेख में हम सिर्फ थ्योरी नहीं पढ़ेंगे, बल्कि शुरू से एक काम करने वाला PHP DSL बनाएंगे। आप देखेंगे कि कैसे DSL डेवलपमेंट आपकी और आपके क्लाइंट्स की ज़िंदगी को आसान बना सकता है।

\n\n

DSL क्या है और PHP में इसकी ज़रूरत क्यों है?

\n\n

DSL (Domain Specific Language) एक ऐसी भाषा है जो किसी खास काम के लिए बनाई जाती है। सामान्य प्रोग्रामिंग भाषा (जैसे PHP, Java या Python) के विपरीत, DSL आपके डोमेन की भाषा बोलती है। उदाहरण: डेटाबेस के लिए SQL, पैटर्न खोजने के लिए रेगुलर एक्सप्रेशन, वेब पेज बनाने के लिए HTML।

\n\n

PHP में DSL क्यों बनाएं? तीन मुख्य कारण:

\n\n
    \n
  • पढ़ने में आसानी। DSL पर लिखा कोड हिंदी या अंग्रेज़ी में दिए गए निर्देश जैसा दिखता है। लॉजिक समझने के लिए प्रोग्रामर होना ज़रूरी नहीं।
  • \n
  • सुरक्षा। आप नियंत्रित कर सकते हैं कि यूज़र क्या कर सकता है। कोई eval या shell_exec नहीं।
  • \n
  • डेवलपमेंट की गति। बिज़नेस एनालिस्ट और मैनेजर खुद नियम लिख सकते हैं, डेवलपमेंट टीम को परेशान किए बिना।
  • \n
\n\n

PHP में डोमेन-विशिष्ट भाषाएँ बनाने के दो मुख्य तरीके हैं: आंतरिक DSL (PHP सिंटैक्स पर आधारित) और बाहरी DSL (जिसके लिए अपना पार्सर चाहिए)। हम पहले से शुरू करेंगे — यह आसान है और अक्सर 80% कामों के लिए काफी होता है।

\n\n

तरीका 1: आंतरिक DSL — Fluent Interface और मेथड्स का जादू

\n\n

आंतरिक DSL तब होता है जब आप PHP सिंटैक्स का उपयोग करते हैं, लेकिन इसे इस तरह व्यवस्थित करते हैं कि यह प्राकृतिक भाषा जैसा लगे। क्लासिक उदाहरण है fluent interface (प्रवाहशील इंटरफ़ेस)। चलिए SQL क्वेरी बनाने के लिए एक DSL लिखते हैं, ताकि आप तुरंत जादू महसूस कर सकें।

\n\n

उदाहरण: SQL क्वेरी बनाने के लिए DSL

\n\n

इसके बजाय कि हम लिखें:

\n\n
$query = "SELECT * FROM users WHERE age > 18 AND city = 'Moscow' ORDER BY name ASC LIMIT 10";
\n\n

हम ऐसे लिखना चाहते हैं:

\n\n
$query = QueryBuilder::table('users')\n    ->select('*')\n    ->where('age', '>', 18)\n    ->where('city', '=', 'Moscow')\n    ->orderBy('name', 'ASC')\n    ->limit(10)\n    ->get();
\n\n

मान गए, यह एक वाक्य की तरह पढ़ा जाता है। इसे लागू करना आसान है: हर मेथड $this लौटाता है, और अंत में get() मेथड स्ट्रिंग बनाता है।

\n\n
class QueryBuilder {\n    private array $parts = [];\n\n    public function table(string $name): self {\n        $this->parts['table'] = $name;\n        return $this;\n    }\n\n    public function select(string $columns = '*'): self {\n        $this->parts['select'] = $columns;\n        return $this;\n    }\n\n    public function where(string $column, string $operator, $value): self {\n        $this->parts['where'][] = "$column $operator " . (is_string($value) ? "'$value'" : $value);\n        return $this;\n    }\n\n    public function orderBy(string $column, string $direction = 'ASC'): self {\n        $this->parts['order'] = "$column $direction";\n        return $this;\n    }\n\n    public function limit(int $limit): self {\n        $this->parts['limit'] = $limit;\n        return $this;\n    }\n\n    public function get(): string {\n        $sql = "SELECT {$this->parts['select']} FROM {$this->parts['table']}";\n        if (!empty($this->parts['where'])) {\n            $sql .= " WHERE " . implode(' AND                

ब्लॉग

पुस्तक अनुशंसाएँ