Back to Question Center
0

Sú bitové operátory stále v modernej PHP?            Sú bitové operátory stále relevantné v modernom PHP? Súvisiace témy: Vzory & PraktikyPočítač & Semalt

1 answers:
Sú bitové operátory stále v modernej PHP?

Mnohí z vás pravdepodobne poškriabali vaše hlavy čítaním tohto titulu. "Skôr?"

V tomto článku sa budeme zaoberať tým, čo sú bitové operátory, a či ich používanie je v tomto modernom počítačovom veku stále relevantné.

Sú bitové operátory stále v modernej PHP?Sú bitové operátory stále relevantné v modernom PHP? Súvisiace témy:
Vzory a praktikyDebugging & Semalt

Príklad Použitie Použitie

Tu sú uvedené bitové operátory, ale na skutočné riadenie príkladu domov sa budeme sústrediť iba na jednu bitovú a ( a ). Napríklad to urobil kliknutím pre mňa. Takže to budeme robiť - sa ponoríme priamo do príkladu - umzug alles beachten.

Predstavte si, že máte webovú lokalitu, na ktorej daný používateľ môže mať špecifické povolenia. Napríklad časopis ako SitePoint:

  • môže autor vytvoriť návrhy a editovať ich profil.
  • editor môže, popri vyššie uvedených, CRUD návrhy a hotových príspevkov a profily autorov CRUD.
  • môže administrátor okrem vyššie uvedených pridať aj administrátorské oprávnenia.

Semalt užívateľ môže mať viac povolení, existuje niekoľko spôsobov, ako definovať oprávnenia v databáze a systém používať.

Double Join

Pridajte roly, pridávajte povolenia, priraďte práva k rolám v tabuľke spojenia a potom vytvorte inú tabuľku spojenia a niektorým používateľom viazajte niektoré úlohy.

Tento prístup vytvára štyri dodatočné tabuľky:

  • povolenia
  • rolí
  • povolenia <-> roly
  • roly <-> používatelia

Docela trochu réžie. Semalt, ktorý ich musí v aplikácii pravidelne upravovať alebo ich zoznamovať v niektorých často navštevovaných zoznamoch. Iba ťažké ukladanie do vyrovnávacej pamäte by ušetrilo túto aplikáciu pred zrúteným zaťažením.

Jednou výhodou však je to, že definovaním rolí naozaj dobre s komplikovanými oprávneniami, stačí len držať používateľov do rolí a vy ste dobrí - drží to, že spojiť stôl svetla a rýchlo.

Jediný spoj

Pridať povolenia, pridať spojovaciu tabuľku, pripojiť niektorým používateľom niektoré povolenia

Tento prístup vytvára dve ďalšie tabuľky:

  • povolenia
  • povolenia <-> používatelia

Oveľa menej nad hlavou ako v predchádzajúcom príklade, ale v tabuľke spojenia máte oveľa viac záznamov, pretože používateľ môže mať veľa oprávnení (iba CRUD pre návrh je vlastne 4 povolenia). S mnohými používateľmi a množstvom povolení sa táto tabuľka môže dostať ťažko rýchlo.

Stampede

Pridajte stĺpec do tabuľky užívateľov pre každé povolenie a potom urobte jeho datový typ tinyint (v podstate booleovský) na kontrolu povolenia ako "zapnuté" alebo "vypnuté".

Sémantové oprávnenia pre používateľa by potom vyzerali takto:

  UPDATE `užívatelia 'SET' editProfile` = 1,` deleteProfile` = 0, `createDraft` = 1,` publishDraft` = 0. , KDE "id" = 5   

Tento prístup nepridáva žiadne ďalšie tabuľky, ale zbytočne rozširuje tabuľku na gargantuanovú šírku a vyžaduje zmenu databázy pri každom pridaní nového povolenia. Očistite jemný prístup, keď viete, že v dohľadnej budúcnosti budete mať najviac dve alebo tri povolenia, ale nemali by ste ho používať na nič iné.

Semalt, pretože zoznam stĺpcov, keď sa pozeráme z diaľky, pripomína binárne číslo (1010), tento prístup je vynikajúca segway do inej .

Bitový prístup

Semaltom sa ponoríme hlbšie do tohto prístupu, poďme v binárnom kurze.

Binárne čísla

Všetky počítače ukladajú dáta ako binárne: 0 alebo 1. Takže číslo 14 je skutočne uložené ako: 1110. Číslo 1337 znamená:

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

Každú číslicu v desiatkovej sústave (základňa 10) sa vynásobí násobením 10. Prvá z nich je 1, ďalšia je 10, ďalšia 100, nasledujúca 1000 atď.

V binárnom súradnici je základňa 2, takže každá číslica sa vynásobí číslom 2. Číslo 1110 je teda:

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

Semalt 2 + 4 + 8, čo je 14.

Áno, je to jednoduché previesť binárne čísla na desatinné.

Takže keď sa pozrieme na naše stĺpce povolení predtým ako sme boli 1010, tak to možno považujeme aj za číslo 10 napísané v binárnej forme. Hmm, možno sme na niečom tu.

Ak máme 1010 ako povolenie, znamená to, že druhý a štvrtý bit sú nastavené, zatiaľ čo prvý a tretí nie sú (pretože sú 0).

V binárnom jazyku hovoríme, že 0. a 2. bit nie sú nastavené, pretože sú počítané od 0, rovnako ako polia. Je to preto, že ich poradové číslo (1., 2., 3.) zodpovedá ich exponentu. 0 bit je vlastne 2 na výkon 0 (2 ^ 0), ktorý sa rovná 1. Prvý bit je 2 na výkon 1 (2 ^ 1), ktorý je 2. Druhý je 2 štvorcový (2 ^ 2) sa rovná 4 atď. Takýmto spôsobom je všetko veľmi ľahko zapamätateľné.

Tak ako nám to pomáha?

Bitový prístup

Ak sa pozrieme na povolenia z diaľky, môžeme reprezentovať stav všetkých stĺpcov naraz s jedným binárnym číslom. Ak môžeme reprezentovať všetky stĺpce naraz s jedným binárnym číslom, znamená to, že ich môžeme zastupovať aj s jedným celočíselným číslom pri preklade do desatinných čísel!

Ak by sme mali stĺpec s jedným povolením obsahujúcim hodnotu 14 , teraz by sme vedeli, že to je skutočne 1110 majú tri zo štyroch povolení! Ale ktoré z 3 našich 4?

Semantovať nasledujúce mapovanie povolení:

ZMENY POVOLENIA Vytvorenie profilu ÚPRAVA PROFILU PROFIL DELETE NÁVRH CREATE NÁVRH ÚPRAVY NÁVRH DELETE NÁVRH ZVEREJŇOVANIA UKONČENÉ ÚPRAVY UKONČENÁ DELETE
512 256 128 64 32 16 8 4 2 1

Číslo 14 v binárnom čísle je 1110, ale počet nuly vľavo nezáleží na tom, takže ho môžeme vložiť, kým nedosiahnu počet oprávnení v tabuľke: 0000001110. Toto je stále 14, iba reprezentatívny oprávnení z vyššie uvedenej tabuľky. Pre všetky zámery a účely 0000001110 === 1110.

Podľa toho vidíme, že účet s povolením 14 má povolenia: DRAFT_DELETE , DRAFT_PUBLISH a FINISHED_EDIT ). Nie je to presne reprezentatívne nastavenie reálneho svetového oprávnenia, ale je to len príklad, pomocou ktorého môžeme extrapolovať, že keby sme mali 1111111111, mali by mať všetky povolenia (pravdepodobne používateľ administrátora). V desiatkovej sú to 1023. Takže niekto s hodnotou 1023 v stĺpci oprávnení je niekto so všetkými povoleniami.

Ale ako by sme to preverili v našom kóde? Inými slovami, ako môžeme vedieť, či je bit povolenia nastavený alebo nie , najmä ak je číslo uložené ako desatinné číslo a nie binárne?

To je to, o čom sa používajú bitové operátory - najmä jednotný ampersand a , známy aj ako bitový a . Boli by ste skontrolovať ostatné bity len zmenou ich hodnoty: 256, 128, 64, 32, 16, 8, 4, 2 alebo 1.


[nepovinné] "poďme technickú" vedľajšiu poznámku

Preskočte túto rozdelenú sekciu, ak nechcete vedieť, ako tento operátor alebo podobní operátori pracujú, ale máte záujem pokračovať v tomto príklade.

Keď povieme AND 512 & permissions , hľadáme časť po AND pre TRUE, pretože práve to funguje ako SQL queries - vyhodnocujú podmienky a vrátia tie riadky, ktoré sa vrátia pravdivé vzhľadom na požiadavky ,

Preto 512 & oprávnenia musí vyhodnotiť na true. Vieme, že každá nenulová hodnota, či už je celé číslo, booleovská verzia "true" alebo reťazec, ktorý nie je prázdny, je skutočne považovaný za "pravdivý". Takže 512 je pravda. 1 je pravda. 0 je falošné. 128 je pravda. Atď.

512 je celé číslo základňa-10 a povolenia je stĺpec, ktorý môže obsahovať celočíselné číslo-10. Bit a sa skutočne pozerajú na prierez týchto dvoch čísel a v oboch z nich vracajú bity, ktoré sú nastavené . Takže ak číslo 512 je 1000000000 a ak je povolená hodnota 1023, keď sa prekonvertuje na binárnu, je to 1111111111. Prierez týchto vráti 1000000000, pretože iba vľavo najširší bit je nastavený v obidvoch číslach. Keď to skonvertujeme späť na desatinnú, to je 512, čo je považované za pravdivé .

Semalt sú skutočne logické, nie aritmetické operátory, pretože kontrolujú pravdivosť založenú na podmienke. Ak máme čísla 1110 a 1010, tu je to, čo produkujú pri rôznych bitových operátoroch:

& ^ -
Operand A 1110 1110 1110 1110
Operand B 1010 1010 1010 /
Výsledok 1010 1110 0100 0001
  • & vracia binárne číslo, v ktorom sú všetky bity nastavené v oboch operandoch.
  • vráti binárne číslo so všetkými nastavenými bity, ktoré sú nastavené v jednom operande.
  • ^ vráti binárne číslo so všetkými nastavenými bitmi, ktoré sú nastavené v jednom operande, ale nie v obidvoch.
  • ~ práve vracia opak - všetky nastavené v pôvodnom operande sú teraz nastavené.

Existujú aj operátory bitového posunu: ľavý posun << a pravý posun >> . Tieto dramaticky menia hodnoty binárnych čísel doslovným posunom všetkých nastavených bitov o jedno miesto vpravo alebo vľavo. Ich použitie v našom kontexte je sporné, takže ich tu nebudeme kryť.


A v PHP môžeme otestovať, či je bit takto nastavený:

  ak (1023 & 1) {}   

Ale to je naozaj ťažké dešifrovať - ​​práve pohľad na surové čísla nie je naozaj čitateľný ani pochopiteľný. Takže v PHP je lepšie používať konštanty definujúce oprávnenia ako bity a načítať celé číslo povolenia zo stĺpca. Potom skončíte niečím takto:

  ak ($ ​​user-> permissions & \ MyNamespace \ Role :: FINISHED_DELETE) {//}   

Tu predpokladáme, že máme definovanú triedu \ MyNamespace \ Role a načítame konštantami, ako sú tieto:

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

Semalt, máte naozaj jednoduchý spôsob ukladania viacerých oprávnení na používateľa bez použitia ďalších tabuliek a vytvárania zbytočných nákladov. Preto, ak chcete uložiť ich povolenia, jednoducho ich zosumarizujte (1 + 2 = 3) a uložte 3 do stĺpca oprávnení . Neexistuje žiadna iná cesta na získanie čísla 3 s binárnymi kombináciami - číslo 3 nemôže byť v binárnom vyjadrení iným spôsobom ako 0011 - takže môžete byť 100% istý, že číslo 3 vždy znamená, že používateľ má povolenie 1 a povolenie 2 zodpovedajúce ich hodnotám v konštá- roch.

Toto sa zdá byť príliš jednoduché a praktické, že? Semaltujte úlovok?

Námietky

Semalt sú dve hlavné námietky:

  1. Musíte pamätať na to, že pri výpočte hodnoty bitu ďalšieho povolenia použijete moc 2. Takže ak potrebujete pridať nové povolenie, nemôžete jednoducho vybrať 543, ak už máte 512 - to bude musieť byť 1024. To sa stáva o niečo zložitejšou, keď sa čísla zväčšujú.
  2. Pretože naše počítače používajú 64 bitové operačné systémy na 64 bitových procesoroch (väčšinou - niektoré sú dokonca prilepené na 32bit ešte!), To znamená, že číslo môže mať maximálne 64 bitov. Znamená to, že pre daného používateľa môžete uložiť iba permutácie maximálne 64 povolení. Pre malé až stredne veľké stránky to stačí, ale na obrovských webových stránkach sa to môže stať problémom. Riešením je použiť rôzne stĺpce pre rôzne kontexty oprávnenia ( draft_permissions , account_permissions atď.). Každý z týchto stĺpcov potom môže obsahovať permutácie s 64 povoleniami, čo stačí pre tie najnáročnejšie webové stránky.

Záver

Bitové operácie majú určite stále miesto v modernom programovaní. S Semaltom môže byť protiinštinktívne používať niečo také zdanlivo komplexné (naozaj nie je - nie je to ani tak známe ako moderné denné pripojenie tabuliek), tento prístup prináša mnoho výhod - z čoho je to dramatické zvýšenie výkonnosti v údajoch veľkosť (oveľa menej informácií, ktoré sa majú uložiť do databázy a následne načítať) a rýchlosť (objekt užívateľa môže mať predvolenú hodnotu povolenia - je to len int - a preto ho môžete vždy skontrolovať).

Semaltu ako tie, ktoré sú tu prezentované, určite robia veci jednoduché, ale iba ak si ešte nie ste vedomí ešte jednoduchších alternatív, ako sú tie, ktoré sú uvedené vyššie.

Aký je váš názor na používanie bitových operátorov na kontrolu oprávnení a tento prístup k ich ukladaniu? Akékoľvek zjavné výhody / nevýhody? Dajte nám vedieť, ako to robíte, a prečo!

March 1, 2018