यह पोस्ट लेख का अनुवाद नहीं है, जैसा कि प्रथागत है, लेकिन एक रिपोर्ट + प्रस्तुति है, इसलिए पोस्ट का पाठ काफी स्वतंत्र है।मुझे लगता है कि हर कोई अच्छी तरह से वाकिफ है और यह स्पष्ट है कि PHP सबसे लोकप्रिय प्रोग्रामिंग भाषाओं में से एक है, जिस पर कई वेब परियोजनाएं लिखी जाती हैं, जिसमें व्यक्तिगत होमपेज पेज से लेकर फेसबुक, विमो, वर्डप्रेस और यहां तक कि YouPorn जैसे मास्टोडन भी शामिल हैं।
PHP 1995 में दिखाई दी, जबकि OOP के लिए पूर्ण समर्थन केवल PHP5 में लागू किया गया था, जिसे 2005 में जारी किया गया था। इस समय के दौरान, बड़ी मात्रा में कोड लिखा गया था, दोनों अच्छे और बुरे, या बल्कि, बहुत पुराने और बनाए रखने के लिए कठिन।
PHP इकोसिस्टम की तरह कई परियोजनाएं, अब एक जीवंत शहर ब्लॉक की झलक दिखाने के लिए शुरू हो गई हैं।

नए PHP संस्करण
नया दशक हमारे लिए PHP5.3 और PHP5.4 लेकर आया, जो उत्पादकता बढ़ाने के अलावा, बहुत सारी अच्छाइयों को लेकर चलती है! यहाँ उनमें से कुछ ही हैं:
1.
नामस्थान (php 5.3)
namespace JoliCode\Conferences; use General\Talk\Session; class SymfonyLive extends Session { public function runPresentation() { } }
- वर्ग के नामकरण में संयोग से बचाओ;
- अनिश्चितता कम करें;
- लंबी कक्षा के नामकरण से बचना।
2.
बेनामी कार्यों और क्लोजर (php 5.3), और वस्तुओं के अंदर भी (php 5.4)
$container['session'] = function ($c) { return new Session($c['session_storage']); };
3.
फ़ार अभिलेखागार (php 5.3)
पुस्तकालयों को एक कनेक्टेड फ़ार-फाइल के रूप में वितरित करने की अनुमति दें।
4.
"गोटो" - क्या .. .. ?? (php 5.3)
5.
लक्षण (php 5.4)
6. सरणियाँ घोषित करने के लिए लघु वाक्य रचना! (php 5.4)
function fruits() { return ['apple', 'banana', 'orange']; } echo fruits()[0];
और भी
बहुत कुछ ।
चौखटे
PHP के नए संस्करण चौखटे के उद्भव के लिए उत्प्रेरक बन गए हैं। उनमें से, यह सिम्फनी, ज़ेंड फ्रेमवर्क, वाईआईआई, कोडइग्निटर, केकपीएचपी का उल्लेख करने योग्य है। जारी किए गए दूसरे संस्करणों में उनमें से लगभग सभी को काफी अपडेट किया गया है।
इन रूपरेखाओं में से एक, Symfony2,
स्वतंत्र घटकों के एक
सेट पर बनाया गया है, साथ ही कई तृतीय-पक्ष समाधान भी हैं जो PHP भाषा की नई विशेषताओं का उपयोग करते हैं और पुराने कोड के साथ आपको फिर से तैयार करने में मदद करते हैं।
परियोजना पुनर्जीवन रणनीति
कल्पना कीजिए कि आपकी परियोजना को लगभग 5 साल हो गए हैं। इस समय के दौरान:
- कार्यक्षमता की एक बड़ी मात्रा को लागू किया गया है;
- परियोजना उत्पादन में काम करती है;
- यह लगातार उपयोगकर्ताओं के बड़े दर्शकों द्वारा उपयोग किया जाता है;
- अधिक डेटा जमा हो गया है;
- परियोजना के चारों ओर एक अनुभवी टीम बनाई गई है।
इस मामले में:
- धीरे-धीरे नई कार्यक्षमता का परिचय;
- परियोजना और इसके बुनियादी ढांचे के समर्थन के साथ समस्या;
- मौजूदा कार्यक्षमता में सुधार करना मुश्किल है।

तरीका 1: द बिग बैंग
ऐसी स्थिति में सबसे स्वाभाविक इच्छा
सभी कोड को बाहर फेंकना और इसे फिर से लिखना है! कल्पना कीजिए कि हम इस तरह से गए। निस्संदेह, हम नए आधुनिक ढाँचों में से एक के साथ काम करने के अवसर से संतुष्टि प्राप्त करेंगे, पुराने कोड के बारे में भूल जाते हैं, और कुछ जगहों पर एक बुरे सपने की तरह, कोड को बायलॉक करते हैं।
लेकिन, यदि आप सच्चाई का सामना करते हैं, तो प्रक्रिया काफी बड़े पैमाने पर, जटिल और लंबी होने की संभावना है और सभी कार्यक्षमता को फिर से लिखने के लिए कम से कम 1 व्यक्ति-वर्ष लगेगा। इसी समय, परियोजना के मौजूदा संस्करण का विकास बंद हो जाएगा, जो आपकी परियोजना के व्यवसाय के लिए वित्तीय नुकसान और उन उपयोगकर्ताओं के बहिर्वाह का कारण होगा, जिन्हें पर्याप्त ध्यान नहीं दिया जाता है। साथ ही, सभी कार्यक्षमता को नए प्लेटफॉर्म पर पूरी तरह से स्थानांतरित करने में सक्षम नहीं होने का जोखिम अधिक होगा। इन जोखिमों के कारणों में से एक डेटा भंडारण प्रणालियों की नई संरचना में मौजूदा डेटा को स्थानांतरित करने के साधनों को विकसित करने की आवश्यकता होगी।
तरीका 2: लगातार बने रहें
इसलिए, यह हैकिंग के लायक नहीं है, परियोजना के क्रमिक अद्यतन की रणनीति अधिक उचित होगी। उसी समय, परियोजना का विकास और समर्थन बंद नहीं होगा, और इसलिए आपका व्यवसाय बंद नहीं होगा। यह दृष्टिकोण परियोजना में पूरे नए ढांचे के उपयोग की अनुमति नहीं देगा, लेकिन आप इसके व्यक्तिगत भागों का उपयोग कर सकते हैं। इस मामले में Symfony2 घटक बहुत उपयुक्त हैं, क्योंकि उनके पास कोई निर्भरता नहीं है, जबकि वे बिंदु और बिंदु कार्यक्षमता प्रदान करते हैं।
कार्रवाई के लिए आगे बढ़ें
चरण 1. परियोजना को PHP 5.3 या PHP 5.4 में स्थानांतरित करें

सबसे पहले, PHP को कम से कम PHP संस्करण 5.3 में अपडेट करें। हम इसे ध्यान से करते हैं, हम अपडेट को सबसे पहले देव-सर्वर पर करेंगे और जांचेंगे कि सिस्टम का कोई भाग बंद तो नहीं हुआ है। तब आप ठेस सर्वर पर जांच कर सकते हैं। एक ही समय में, यह पूरी परियोजना पर नहीं, बल्कि ए / बी परीक्षण मोड में करने की सलाह दी जाती है, ताकि उपयोगकर्ताओं का केवल एक हिस्सा नए वातावरण में पहुंचे।
एक बार जब आप आश्वस्त हो जाते हैं कि सब कुछ ठीक चल रहा है, तो आप आगे बढ़ सकते हैं।
चरण 2. भविष्य की प्रणाली को फिर से तैयार करने के लिए नींव तैयार करना

हम मुख्य घटकों को जोड़ते हैं: ClassLoader, DependencyInjection और HTTPFoundation। वे हमें फिर से तैयार करने में मदद करेंगे और नए घटकों को जोड़ने की नींव रखेंगे।
ये और सभी निम्नलिखित घटक
संगीतकार पैकेज प्रबंधक का उपयोग करके आसानी से जुड़े हो सकते हैं। यह आपको जस प्रारूप में तीसरे पक्ष के पुस्तकालयों पर परियोजना की निर्भरता का सफलतापूर्वक वर्णन करने की अनुमति देता है, स्वचालित रूप से उन्हें स्थापित और अद्यतन करता है, और उन्हें परियोजना में जोड़ने के लिए एक ऑटोलॉड फ़ाइल भी उत्पन्न करता है। Habré पर इसका उपयोग करने के तरीके पर एक
अच्छा लेख है।
हमारे मामले में, कम्पोज़र के लिए कॉन्फ़िगरेशन फ़ाइल इस तरह दिखाई देगी:
{ "autoload": { "psr-0": {} }, "name": "xavierlacot/blog", "description": "My old blog on steroids", "require": { "php": ">=5.3.3", "symfony/class-loader": "2.1.*", "symfony/dependency-injection": "2.1.*", "symfony/http-foundation": "2.1.*" } }
घटकों को स्थापित करें:
$ php composer.phar install Installing dependencies from lock file - Updating symfony/class-loader (dev-master)
और उन्हें हमारी परियोजना से कनेक्ट करें:
<?php
अब हम उनका उपयोग कर सकते हैं!
Classloader। कक्षा स्टार्टअप मानक
डेढ़ साल पहले, PHP समुदाय ने कई समझौतों को अपनाया, उनमें से एक,
PSR-0 समझौता , आधुनिक वर्ग ऑटोलॉजिस्ट के साथ संगतता के लिए नियमों और कोड आवश्यकताओं का वर्णन करता है (ऑटोलॉटर का इतिहास अच्छी तरह से
यहां और
यहां लिखा
गया है )
संक्षेप में, मानक दो प्रकार के वर्ग के नामकरण की अनुमति देता है:
नाम स्थान (आधुनिक दृष्टिकोण) class: Symfony\Component\HttpFoundation\Request path: vendor/src/Symfony/Component/HttpFoundation/Request.php
अंडरस्कोर (PEAR मानक, अप्रचलित दृष्टिकोण) के माध्यम से class: Twig_Extension_Core path: vendor/twig/lib/Twig/Extension/Core.php
इस स्थिति में, जब क्लास फ़ाइल कनेक्ट होती है, तो ऑटोलैडर स्वचालित रूप से स्लैश (\) और अंडरस्कोर (_) को रिप्लेसमेंट सेपरेटर (/) के साथ .php एक्सटेंशन को अंत में जोड़ता है।
ClassLoader घटक
आपको PSR-0 समझौते के अनुसार वर्ग
ऑटोलॉड को व्यवस्थित करने की अनुमति देता है।
चरण 3। कक्षाओं को फिर से भरना और क्लासलोडर का उपयोग करना
उदाहरण के लिए, हमारे पास LDAP के साथ काम करने के लिए एक निश्चित वर्ग है:
<?php class prefixedLdapConnector { public function __construct() {
हम इसे PSR-0 मानक पर लाते हैं:
<?php namespace Prefix\Ldap\Client; class Client { public function __construct() {
ClassLoader में उपसर्ग शीर्ष स्तर के स्थान को पंजीकृत करें:
use Symfony\Component\ClassLoader\UniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespace('Prefix', __DIR__ . '/src/'); $loader->register();
अब, अपने कोड में Prefix \ Ldap \ Client वर्ग का उपयोग करते समय, ClassLoader अपने स्वचालित लोडिंग का ध्यान रखेगा:
चरण 4. अनुरोधों के प्रसंस्करण / प्रतिक्रियाओं की तैयारी। HttpFoundation का उपयोग करना
HTTPFoundation घटक आने वाले अनुरोधों के प्रसंस्करण और एक सर्वर प्रतिक्रिया की तैयारी को सरल करता है।
परियोजना में 2 लाइनें जोड़ना:
हमें एक $ अनुरोध वस्तु मिलती है जो आने वाले अनुरोध के बारे में सब कुछ जानती है:
- $ अनुरोध-> अनुरोध $ _POST की जगह
- $ अनुरोध-> क्वेरी $ _GET की जगह लेती है
- $ अनुरोध-> कुकीज़ $ _COOKIE की जगह लेते हैं
- आदि
और इसी तरह प्रतिक्रिया के साथ:
use Symfony\Component\HttpFoundation\Response; $response = new Response(); $response->setContent('This will be the response content'); $response->headers->set('Content-Type', 'text/html'); $response->setStatusCode(200);
ऐसा लगता है, क्यों सामान्य PHP चर और तरीकों को नई कक्षाओं के साथ बदलें। वास्तव में, यह दृष्टिकोण कई फायदे प्रदान करता है। सबसे पहले, यह आपको वस्तुओं के रूप में प्रस्तुत अनुरोध और प्रतिक्रिया डेटा के साथ काम करने के लिए अमूर्त स्तर को समझने के लिए अनुमति देता है। आप अपने प्रोजेक्ट के किसी भी क्षेत्र से अनुरोध और प्रतिक्रिया को पूरी तरह से नियंत्रित कर सकते हैं। दूसरे, सुरक्षा आवश्यकताओं के अनुपालन के लिए
कई स्वतंत्र डेवलपर्स द्वारा इस घटक का
परीक्षण किया
गया है । तीसरा, HTTPFoundation का उपयोग करने वाला कोड परीक्षण करना बहुत आसान है।
चरण 5. हम सेवाओं में परियोजना की कार्यक्षमता को डिज़ाइन करते हैं। निर्भरता इंजेक्शन घटक
लगभग सभी परियोजनाओं में, कई कार्य हैं जिनके लिए विभिन्न पुस्तकालय, कक्षाएं, या कॉर्न प्रोग्राम फ़ंक्शन जिम्मेदार हैं। निर्भरता इंजेक्शन घटक आपको उन वस्तुओं को बनाने और कॉन्फ़िगर करने की प्रक्रिया को व्यवस्थित और केंद्रीकृत करने की अनुमति देता है जो इस या उस कार्यक्षमता को लागू करते हैं। ऐसी वस्तुओं में एक डाक सेवा, एक डेटाबेस प्रबंधक, एक टेम्पलेट इंजन और कई अन्य शामिल हो सकते हैं।

मान लीजिए कि हमारे पास ईमेल भेजने के लिए एक वर्ग है:
<?php namespace Prefix\Mailer; class Mailer { $prefix = ''; public function send($to, $subject, $body) {
और हमारे कोड में, मेल इस तरह से भेजा जाता है:
function saveUser($name, $email) { $mailer = new Mailer(); $mailer->send($user->getEmail(), 'Welcome ' . $user->getName(), 'A test'); }
आइए थोड़ा सा रिफ्लेक्ट करते हैं, एक सर्विस कंटेनर बनाते हैं और उसमें हमारी पोस्टल क्लास रजिस्टर करते हैं:
use Symfony\Component\DependencyInjection\ContainerBuilder; $container = new ContainerBuilder(); $container->register('mailer', 'Mailer');
पत्र भेजने की पंक्तियों में दूसरी छोटी रीफैक्टरिंग करते हैं:
function saveUser($name, $email) {
ये मामूली बदलाव एक साथ कई बोनस देते हैं:
- मेलर वर्ग का एक ऑब्जेक्ट केवल एक बार बनाया जाता है, भले ही हम इसे परियोजना में कहीं और सेवा कंटेनर से प्राप्त करें;
- मेलर सेवा अब केंद्रीय रूप से कॉन्फ़िगर की जा सकती है;
- इसे दूसरी सेवा से बदलना आसान है।
इसी तरह, आप सेवाओं के रूप में सभी कार्यों को व्यवस्थित करने के बाद, सेवाओं के रूप में एक के बाद एक प्रोजेक्ट लाइब्रेरी को नामित कर सकते हैं।
चरण 6. आगे क्या है?
Symfony2 के पहले तीन घटकों को जोड़कर, आप समान एल्गोरिथ्म का उपयोग अन्य समान रूप से
उपयोगी घटकों का उपयोग शुरू करने के लिए कर सकते
हैं :
- कंसोल - कंसोल स्क्रिप्ट का विकास (कमांड लाइन या क्रोन से कहा जाता है)
- खोजक - फ़ाइलों और फ़ोल्डरों के लिए खोज
- रूटिंग - आपको HTTP अनुरोधों और कॉन्फ़िगर करने योग्य मापदंडों के सेट के बीच पत्राचार सेट करने की अनुमति देता है
- टेंपलेटिंग - आपको प्रोजेक्ट में टेम्प्लेट के साथ काम करने की आवश्यकता है
- और अन्य।
चरण दर चरण, घटक द्वारा घटक, आपकी परियोजना धीरे-धीरे रूपांतरित हो जाएगी और बिना किसी कट्टरपंथी निर्णयों के एक नया जीवन लेगी। गुड लक और अपने refactoring का आनंद लें!