2010-08-16 6 views
8

तो, मैं एक विशाल PHP पृष्ठभूमि से नहीं आया- और मैं सोच रहा था कि अच्छी तरह से गठित कोड में, किसी को 'superglobals' का उपयोग सीधे करना चाहिए, उदा। कुछ समारोह के बीच में $_SESSION['x'] = 'y'; कहते हैं या करते हैं, जैसे मैं सामान्य रूप से चर के साथ क्या होता है, यह उन्हें तर्क है कि वहाँ से इस्तेमाल किया जा सकता है, जैसे के रूप में भेजने के लिए बेहतर है:PHP में सुपरग्लोबल्स सीधे अच्छा या बुरा उपयोग कर रहा है?

class Doer { 
    private $sess; 
    public function __construct(&$sess) { 
     $this->sess =& $sess; 
    } 
} 

$doer = new Doer($_SESSION); 

और फिर से Doer->sess संस्करण का उपयोग दरवाजे और इस तरह के भीतर। (इस विधि का लाभ यह है कि यह स्पष्ट करता है कि Doer $ _SESSION का उपयोग करता है।)

इस समस्या के लिए स्वीकृत PHP डिज़ाइन दृष्टिकोण क्या है?

+5

उन्हें सत्यापित करने के बाद वैरिएबल में आवश्यक डेटा को ले जाएं, क्योंकि वहां तक ​​डेटा मान्य होने तक संदिग्ध है। –

+0

आपका दृष्टिकोण असामान्य है, और स्थानीय गुण में सुपरग्लोबल को अलियासिंग करने से कोड डेवलपर भ्रमित हो सकते हैं। लेकिन यह निश्चित रूप से कानूनी है, और यदि आपका ऑब्जेक्ट इसका उपयोग करता है या फ़िल्टर करता है (उदा। कॉन्फ़िगर सहायक) शायद एक अच्छा विचार है। – mario

उत्तर

13

मुझे $_SESSION, $_POST, $_GET, और $_COOKIE ओओपी संरचनाओं में लपेटना पसंद है।

मैं इस विधि का उपयोग कोड है कि स्वच्छता और सत्यापन, आवश्यक isset() चेकों के सभी, nonces, setcookie मानकों, आदि यह भी ग्राहक कोड अधिक पठनीय होने की अनुमति देता संभालती है (और मुझे भ्रम है कि इसे और अधिक पोषणीय है देता है केंद्रीकृत करने के लिए)।

इस तरह की संरचना के उपयोग को लागू करना मुश्किल हो सकता है, खासकर अगर एकाधिक कोडर हैं। $_GET, $_POST, और $_COOKIE (मुझे विश्वास है) के साथ, आपका प्रारंभिक कोड डेटा की प्रतिलिपि बना सकता है, फिर सुपरग्लोबल को नष्ट कर सकता है। हो सकता है कि एक चालाक विनाशक $ _SESSION (भार पर $ _SESSION मिटाएं, इसे वापस विनाशक में लिखें) के साथ संभव बना सकता है, हालांकि मैंने कोशिश नहीं की है।

हालांकि, मैं आमतौर पर इनमें से किसी भी प्रवर्तन तकनीकों का उपयोग नहीं करता हूं। इसका उपयोग करने के बाद, सत्र कक्षा के बाहर कोड में $_SESSION देखकर बस अजीब लगता है, और मैं ज्यादातर एकल काम करता हूं।

संपादित
कुछ नमूने यहां ग्राहक कोड के मामले में यह किसी को मदद करता है है,। मुझे यकीन है कि प्रमुख चौखटे में से किसी को देख आप बेहतर विचार देना होगा हूँ ...

$post = Post::load(); 
$post->numeric ('member_age'); 
$post->email ('member_email'); 
$post->match ('/regex/','member_field'); 
$post->required ('member_first_name','member_email'); 
$post->inSet ('member_status',array('unemployed','retired','part-time','full-time')); 
$post->money ('member_salary'); 
$post->register ('member_last_name'); // no specific requirements, but we want access 
if ($post->isValid()) 
{ 
    // do good stuff 
    $firstName = $post->member_first_name; 
} 
else 
{ 
    // do error stuff 
} 

पोस्ट और उसके दोस्तों के सभी एक आधार वर्ग कि कोर सत्यापन कोड लागू करता है से निकाले जाते हैं, रूप की तरह अपनी विशिष्ट कार्यक्षमता जोड़ने टोकन, सत्र कुकी कॉन्फ़िगरेशन, जो भी हो।

आंतरिक रूप से, कक्षा में वैध डेटा का संग्रह होता है जो $_POST से निकाला जाता है क्योंकि सत्यापन विधियों को बुलाया जाता है, फिर उन्हें जादू __get विधि का उपयोग करके गुणों के रूप में लौटाता है। असफल फ़ील्ड इस तरह से नहीं पहुंचा जा सकता है।मेरी सत्यापन विधियां (required को छोड़कर) खाली फ़ील्ड पर असफल न हों, और उनमें से कई एक साथ कई फ़ील्ड पर काम करने की अनुमति देने के लिए func_get_args का उपयोग करें। कुछ विधियों (जैसे money) स्वचालित रूप से डेटा को कस्टम मान प्रकारों में अनुवादित करते हैं।

त्रुटि मामले में, मेरे पास डेटा को प्रारूप में सहेजने का एक तरीका है जिसे सत्र में सहेजा जा सकता है और मूल रूप से रीडायरेक्ट करने के बाद फ़ॉर्म को पूर्व-पॉप्युलेट करने और त्रुटियों को हाइलाइट करने के लिए उपयोग किया जाता है।

इस पर सुधार करने का एक तरीका एक फॉर्म क्लास में सत्यापन जानकारी को संग्रहीत करना होगा जिसका उपयोग फॉर्म और पावर क्लाइंट-साइड सत्यापन को प्रस्तुत करने के साथ-साथ जमा करने के बाद डेटा को साफ करने के लिए किया जाता है।

+0

** गिमे! ** क्या आप इनपुट एरे के लिए अपने ओओपी रैपर प्रकाशित करेंगे? मैं कुछ इसी तरह का उपयोग कर रहा हूं, और कुछ तुलनीय के साथ दृष्टिकोण को विपरीत करना चाहता हूं। – mario

+0

@ मारियो: मैं कोड प्रकाशित नहीं कर सकता, लेकिन मैं आपको एक विचार देने के लिए थोड़ा सा विस्तार कर सकता हूं। मैं अब जवाब संपादित कर दूंगा। – grossvogel

+1

ठीक है। लेकिन मेरा तुलना तुलनात्मक रूप से यहां है: https://sourceforge.net/p/php7framework/wiki/input/ - सिर्फ यह जानना चाहता था कि आप किस प्रकार की उपयोगिता सुविधाओं का उपयोग करते हैं, या आप कौन से फ़िल्टर को सबसे उपयोगी मानते हैं। – mario

-3

यह PHP का अच्छा उपयोग नहीं है।

सीधे $ _SESSION चर मिलती है:

$id = $_SESSION['id']; 
$hash = $_SESSION['hash']; 

आदि

+1

और यदि कोई सरणी सरणी में मौजूद नहीं है तो एक अच्छा E_NOTICE प्राप्त करें ... -> -1 – ThiefMaster

+0

वैसे भी आपको $ _SESSION कैसे मिलता है? – Aziz

0

मैं सभी संदर्भ द्वारा superglobal गुजर पर की सिफारिश नहीं होगा। आपकी कक्षा में, यह स्पष्ट नहीं है कि आप जो संशोधित कर रहे हैं वह सत्र चर है। साथ ही, ध्यान रखें कि $ 2,_SESSION आपकी कक्षा के बाहर हर जगह उपलब्ध है। क्लास से संबंधित एक चर को संशोधित करके उस वर्ग के बाहर से किसी वर्ग के अंदर एक चर के अंदर एक चर को संशोधित करने में सक्षम होने के लिए ऑब्जेक्ट उन्मुख दृष्टिकोण से यह बहुत गलत है। सार्वजनिक विशेषता होने पर एक बुरा अभ्यास माना जाता है, यह भी सबसे खराब है।

2

सुपरग्लोबल्स की सामग्री को संशोधित करना खराब अभ्यास माना जाता है। हालांकि इसमें कुछ भी गलत नहीं है, खासकर अगर कोड आपके नियंत्रण में 100% है, तो यह अप्रत्याशित साइड इफेक्ट्स का कारण बन सकता है, खासकर जब आप मिश्रित स्रोत कोड पर विचार करते हैं। उदाहरण के लिए, यदि आप कुछ इस तरह करते हैं:

$_POST['someval'] = mysql_real_escape_string($_POST['someval']); 

आप उम्मीद कर सकते है कि हर जगह पीएचपी कि 'someval' उपलब्ध भी बदल जायेगा करता है, लेकिन यह मामला नहीं है। $_REQUEST['someval'] में प्रति अपरिवर्तित और अभी भी मूल "असुरक्षित" संस्करण होगा। यदि आप $ _POST पर अपने सभी भागने से करते हैं, तो यह एक अनजान इंजेक्शन भेद्यता का कारण बन सकता है, लेकिन बाद की लाइब्रेरी $ _REQUEST का उपयोग करती है और मानती है कि यह पहले से ही बच निकला है।

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

2

मुझे पता है कि यह प्रश्न पुराना है लेकिन मैं एक उत्तर जोड़ना चाहता हूं।

इनपुट को संभालने के लिए मारियो के वर्ग अद्भुत हैं।

मैं कुछ तरीकों से superglobals लपेटना पसंद करते हैं। यह आपके कोड को पढ़ने के लिए बहुत आसान बना सकता है और बेहतर रखरखाव का नेतृत्व कर सकता है।

उदाहरण के लिए, मेरे वर्तमान काम में कुछ कोड है जो मुझे नफरत है! सत्र चर का उपयोग इतना भारी होता है कि आप वास्तविक रूप से पूरी साइट को प्रभावित किए बिना कार्यान्वयन को वास्तविक रूप से परिवर्तित नहीं कर सकते हैं।

उदाहरण के लिए,

मान लीजिए कि आप एक सत्र वर्ग अपने अनुप्रयोग के लिए विशिष्ट बनाया करते हैं।

class Session 
{ 
    //some nice code 
} 

आप निम्न

$session = new Session(); 
if($session->isLoggedIn()) 
{ 
    //do some stuff 
} 

की तरह कुछ लिख सकता है के रूप में इस

if($_SESSION['logged'] == true) 
{ 
    //do some stuff 
} 

करने का विरोध किया यह एक छोटे से तुच्छ लगता है, लेकिन यह मेरे लिए एक बड़ी बात है। कहें कि भविष्य में कभी-कभी मैं फैसला करता हूं कि मैं इंडेक्स का नाम 'लॉग इन' से 'लॉग इन' में बदलना चाहता हूं।

अब मुझे ऐप में हर जगह जाना है कि सत्र चर का उपयोग इसे बदलने के लिए किया जाता है। या, मैं इसे छोड़ सकता हूं और दोनों चर बनाए रखने के लिए कुछ रास्ता ढूंढ सकता हूं।

या यदि मैं यह जांचना चाहता हूं कि वह उपयोगकर्ता एक व्यवस्थापक उपयोगकर्ता है और लॉग इन है?मैं इस सत्र में दो अलग-अलग चरों की जांच कर सकता हूं। लेकिन, इसके बजाय मैं इसे एक विधि में समाहित कर सकता हूं और अपना कोड छोटा कर सकता हूं।

यह अन्य प्रोग्रामर को आपके कोड को देखने में मदद करता है क्योंकि इसे पढ़ने में आसान हो जाता है और उन्हें कोड को देखने पर जितना अधिक लगता है उतना ही सोचने की आवश्यकता नहीं होती है। वे विधि पर जा सकते हैं और देख सकते हैं कि उपयोगकर्ता में लॉग इन करने का केवल एक ही तरीका है। यह आपको भी मदद करता है क्योंकि यदि आप अधिक लॉग इन में 'लॉग' करना चाहते हैं तो आपको केवल अपने आईडीई के साथ वैश्विक खोज करने की कोशिश करने और इसे इस तरह बदलने की कोशिश करने के बजाय इसे बदलने के लिए एक स्थान पर जाना होगा।

फिर से, यह एक मामूली उदाहरण है, लेकिन इस बात के आधार पर कि आप सत्र का उपयोग कैसे करते हैं, इस तरीके के उपयोग के तरीकों और कक्षाओं का उपयोग करने के इस मार्ग से आपके जीवन को जीने में आसान बना दिया जा सकता है।

संबंधित मुद्दे