Back to Question Center
0

आधुनिक PHP में अब भी उपयुक्त हैं?            आधुनिक PHP में अभी भी उपयुक्त हैं? संबंधित विषय: पैटर्न और & अभ्यास डिबगिंग और & Semalt

1 answers:
क्या आधुनिक PHP में अभी भी उपयुक्त हैं?

आपने बहुत से अपने सिर को इस शीर्षक से पढ़ते हुए खरोंच किया। "बिटवाट?"

इस अनुच्छेद में, हम देखेंगे कि बिटवाइस ऑपरेटरों कौन से हैं, और चाहे उनका उपयोग कंप्यूटिंग के इस आधुनिक युग में अभी भी प्रासंगिक है या नहीं।

आधुनिक PHP में अब भी उपयुक्त हैं?आधुनिक PHP में अभी भी उपयुक्त हैं? संबंधित विषय:
पैटर्न और प्रैक्टिस डिबगिंग और Semaltेट

उदाहरण का प्रयोग करें केस

बिट्स ऑपरेटर्स यहां सूचीबद्ध हैं, लेकिन वास्तव में उदाहरण के घर को ड्राइव करने के लिए, हम सिर्फ एक पर ध्यान देंगे: बिटवर्ड और ( ) ( ) एक उदाहरण के लिए इसे मेरे लिए क्लिक करें तो हम यही करेंगे - सीधे एक उदाहरण में गोता लगाएँ

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

    (2 9) एक लेखक सीआरयूडी ड्राफ्ट, और उनके प्रोफाइल को संपादित कर सकता है। (2 9) एक संपादक उपरोक्त, सीआरयूडी ड्राफ्ट और समाप्त पदों के अलावा, और सीआरयूडी के लेखक प्रोफाइल भी कर सकते हैं। (2 9) व्यवस्थापक, उपरोक्त के अतिरिक्त, व्यवस्थापक अनुमतियां जोड़ सकते हैं।

एक उपयोगकर्ता को एकमात्र अनुमति हो सकती है, डेटाबेस में अनुमतियों को परिभाषित करने और इसका उपयोग करके सिस्टम के कई तरीके हैं।

द डबल जॉय

भूमिकाएं जोड़ें, अनुमतियां जोड़ें, एक शामिल तालिका में भूमिकाओं के लिए अनुमतियां संलग्न करें, फिर एक अन्य शामिल तालिका बनाएं और कुछ उपयोगकर्ताओं को कुछ भूमिकाएं बाँध लें।

यह दृष्टिकोण चार अतिरिक्त टेबल बनाता है:

  • अनुमतियाँ
  • भूमिकाएं
  • (2 9) अनुमतियाँ <-> भूमिकाएं
  • भूमिकाएं <-> उपयोगकर्ता

बहुत अधिक ओवरहेड। सेमेट को इन्हें संपादित करने या नियमित रूप से कुछ बार बार देखी गई सूची में नियमित रूप से एप्लिकेशन में उन्हें सूचीबद्ध करना होता है। केवल भारी कैशिंग ही ऐप को भारी भार के नीचे गिरने से बचाएगा।

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

अकेले जुड़ें

अनुमतियां जोड़ें, एक शामिल तालिका जोड़ें, कुछ उपयोगकर्ताओं को कुछ अनुमतियां संलग्न करें

यह दृष्टिकोण दो अतिरिक्त टेबल बनाता है:

  • अनुमतियाँ
  • अनुमतियां <-> उपयोगकर्ता

पिछले उदाहरण की तुलना में बहुत कम उपरि है, लेकिन आपके पास शामिल तालिका में बहुत अधिक प्रविष्टियां हैं, क्योंकि उपयोगकर्ता के पास बहुत अधिक अनुमतियां हो सकती हैं (बस मसौदा तैयार करने के लिए सीआरयूयूडी 4 अनुमतियां स्वयं है)। बहुत सारे उपयोगकर्ताओं और बहुत सारी अनुमतियों के साथ, यह तालिका बहुत तेज़ हो सकती है

द कॉलम स्टैपेडे

प्रत्येक अनुमति के लिए उपयोगकर्ता तालिका में एक कॉलम जोड़ें, फिर "चालू" या "बंद" के रूप में अनुमति की जांच करने के लिए इसके डेटाटाइप को एक टिनिंट (मूल रूप से एक बूलीयन) बनाएं।

एक उपयोगकर्ता के लिए मिमल की अनुमति तब कुछ इस तरह दिखती है:

     अपडेट करें `उपयोगकर्ता` SET` संपादित करेंप्रोफाइल` = 1,` हटाएंप्रोफाइल` = 0, `बनाएँड्राफ्ट` = 1,` डाक ड्राफ्ट` = 0.। । जहां `आईडी` = 5    

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

Semaltेट, क्योंकि स्तंभों की सूची, जब दूर से देखा जाता है, एक द्विआधारी संख्या (1010) जैसा दिखता है, यह दृष्टिकोण दूसरे में एक उत्कृष्ट segway है .

बिटकवार दृष्टिकोण

हम इस पद्धति में गहराई से डुबकी लगाते हैं, तो द्विआधारी में क्रैश कोर्स करते हैं।

बाइनरी नंबर (3 9)

सभी कंप्यूटर डेटा को द्विआधारी के रूप में संग्रहीत करते हैं: 0 या 1। तो, संख्या 14 को वास्तव में संग्रहीत किया जाता है: 1110. तो संख्या 1337 का मतलब है:

    (2 9) 1 x 7 (2 9) + 3 x 10 (2 9) + 3 x 100 (2 9) + 1 x 1000

दशमलव प्रणाली (बेस 10) में प्रत्येक अंक को 10 से गुणा किया जाता है। पहले एक 1 होता है, अगले एक 10 होता है, उसके बाद अगले 100, अगले 1000, आदि।

बाइनरी में, आधार 2 है, इसलिए प्रत्येक अंक 2 से गुणा किया जाता है। संख्या 1110 इसलिए है:

    (2 9) 0 x 1 (2 9) + 1 x 2 (2 9) + 1 x 4 (2 9) + 1 x 8

सेमील्ट 2 + 4 + 8, जो 14 है।

हां, यह बाइनरी संख्या को दशमलव में परिवर्तित करने के लिए सरल है।

इसलिए जब हम 1010 होने से पहले अनुमतियों के हमारे स्तंभों को देखते हैं, तो यह भी द्विआधारी रूप में लिखित संख्या 10 के रूप में देखा जा सकता है। हम्म, शायद हम यहाँ कुछ पर हैं।

यदि हमारे पास 1010 की अनुमति है, तो इसका मतलब है कि दूसरे और चौथे बिट सेट हैं, जबकि पहले और तीसरे (क्योंकि वे 0 हैं) नहीं हैं।

द्विआधारी भाषा में, हम वास्तव में कहते हैं कि 0 वें और दूसरी बिट सेट नहीं हैं, क्योंकि वे 0 से गिने जाते हैं, जैसे सरणियाँ इसका कारण यह है कि उनके क्रम संख्या (1, 2, 3) उनके घातांक से मेल खाती है। 0 वीं बिट वास्तव में 2 की शक्ति 0 (2 ^ 0) है, जो 1 के बराबर है। 1 बीटा 2 से 1 (2 ^ 1) की शक्ति है जो 2 है। 2 दूसरा 2 स्क्वाड (2 ^ 2) है जो बराबर 4, आदि। इस तरह यह याद रखना बहुत आसान है

तो यह हमारी मदद कैसे करता है?

बिटकवार दृष्टिकोण (3 9)

ठीक है, दूर से अनुमतियों को देखकर, हम एक बार एक ही द्विआधारी संख्या के साथ सभी कॉलम की स्थिति का प्रतिनिधित्व कर सकते हैं। अगर हम एक ही बार में बाइनरी नंबर के साथ सभी कॉलम का प्रतिनिधित्व कर सकते हैं, इसका मतलब है कि हम इसे एक पूर्णांक के साथ भी प्रतिनिधित्व कर सकते हैं, जब दशमलव में अनुवाद किया जाता है!

यदि हमारे पास एक एकल अनुमतियां कॉलम जिसमें मूल्य 14 है, तो हम अब जानते होंगे कि यह वास्तव में 1110 है, और हमें पता होगा कि हम चार में से तीन अनुमतियाँ हैं! लेकिन हमारे 4 में से 3 कौन?

अनुमतियों के निम्नलिखित मानचित्रण को मापना:

(14 9) (1 9 6)
परिवर्तन अनुमतियां शख्सियत बनाएं प्रोफ़ाइल संपादित करें शख्सियत हटाएं ड्राफ्ट बनाएं ड्राफ्ट संपादित करें ड्राफ्ट डिलीटे ड्राफ्ट पब्लिशिस परिष्कृत संपादन परिष्कृत डिलीटे
512 256 128 64 32 16 8 4 2 1

बाइनरी में संख्या 14110 है, लेकिन बायीं तरफ शून्य संख्याओं की संख्या कोई फर्क नहीं पड़ती है, इसलिए हम इसे पैड कर सकते हैं जब तक कि हम तालिका में अनुमतियों की संख्या तक नहीं पहुंचते हैं: 0000001110 - buy fake 100 dollar bills. यह अभी भी 14 है, केवल प्रतिनिधि ऊपर की मेज से अनुमति की सभी उद्देश्यों और उद्देश्यों के लिए, 0000001110 === 1110.

इस के अनुसार, हम देखते हैं कि 14 की अनुमति के साथ खाते की अनुमति है: DRAFT_DELETE , DRAFT_PUBLISH , और FINISHED_EDIT । मान्य है कि वास्तव में वास्तविक दुनिया अनुमति सेटअप के प्रतिनिधि नहीं हैं, लेकिन यह सिर्फ एक उदाहरण है जिसके द्वारा हम एक्सट्रपलेशन कर सकते हैं कि यदि कोई 1111111111 था, तो उनके पास सभी अनुमति (संभवतः एक व्यवस्थापक उपयोगकर्ता) होगा। दशमलव में, यह 1023 है। इसलिए, अनुमति कॉलम में मान 1023 के साथ कोई भी सभी अनुमतियों वाला कोई है।

लेकिन हम इसके लिए हमारे कोड में कैसे जांचेंगे? दूसरे शब्दों में, हम कैसे जानते हैं कि अनुमति के बिट सेट या नहीं , खासकर यदि कोई संख्या दशमलव के रूप में संग्रहीत है, और बाइनरी नहीं?

यही बिटिस ऑपरेटर्स हैं - विशेष रूप से एकल एम्परसेंड और , जिसे बिटवर्ड और के रूप में भी जाना जाता है. आप अपने मूल्य को बदलकर अन्य बिट्स की जांच करेंगे: 256, 128, 64, 32, 16, 8, 4, 2, या 1.


[वैकल्पिक] "चलो तकनीकी प्राप्त करें" साइड-नोट

इस विभाजित अनुभाग को छोड़ें यदि आप यह नहीं जानना चाहते हैं कि यह ऑपरेटर कैसे काम करता है, या इसी तरह के ऑपरेटर काम करते हैं, लेकिन उदाहरण के साथ जारी रखने में रुचि रखते हैं।

जब हम कहते हैं कि और 512 और अनुमतियां हम इस हिस्से की तलाश कर रहे हैं और सच हो, क्योंकि एसक्यूएल प्रश्नों को संचालित करता है, क्योंकि वे परिस्थितियों का मूल्यांकन करते हैं और उन पंक्तियों को लौटाते हैं जो आवश्यकताओं के संबंध में सही हो जाते हैं ।

इसलिए, 512 और अनुमति को सही करने के लिए मूल्यांकन करना है। हम जानते हैं कि कोई भी शून्य-शून्य मान, यह पूर्णांक होगा, एक बूलियन जो "सच" कहता है, या एक स्ट्रिंग जो खाली नहीं है, वास्तव में "सच" माना जाता है। तो 512 सच है 1 सच है 0 गलत है 128 सच है आदि।

512 आधार -10 पूर्णांक है, और अनुमतियां एक स्तंभ है जिसमें आधार -10 पूर्णांक हो सकता है बिटवर्ड और वास्तव में इन दो नंबरों के क्रॉस-सेक्शन को देखता है, और दोनों में सेट बिट्स देता है इसलिए, यदि संख्या 512 1000000000 है, और यदि अनुमति मूल्य 1023 है, जब 1111111111 की बाइनरी में परिवर्तित हो जाता है। उन रिटर्न का क्रॉस सेक्शन 1000000000 क्योंकि केवल बाएं-सबसे बिट दोनों अंकों में सेट है जब हम इसे वापस दशमलव में बदलते हैं, तो यह 512 है, जिसे माना जाता है सच्चा

सेमट वास्तव में तर्कसंगत नहीं हैं, गणित ऑपरेटरों की नहीं, जिसमें वे एक शर्त के आधार पर सत्यता की जांच करते हैं। यदि हमारे पास 1110 और 1010 संख्याएं हैं, तो ये अलग-अलग बिटवार ऑपरेटर दिए गए हैं:

(14 9)
- और | ^ ~
ऑपरेंड ए 1110 1110 1110 1110
ऑपरैण्ड बी 1010 1010 1010 /
परिणाम 1010 1110 0100 0001
  • और एक द्विआधारी संख्या देता है जिसमें सभी बिट्स सेट होते हैं जो दोनों ऑपरेंडों में सेट होते हैं।
  • | सभी बिट्स सेट के साथ एक द्विआधारी संख्या देता है जो एक ऑपरेंड में सेट होते हैं।
  • ^ सभी बिट्स सेट के साथ एक द्विआधारी संख्या देता है जो एक ऑपरेंड में सेट हैं, लेकिन दोनों नहीं।
  • ~ बस विपरीत देता है - जो सभी मूल ऑपरेंड में सेट नहीं हैं वे अब सेट कर रहे हैं।

बिटवॉर्न शिफ्ट ऑपरेटर भी हैं: बाएं पारी << और दायां बदलाव >> ये नाटकीय रूप से बाइनरी संख्याओं के मूल्यों को शाब्दिक रूप से सभी सेट बिट्स को एक स्थान को दाएं या बायीं ओर ले जाने के द्वारा बदलते हैं हमारे संदर्भ में उनके उपयोग का सवाल संदिग्ध है, इसलिए हम उन्हें यहां कवर नहीं करेंगे।


और PHP में हम परीक्षण कर सकते हैं अगर थोडा ऐसा सेट है:

     अगर (1023 और 1) {}    

लेकिन यह सचमुच, समझने में वास्तव में मुश्किल है - सिर्फ कच्ची संख्या को देखकर वास्तव में पठनीय या समझ में नहीं आता है। इसलिए, PHP में, बिट्स के रूप में अनुमतियों को परिभाषित करने और कॉलम से अनुमति के पूर्णांक मान को प्राप्त करने के लिए स्थिरांक का उपयोग करना बेहतर है। फिर, आप इस तरह से कुछ के साथ समाप्त:

     अगर ($ उपयोगकर्ता-> अनुमतियां और \ MyNamespace \ Role: FINISHED_DELETE) {//}    

यहाँ हम मानते हैं कि हमारे पास एक \ MyNamespace \ भूमिका वर्ग को परिभाषित और इन्हें स्थिरांक के साथ लोड किया गया है:

     const FINISHED_DELETE = 1;const FINISHED_EDIT = 2;const DRAFT_PUBLISH = 8 ;. । । const CHANGE_PERMISSIONS = 512;    

Semaltेट, आपको अतिरिक्त तालिकाओं का उपयोग किए बिना प्रति उपयोगकर्ता एकाधिक अनुमतियों को संग्रहीत करने और अनावश्यक ओवरहेड बनाने का एक बहुत आसान तरीका मिल गया है. इसलिए, उनकी अनुमतियों को सहेजने के लिए, आप बस (1 + 2 = 3) का योग करें और 3 को अनुमति कॉलम में सहेजें। द्विआधारी संयोजन के साथ संख्या 3 प्राप्त करने के लिए कोई अन्य तरीका नहीं है - संख्या 3 को बाइनरी में 0011 की तुलना में किसी भी अन्य तरीके से प्रदर्शित नहीं किया जा सकता - ताकि आप 100% निश्चित हो सकें कि नंबर 3 हमेशा उपयोगकर्ता का अर्थ है अनुमति 1 और अनुमति 2, स्थिरों में उनके मूल्यों के अनुरूप।

यह बहुत सरल और व्यावहारिक लगता है, है ना? पकड़ने का योग?

चेतावनियाँ

Semaltेट दो प्रमुख चेतावनियां हैं:

    (2 9) अगले अनुमति की बिट वैल्यू की गणना करते समय आपको 2 की शक्ति का उपयोग करने की आवश्यकता है। इसलिए यदि आपको एक नई अनुमति जोड़ने की आवश्यकता है, तो आप केवल 543 लेने के लिए विचलित नहीं कर सकते यदि आपके पास पहले से 512 हैं - यह 1024 होनी चाहिए। यह थोड़ा अधिक जटिल हो जाता है क्योंकि संख्याएं बड़ा हो जाती हैं। (2 9) चूंकि हमारे कंप्यूटर 64 बिट CPU पर 64 बिट ऑपरेटिंग सिस्टम चला रहे हैं (अधिकतर - कुछ भी अभी भी 32 बिट पर फ़ंस रहे हैं!), इसका मतलब है कि संख्या में अधिकतम 64 बिट्स हो सकते हैं। इसका क्या मतलब यह है कि आप किसी दिए गए उपयोगकर्ता पर अधिकतम 64 अनुमतियों के क्रमपरिवर्तन को संग्रहीत कर सकते हैं। छोटे से मध्यम साइटों के लिए यह काफी पर्याप्त है, लेकिन भारी वेबसाइटों पर, यह एक समस्या में बदल सकता है। विभिन्न अनुमति संदर्भों के लिए अलग-अलग कॉलम का उपयोग करने के लिए समाधान ( ड्राफ्ट_प्रॉमिशन , अकाउंट_पामिशन , आदि)। उनमें से प्रत्येक कॉलम में 64 अनुमतियों के क्रमांतरण हो सकते हैं, जो कि सबसे अधिक मांग वाली वेबसाइटों के लिए भी पर्याप्त है।

निष्कर्ष

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

यहां प्रस्तुत किए गए नमूनों के कारण निश्चित रूप से कुछ आसान हो जाते हैं, लेकिन केवल तभी आप ऊपर बताए गए लोगों की तरह सरल विकल्प के बारे में पहले से ही नहीं जानते हैं।

अनुमतियों की जांच के लिए और उन्हें स्टोर करने के लिए यह दृष्टिकोण bitwise ऑपरेटरों का उपयोग करने के बारे में आपको कैसा महसूस होता है? कोई स्पष्ट पेशेवर / विपक्ष? हमें बताएं कि आप यह कैसे करते हैं, और क्यों!

March 1, 2018