परिचय: दो दृष्टिकोण, एक लड़ाई
\n\nहर PHP डेवलपर को कभी न कभी इस चुनौती का सामना करना पड़ता है: क्या Functional स्टाइल में कोड लिखें या Classes और Objects की दुनिया में उतरें? यह स्विस चाकू और मल्टीटूल के बीच चुनने जैसा है - दोनों काम करते हैं, लेकिन तरीका अलग है। इस लेख में हम PHP में Functional vs Object-Oriented दृष्टिकोण को समझेंगे, असली कोड देखेंगे और तय करेंगे कि कब किस टूल का उपयोग करना चाहिए।
\n\nPHP एक अनोखी भाषा है। यह Procedural के रूप में शुरू हुई, OOP तक विकसित हुई, और नवीनतम संस्करणों (7.4+, 8.x) में Functional फीचर्स को सक्रिय रूप से अपना रही है: Arrow Functions, Closures, Type Hinting। इसका मतलब है कि आप दोनों दृष्टिकोणों को मिला सकते हैं। लेकिन भ्रम से कैसे बचें? आइए समझते हैं।
\n\nमूल बातें: दोनों दुनिया में क्या अंतर है
\n\nFunctional दृष्टिकोण (Functional Programming)
\n\nयहाँ मुख्य चीज़ Functions हैं। Pure Functions जिनका कोई Side Effect नहीं होता और जो हमेशा अनुमानित परिणाम देते हैं। कोई Shared State नहीं, कोई Variable Mutation नहीं। डेटा एक कन्वेयर बेल्ट की तरह चेन के माध्यम से जाता है।
\n\n// Functional स्टाइल: सरल, अनुमानित\n$numbers = [1, 2, 3, 4, 5];\n\n$result = array_map(\n fn($n) => $n * 2,\n array_filter($numbers, fn($n) => $n % 2 === 0)\n);\n\nprint_r($result); // [4, 8]\n\nध्यान दिया? हमने Original Array को नहीं बदला, Loops का उपयोग नहीं किया। सब कुछ Declarative है: सम संख्याएँ लो, दोगुना करो, दो। इससे Debugging में समय बचता है - कोई Side Effects नहीं।
\n\nObject-Oriented दृष्टिकोण (OOP)
\n\nOOP Objects के इर्द-गिर्द बनता है - Entities जो State और Behavior को स्टोर करती हैं। Classes डेटा को Encapsulate करती हैं, Inheritances फंक्शनैलिटी बढ़ाते हैं, Polymorphism लॉजिक को बदलने की सुविधा देता है।
\n\n// OOP स्टाइल: संरचना और पुन: उपयोग\nclass NumberProcessor {\n private array $numbers;\n\n public function __construct(array $numbers) {\n $this->numbers = $numbers;\n }\n\n public function getEvens(): array {\n return array_filter($this->numbers, fn($n) => $n % 2 === 0);\n }\n\n public function multiplyBy(int $factor): self {\n $this->numbers = array_map(fn($n) => $n * $factor, $this->numbers);\n return $this;\n }\n\n public function getResult(): array {\n return $this->numbers;\n }\n}\n\n$processor = new NumberProcessor([1, 2, 3, 4, 5]);\n$result = $processor->getEvens()->multiplyBy(2)->getResult();\nprint_r($result); // [4, 8]\n\nयहाँ हमने एक Object बनाया जो State को स्टोर करता है। Methods को Chain करके कॉल किया जा सकता है। फायदा: अगर कोई नया ऑपरेशन जोड़ना है - बस Class में एक Method लिखें।
\n\nFunctional दृष्टिकोण कब बेहतर है
\n\n1. बिना Side Effects के डेटा प्रोसेसिंग
\n\nमान लीजिए आप Log Parser या Currency Converter लिख रहे हैं। डेटा कन्वेयर पर बहता है: पढ़ो → फ़िल्टर करो → बदलो → सेव करो। यहाँ Functions सबसे अच्छा विकल्प हैं। वे बाहरी State पर निर्भर नहीं होते, टेस्ट करना आसान है।
\n\n2. Collections और Arrays
\n\nPHP Arrays के साथ काम करने के लिए शक्तिशाली Functions प्रदान करता है: array_map, array_filter, array_reduce। Arrow Functions (PHP 7.4+) के साथ मिलकर यह कोड को कविता में बदल देता है।
$users = [\n ['name' => 'अन्ना', 'age' => 25],\n ['name' => 'बोरिस', 'age' => 17],\n ['name' => 'विका', 'age' => 30],\n];\n\n$adultNames = array_map(\n fn($user) => $user['name'],\n array_filter($users, fn($user) => $user['age'] >= 18)\n);\n\n// ['अन्ना', 'विका']\n\nसाफ, पढ़ने योग्य, बिना Classes के। सरल Transformations के लिए - यह सबसे अच्छा विकल्प है।
\n\n3. बिना Mocks के टेस्टिंग
\n\nFunctions का कोई State नहीं होता, इसलिए उन्हें टेस्ट करना आसान है। जटिल Mocks और Stubs बनाने की ज़रूरत नहीं। बस डेटा दिया - परिणाम मिला।
\n\nObject-Oriented दृष्टिकोण कब अपरिहार्य है
\n\n1. State के साथ जटिल बिज़नेस लॉजिक
\n\n