2012-08-09 12 views
60

मुझे यकीन नहीं है कि बिटमैस्क सही शब्द है या नहीं। मुझे स्पष्ट करने दें: कई मायनोंphp में बिटमैस्क को कैसे कार्यान्वित करें?

php में, error_reporting समारोह कहा जा सकता है:

// Report simple running errors 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 

// Reporting E_NOTICE can be good too (to report uninitialized 
// variables or catch variable name misspellings ...) 
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 

// Report all errors except E_NOTICE 
// This is the default value set in php.ini 
error_reporting(E_ALL^E_NOTICE); 

मैं php.net पेज here

वैसे भी इस की बात है से अवधि bitmask मिला है, मैंने ls नामक एक सरल विधि लागू की है जो निर्देशिका की सामग्री देता है।

इस समारोह 3 args ... ($ include_hidden = false, $ return_absolute = false, $ ext = false)

तो जब मैं फ़ंक्शन को कॉल करें, मैं सेट मैं कैसे परिणाम चाहते लेता है। चाहे मैं चाहता हूँ परिणाम छिपा निर्देशिका वापस जाने के लिए, चाहे मैं basenames केवल आदि

चाहते हैं, ताकि जब मैं समारोह मैं

ls(true, false, true) 
ls(false, false, true) 
ls(true, true, true) 
etc... 

लिख रहा हूँ मैंने सोचा था कि फोन करता है, तो मैं बस सकता है यह बहुत ज्यादा पढ़े जा सकेंगे ध्वज कैसे मैं डेटा लौटा चाहता हूँ?

इसलिए की तरह कुछ:

ls(INCLUDE_HIDDEN | HIDE_EXTS); 
ls(SHOW_ABSOLUTE_PATHS | HIDE_EXTS); 

आदि ...

कैसे मैं परीक्षण के मामले जो झंडे बुलाया गया है में यह लागू होगा?

+1

अच्छी तरह से पूछा गया। KISS – Nico

उत्तर

121

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

const FLAG_1 = 0b0001; // 1 
const FLAG_2 = 0b0010; // 2 
const FLAG_3 = 0b0100; // 4 
const FLAG_4 = 0b1000; // 8 
// Can you see the pattern? ;-) 

function show_flags ($flags) { 
    if ($flags & FLAG_1) { 
    echo "You passed flag 1!<br>\n"; 
    } 
    if ($flags & FLAG_2) { 
    echo "You passed flag 2!<br>\n"; 
    } 
    if ($flags & FLAG_3) { 
    echo "You passed flag 3!<br>\n"; 
    } 
    if ($flags & FLAG_4) { 
    echo "You passed flag 4!<br>\n"; 
    } 
} 

show_flags(FLAG_1 | FLAG_3); 

Demo


क्योंकि झंडे पूर्णांक हैं, पर एक 32-बिट प्लेटफॉर्म जिसे आप 32 झंडे तक परिभाषित करते हैं। 64-बिट प्लेटफार्म पर, यह 64 है। झंडे को तारों के रूप में परिभाषित करना भी संभव है, इस मामले में उपलब्ध झंडे की संख्या कम या कम अनंत है (निश्चित रूप से सिस्टम संसाधनों की सीमाओं के भीतर)। यहां बताया गया है कि यह बाइनरी में कैसे काम करता है (सादगी के लिए 8-बिट पूर्णांक तक काट लें)।

FLAG_1 
Dec: 1 
Binary: 00000001 

FLAG_2 
Dec: 2 
Binary: 00000010 

FLAG_3 
Dec: 4 
Binary: 00000100 

// And so on... 

जब आप उन्हें फ़ंक्शन में पास करने के लिए झंडे को जोड़ते हैं, तो आप या उन्हें एक साथ। के क्या होता है पर एक नज़र डालें जब हम FLAG_1 | FLAG_3

00000001 
| 00000100 
= 00000101 

पारित और आप को देखने के लिए जो झंडे निर्धारित किया गया है, तो आप और ध्वज के साथ bitmask चाहते हैं जब करते हैं। तो, की सुविधा देता है इसके बाद के संस्करण परिणाम डालें और देखें कि FLAG_3 स्थापित किया गया था:

00000101 
& 00000100 
= 00000100 

...हम वापस ध्वज का मान, एक गैर शून्य पूर्णांक प्राप्त - लेकिन अगर हम देखते हैं अगर स्थापित किया गया था:

00000101 
& 00000010 
= 00000000 

... हम शून्य मिलता है। इसका मतलब यह है कि मूल्य को पारित किया गया है या नहीं, यह जांचते समय आप एक बूलियन के रूप में और ऑपरेशन के परिणाम का मूल्यांकन कर सकते हैं।

+5

तो मूल बिटवाई ऑपरेशंस हैं: '$ झंडे और FLAG_1' - जांचें कि FLAG_1 सेट है या नहीं , '$ झंडे | FLAG_1' - सेट FLAG_1, '$ झंडे और ~ FLAG_1' - FLAG_1 को अनसेट करें,' ~ $ झंडे '- उलटा झंडे –

+5

मुझे PHP नहीं पता है और शायद इसे कभी नहीं सीखेंगे, लेकिन मुझे खुशी है कि मैं इस प्रश्न पर ठोकर खाई - आपकी व्याख्या किसी भी भाषा में बिट-मैपिंग को कार्यान्वित करने में मदद कर सकती है :) –

+3

मैं शक्ति 2 दशमलव को परिभाषित करने की सिफारिश करता हूं कि 1 के बिट बुद्धिमान शिफ्ट ऑपरेशन के रूप में परिभाषित करें। 'परिभाषित करें (' FLAG_1 ', 1 << 0); परिभाषित करें ('FLAG_2', 1 << 2); परिभाषित करें ('FLAG_3', 1 << 3); परिभाषित करें ('FLAG_4', 1 << 4); 'इस प्रकार यह आमतौर पर सी – AmitP

14
define("INCLUDE_HIDDEN", 0x1); 
define("HIDE_EXTS", 0x2); 
define("SHOW_ABSOLUTE_PATHS", 0x4); 
//And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc.. 

तब आप अपने ls समारोह में अलग-अलग झंडे के लिए जाँच कर सकते हैं:

if($flags & INCLUDE_HIDDEN) { //<-- note just a single &, bitwise and 
    //$flags have INCLUDE_HIDDEN 
} 
+7

क्या आप पूर्णांक के बजाय हेक्स संख्याओं का उपयोग करने के लाभ के बारे में जानते हैं? बस उत्सुक :) –

+0

@ एलेक्समोर्ले-फिंच यह पूरी तरह से वरीयता की तरह दिखता है, दशमलव या हेक्स का उपयोग निष्पादन समय को बदलने में प्रतीत नहीं होता है, या तो –

3

दूसरों ने अच्छे सुझाव दिए हैं, लेकिन इन दिनों बिटमैस्क के बजाय में पास करना अधिक आम है। यह बहुत अधिक पठनीय है और आपको केवल सही/झूठे मूल्यों के अलावा अन्य चरों में प्रवेश करने की अनुमति देता है। कुछ ऐसा:

myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']); 

function myFunction($options) { 
    // Set the default options 
    $options += [ 
     'includeHidden' => false, 
     'fileExts' => true, 
     'string' => 'Abc', 
    ]; 

    if ($options['includeHidden']) { 
     ... 
    } 
    ... 
} 
+0

मैं इसे इस तरह से भी करता था, लेकिन साथी साथी शिकायत करते हैं कि उनके आईडीई में कोई "टाइप संकेत" नहीं है, कोई उचित [डॉक्टर टिप्पणियां] नहीं है (https://en.wikipedia.org/wiki/PHPDoc) और फ़ंक्शन [पैरामीटर पारित होने पर त्रुटियों को फेंक नहीं देता] [http://symfony.com/doc/current/components/options_resolver.html)। आदर्श रूप से "नामित पैरा" इन सभी मुद्दों को हल करेंगे यदि वे php –

+0

हाय @ टिमोहुविनेन में मौजूद थे - टिप्पणी के लिए धन्यवाद। दस्तावेज़ों को जोड़ना आसान है जो विकल्पों और डिफ़ॉल्ट रूपरेखा को रेखांकित करते हैं, यदि आपको आवश्यकता हो तो अपवाद फेंक दें, और पैरामीटर को एक सरणी में डिफ़ॉल्ट बनाएं जो टाइपिंग संकेत के लिए अनुमति देता है। क्या यह आपके लिए काम करेगा? –

+0

ओह मैं देखता हूं। Symfony OptionsResolver क्लास और भी अधिक सुविधाएं प्रदान करने के लिए एक कदम आगे चला जाता है। ठंडा। –