Back to Question Center
0

آیا اپراتورهای بیتی هنوز در PHP مدرن هستند؟            آیا اپراتورهای بیتی هنوز در PHP مدرن هستند؟ موضوعات مرتبط: الگوهای & ؛ PracticesDebugging & ؛ Semalt

1 answers:
آیا اپراتورهای بیتی هنوز در PHP مدرن هستند؟

بسیاری از شما احتمالا سر خود را به عنوان خوانده شده این عنوان خراشیده. "بیتوچ؟"

در این مقاله، ما به دنبال چه اپراتورهای بیتی میگردیم و اینکه آیا استفاده آنها هنوز در این عصر مدرن محاسبات مطرح است یا خیر.

آیا اپراتورهای بیتی هنوز در PHP مدرن هستند؟آیا اپراتورهای بیتی هنوز در PHP مدرن هستند؟ موضوعات مرتبط:
الگوها و عملکردهای سمبل

مثال مورد استفاده مورد

اپراتورهای بیتی در اینجا لیست شده اند، اما برای مثال در خانه به درستی رانندگی می کنیم، ما بر روی یک مورد تمرکز می کنیم: bitwise و ( و ) - how fast is cat6 cable. یک نمونه آن را برای من کلیک کنید. بنابراین این چیزی است که ما انجام خواهیم داد - به طور مستقیم به یک نمونه سوار شوید.

تصور کنید که شما یک وب سایت دارید که کاربر خاص می تواند مجوز خاصی داشته باشد. به عنوان مثال، یک مجله مانند SitePoint:

  • یک نویسنده می تواند پیش نویس CRUD را ویرایش کند و پروفایل خود را ویرایش کند.
  • یک ویرایشگر می تواند، علاوه بر موارد فوق، پیش نویس های CRUD و پست ها را به پایان برساند و پروفایل های CRUD را نیز به اشتراک بگذارد.
  • یک مدیر می تواند، علاوه بر فوق، مجوز های مدیریت را اضافه کند.

یک کاربر میتواند چندین مجوز داشته باشد، چندین روش تعیین مجوزها در یک پایگاه داده و سیستم با استفاده از آن وجود دارد.

دوقلو

اضافه کردن نقشها، اضافه کردن مجوزها، پیوستن مجوزها به نقشها در یک جدول پیوست، سپس یک جدول پیوست دیگر ایجاد کنید و برخی از نقشها را به برخی از کاربران بسپارید.

این رویکرد چهار جدول اضافی را ایجاد می کند:

  • مجوزها
  • نقش
  • مجوز <-> نقش
  • نقش ها <-> کاربران

بسیار کمی سربار است. Semalt نیاز به ویرایش این و یا لیست آنها را در برنامه به طور منظم در برخی از لیست های اغلب بازدید شده است. فقط ذخیره سازی سنگین این برنامه را از سقوط تحت بار سنگین ذخیره کنید.

یک مزیت، هر چند، این است که با تعریف کردن نقشها به خوبی با مجوزهای پیچیده، شما فقط باید کاربر را در نقش ها قرار دهید و شما خوب هستید - نگه داشتن آن برای پیوستن به جدول نور و سریع.

تنها

اضافه کردن مجوز، اضافه کردن یک جدول پیوست، برخی از مجوز برای برخی از کاربران

این رویکرد دو جدول اضافه ایجاد می کند:

  • مجوزها
  • مجوزها <-> کاربران

سربار بسیار کمتری نسبت به مثال قبلی است، اما شما می توانید مطالب بیشتری در جدول پیوست داشته باشید، زیرا کاربر می تواند تعداد زیادی مجوز داشته باشد (فقط CRUD برای تهیه پیش نویس، 4 مجوز به تنهایی است). با استفاده از تعداد زیادی از کاربران و بسیاری از مجوزها، این جدول می تواند به سرعت در حال افزایش باشد.

ستون مهر زدن

یک ستون را برای هر مجوز به جدول کاربر اضافه کنید، سپس نوع داده خود را یک tinyint (basically a boolean) بگذارید تا مجوز را به عنوان "on" یا "off" بررسی کنید.

مجوز Semalt برای یک کاربر پس از آن به نظر می رسد چیزی شبیه به:

     UPDATE `users` SET` editProfile` = 1، `deleteProfile` = 0،` createDraft` = 1، `publishDraft` = 0.. id = 5    

این روش هیچ جداول اضافی را اضافه نمی کند، اما ضروری است که جدول را به عرض جغرافیایی گسترش می دهد و هربار که یک مجوز جدید اضافه می شود، نیاز به اصلاح پایگاه داده دارد. Semalt یک رویکرد خوب برای زمانی که شما می دانید حداکثر دو یا سه مجوز برای آینده قابل پیش بینی دارید، اما نباید برای چیزی بیش از آن استفاده کنید.

Semalt، زیرا لیست ستون ها، زمانی که از دور دیده می شود، شبیه یک عدد دودویی (1010) است، این روش یک segway بسیار عالی است .

رویکرد بیتی

Semalt ما عمیق تر به این رویکرد، اجازه دهید یک دوره سقوط در دودویی.

شماره دودویی

تمام رایانه ها داده ها را به صورت دودویی ذخیره می کنند: 0 یا 1. بنابراین، شماره 14 در واقع به عنوان: 1110 ذخیره می شود. بنابراین شماره 1337 به معنی:

  • 1 × 7
  • + 3 × 10
  • + 3 x 100
  • + 1 × 1000

هر عدد سمپل در سیستم دهدهی (پایه 10) برابر 10 می شود. اولین عدد 1، بعدی 10 است، بعدی بعد از آن 100، 1000 بعدی و غیره

در باینری، پایه 2 است، بنابراین هر رقم با 2 ضرب می شود. بنابراین شماره 1110 است:

  • 0 x 1
  • + 1 × 2
  • + 1 × 4
  • + 1 × 8

Semalt 2 + 4 + 8، که 14.

بله، ساده است که اعداد دودویی را به دهدهی تبدیل کنید.

بنابراین وقتی که ما به ستون های مجوز ما از قبل از 1010 نگاه می کنیم، این نیز ممکن است به عنوان شماره 10 در فرم باینری نوشته شود. ممنون، شاید ما در مورد چیزی هستیم

اگر مجوز 1010 داشته باشیم، این بدان معناست که بیت دوم و چهارم تعیین می شود، در حالی که اول و سوم (به این دلیل که 0 هستند) نیستند.

در زبان باینری، ما در واقع می گویند 0 و 2 بیت تنظیم نشده اند، زیرا آنها از 0 محاسبه می شوند، درست مثل آرایه ها. این به این دلیل است که عدد صحیح آنها (1، 2، 3) به نماینده آنها مربوط می شود. بیت 0 بطور واقعی 2 به قدرت 0 (2 ^ 0) است که برابر با 1 است. بیت اول 2 به قدرت 1 (2 ^ 1) است که 2 است. دوم 2 مربع (2 ^ 2) است که معادل 4، و غیره به همین ترتیب همه چیز بسیار آسان است به یاد داشته باشید.

پس چگونه این به ما کمک می کند؟

رویکرد Bitwise

با نگاهی به مجوزهای از راه دور، ما می توانیم وضعیت تمام ستون ها را در یک بار با یک عدد دودویی تک نماییم. اگر ما می توانیم تمام ستون ها را در یک بار با یک عدد دودویی تک نماییم، این بدان معنی است که ما می توانیم آن را با یک عدد صحیح واحد در هنگام decimal به ترتیب بیان کنیم.

اگر ما یک مجوز مجوز ستون داریم که شامل مقدار 14 بود، اکنون می دانیم که این در واقع 1110 است و ما می دانیم که ما سه نفر از چهار مجوز داشته باشند! اما چه 3 ما از 4؟

Semalt نقشه بندی زیر مجوزها:

مجوز تغییر ایجاد PROFILE PROFILE EDIT PROFILE DELETE ایجاد طرح PROJECT EDIT DRAFT DELETE پروپوزال انتشار پایان دادن به ویرایش FINISHED DELETE
512 256 128 64 32 16 8 4 2 1

شماره 14 در دودویی 1110 است، اما تعداد صفر در سمت چپ مهم نیست، بنابراین ما می توانیم آن را تا زمانی که تعداد مجوز ها در جدول را به دست می آوریم: 0000001110. این هنوز هم 14، تنها نماینده از مجوز از جدول بالا. برای تمام اهداف و اهداف، 0000001110 === 1110.

با توجه به این، می بینیم که حساب با اجازه 14 دارای مجوز: DRAFT_DELETE ، DRAFT_PUBLISH و FINISHED_EDIT بدست آمده، دقیقا نماینده یک مجوز مجوز دنیای واقعی نیست، اما این فقط یک مثال است که ما می توانیم از آن استفاده کنیم که اگر کسی 1111111111 داشته باشد، آنها مجوز ALL (احتمالا یک کاربر مدیریت) خواهند داشت. در دهدهی، این 1023 است. بنابراین، کسی که با مقدار 1023 در مجوز ستون کسی با تمام مجوز است.

اما چگونه می توانیم در کد ما این را بررسی کنیم؟ به عبارت دیگر، چگونه می توانیم بدانیم که آیا یک بیت مجوز یا نه تنظیم شده است، خصوصا اگر یک عدد به عنوان decimal اعمال شود و نه باینری؟

این به این معنی است که اپراتورهای بیتوویست برای - بخصوص یکپارچگی متقابل و ، همچنین به عنوان بیتی و . برای تغییر بیت های دیگر فقط با تغییر ارزش آنها می توانید 256، 128، 64، 32، 16، 8، 4، 2، یا 1 را بررسی کنید.


[اختیاری] حاشیه نویسی

اگر بخواهید بدانید که چگونه این اپراتور یا اپراتورهای مشابه کار می کنند، اما فقط علاقه مند به ادامه دادن به عنوان مثال، می توانید این بخش تقسیم کنید.

وقتی ما می گوییم و 512 و مجوز ها ، ما بخشی را دنبال می کنیم که بعد از AND، به این دلیل است که این چگونه عملیات SQL انجام می شود - آنها شرایط را ارزیابی می کنند و سطر هایی را که با توجه به الزامی .

بنابراین، 512 و مجوز باید به درستی ارزیابی شود. ما می دانیم که هر مقدار غیر صفر، بجای آن یک عدد صحیح، یک boolean که "true" می گوید یا یک رشته که خالی نیست، در واقع "درست" در نظر گرفته می شود. بنابراین 512 درست است 1 درست است 0 نادرست است 128 درست است و غیره

512 یک عدد صحیح پایه 10 است و مجوز یک ستون است که می تواند یک عدد صحیح پایه -10 باشد. بیتی و در واقع به قسمت مقطع این دو عدد نگاه می کند و بیت هایی را که در هر دو آنها تنظیم شده اند، باز می گرداند. بنابراین، اگر شماره 512 1، 0000000 باشد، و اگر مقدار مجوز 1023 باشد، در هنگام تبدیل به یک دودویی که 1111111111 است. بخش متقاطع از آن، 1000000000 بازگشت می کند، زیرا تنها بیت سمت چپ در هر دو عدد قرار دارد. هنگامی که ما این را به دهدهی تبدیل می کنیم، این 512 است که در نظر گرفته شده است true .

Semalt در واقع منطقی هستند، نه اپراتورهای محاسباتی، که در آن آنها برای حقیقت بر اساس یک شرایط بررسی می کنند. اگر ما اعداد 1110 و 1010 داشته باشیم، در اینجا چیزی است که آنها با توجه به اپراتورهای مختلف بیتی تولید می کنند:

- و | ^ ~
اپندر A 1110 1110 1110 1110
اپندر ب 1010 1010 1010 /
نتیجه 1010 1110 0100 0001
  • و یک شماره باینری را که در آن تمام بیت ها تنظیم شده است در هر دو اپندر تنظیم می کنند.
  • | یک عدد دودویی را با تمام مجموعه های بیتی که در هر دو عدد تنظیم می شوند، می گرداند.
  • ^ یک عدد دودویی را با تمام بیت ها تنظیم می کند که در هر دو اپندر تنظیم شده اند، اما نه هر دو.
  • ~ فقط مخالف را برمی گرداند - همه کسانی که در اپنجر اصلی تنظیم نشده اند اکنون تنظیم شده اند.

همچنین اپراتورهای تغییر بیتی: حرکت چپ << و تغییر راست >> وجود دارد. اینها به طور چشمگیری ارزشهای عدد دودویی را به صورت معنی داری تمام بیت های مجموعه را به یک مکان به سمت راست یا چپ حرکت می دهند. استفاده آنها در زمینه ما مشکوک است، بنابراین ما در اینجا آنها را پوشش نخواهیم داد.


و در پی اچ پی می توانیم بیتی را به صورت زیر آزمایش کنیم:

     اگر (1023 و 1) {}    

اما این واقعا، واقعا سخت است برای رمزگشایی - فقط نگاه کردن به اعداد خام واقعا قابل خواندن و قابل فهم نیست. بنابراین، در پی اچ پی بهتر است از ثابت هایی که مجوزها را به عنوان بیت ها تعریف می کنند استفاده شود و مقدار عدد صحیح مجوز را از ستون درج کند. سپس، شما را با چیزی شبیه به این:

     اگر ($ user-> مجوزها & \ MyNamespace \ Role :: FINISHED_DELETE) {//}    

در اینجا فرض می کنیم که یک کلاس \ MyNamespace \ Role تعریف شده و بارگذاری شده با ثابت هایی مثل این است:

     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 دو حادثه مهم هستند:

  1. در هنگام محاسبه مقدار بیت مجوز بعدی، باید از قدرت 2 استفاده کنید. بنابراین اگر مجبورید مجوز جدیدی را اضافه کنید می توانید تنها 543 را انتخاب کنید اگر شما 512 دارید - باید 1024 باشد. این باعث می شود کمی بیشتر پیچیده تر شود زیرا اعداد بزرگتر می شوند.
  2. از آنجا که رایانههای ما 64 بیتی سیستمعامل 64 بیتی CPU را اجرا میکنند (عمدتا - بعضی از آنها حتی در 32 بیتی هنوز هم گیر کردهاند)، به این معنی که تعداد میتواند حداکثر 64 بیت داشته باشد. این به این معنی است که شما فقط می توانید جایگزینی حداکثر 64 اجازه برای کاربر داده شده ذخیره کنید. برای سایت های کوچک تا متوسط ​​این کاملا کافی است، اما در وب سایت های عظیم، این می تواند به یک مشکل تبدیل شود. راه حل این است که برای استفاده از متد های مجوز draft_permissions ، account_permissions و غیره استفاده کنید. هر کدام از این ستون ها می توانند پس از 64 مجوز به صورت خود جایگزین شوند، که حتی برای وبسایت هایی که خواستار آن هستند، کافی است.

نتیجه گیری

عملیات بیتی قطعا هنوز در برنامه نویسی مدرن وجود دارد. Semalt ممکن است غیرقابل استفاده باشد برای استفاده از چیزی که به نظر می رسد پیچیده است (واقعا نمی شود - آن را تقریبا به عنوان به عنوان به عنوان جدول روزانه پیوستن به امروز شناخته شده)، این روش به ارمغان می آورد مزایای بسیاری - نه کمترین آن افزایش قابل توجهی در عملکرد، هر دو در داده ها اندازه (اطلاعات کمتری برای ذخیره در پایگاه داده و پس از آن واکشی) و سرعت (یک شیء کاربر می تواند مقدار مجوز خود را از پیش گرفته شده داشته باشد - این فقط یک اینترفیس است و بنابراین می توان آن را در همه زمان ها بررسی کرد).

Semalt به عنوان کسانی که در اینجا ارائه می شود مطمئنا همه چیز ساده است، اما فقط اگر شما از قبل از گزینه های حتی ساده تر از آنهایی که در بالا نشان داده شده آگاه نیست.

در مورد استفاده از اپراتورهای بیتی برای بررسی مجوزها و این روش برای ذخیره آنها چه احساسی دارید؟ هر کدام از جوانب مثبت / منفی؟ به ما بفهمانید که چگونه این کار را انجام می دهید، و چرا؟

March 1, 2018