Back to Question Center
0

Οι Bitwise Operators εξακολουθούν να σχετίζονται με τη σύγχρονη PHP;            Οι Bitwise Operators εξακολουθούν να σχετίζονται με τη σύγχρονη PHP; Σχετικά θέματα: Μοτίβα & PracticesDebugging & Semalt

1 answers:
Οι Bitwise Operators εξακολουθούν να ισχύουν στη σύγχρονη PHP;

Πολλοί από εσάς πιθανώς γκρεμίσατε τα κεφάλια σας διαβάζοντας αυτόν τον τίτλο. "Κάπως;"

Σε αυτό το άρθρο, θα εξετάσουμε ποιοι είναι οι δυαδικοί χειριστές και αν η χρήση τους εξακολουθεί να είναι σχετική σε αυτή τη σύγχρονη εποχή της πληροφορικής.

Οι Bitwise Operators εξακολουθούν να σχετίζονται με τη σύγχρονη PHP;Οι Bitwise Operators εξακολουθούν να σχετίζονται με τη σύγχρονη PHP; Σχετικά θέματα:
Πρότυπα & Πρακτικές

Παράδειγμα χρήσης Περίπτωση

Οι δυαδικοί χειριστές παρατίθενται εδώ, αλλά για να οδηγήσουμε πραγματικά το σπίτι στο παράδειγμα, θα επικεντρωθούμε σε ένα μόνο: το bit και το ( & ). Ένα παράδειγμα έκανε κλικ για μένα. Αυτό είναι που θα κάνουμε - βυθίσαμε κατευθείαν σε ένα παράδειγμα - meilleur logiciel de compta en ligne.

Φανταστείτε ότι έχετε έναν ιστότοπο στον οποίο ένας συγκεκριμένος χρήστης μπορεί να έχει συγκεκριμένες άδειες. Για παράδειγμα, ένα περιοδικό όπως το SitePoint:

  • , ένας συγγραφέας μπορεί να επεξεργαστεί και να επεξεργαστεί το προφίλ του.
  • ένας συντάκτης μπορεί, εκτός από τα παραπάνω, να σχεδιάσει και να ολοκληρώσει τις θέσεις του CRUD και τα προφίλ των δημιουργών CRUD.
  • , ένας διαχειριστής μπορεί, εκτός από τα παραπάνω, να προσθέσει δικαιώματα διαχειριστή.

Ο χρήστης μπορεί να έχει πολλαπλά δικαιώματα, υπάρχουν διάφοροι τρόποι καθορισμού των δικαιωμάτων σε μια βάση δεδομένων και του συστήματος που χρησιμοποιεί.

Το Double Join

Προσθέστε ρόλους, προσθέστε δικαιώματα, επισυνάψτε δικαιώματα σε ρόλους σε έναν πίνακα ενοποίησης, στη συνέχεια δημιουργήστε έναν άλλο πίνακα σύνδεσης και δεσμεύστε μερικούς ρόλους σε μερικούς χρήστες.

Η προσέγγιση αυτή δημιουργεί τέσσερις επιπλέον πίνακες:

  • δικαιώματα
  • ρόλοι
  • δικαιώματα <-> ρόλοι
  • ρόλοι <-> χρήστες

Αρκετά γενικά έξοδα. Το Semalt πρέπει να τα επεξεργαστείτε ή να τα καταχωρήσετε τακτικά στην εφαρμογή σε ορισμένες λίστες που επισκέπτονται συχνά. Μόνο η βαριά προσωρινή αποθήκευση θα έσωζε αυτήν την εφαρμογή από την κατάρρευση υπό βαρύ φορτίο.

Ένα πλεονέκτημα, όμως, είναι ότι ο καθορισμός των ρόλων πραγματικά καλά με τα περίπλοκα δικαιώματα, πρέπει μόνο να κολλήσετε τους χρήστες σε ρόλους και είστε καλοί - διατηρεί ότι συνδυάζουν το τραπέζι φως και γρήγορα.

Η ενιαία συμμετοχή

Προσθέστε δικαιώματα, προσθέστε έναν πίνακα ενοποίησης, επισυνάψτε ορισμένα δικαιώματα σε ορισμένους χρήστες

Η προσέγγιση αυτή δημιουργεί δύο επιπλέον πίνακες:

  • δικαιώματα
  • δικαιώματα <-> χρήστες

Πολύ λιγότερο γενικά από το προηγούμενο παράδειγμα, αλλά έχετε πολύ περισσότερες εγγραφές στον πίνακα ενοποίησης επειδή ένας χρήστης μπορεί να έχει πολλά δικαιώματα (μόνο το CRUD για σύνταξη είναι 4 δικαιώματα από μόνο του). Με πολλούς χρήστες και πολλές άδειες, ο πίνακας αυτός μπορεί να πάρει πολύ γρήγορα.

Η σφραγίδα της στήλης

Προσθέστε μια στήλη στον πίνακα χρηστών για κάθε άδεια και, στη συνέχεια, κάντε το datatype της ένα tinyint (βασικά ένα boolean) για να ελέγξετε την άδεια ως "on" ή "off".

Τα δικαιώματα του Semalt για έναν χρήστη θα φαινόταν τότε κάτι τέτοιο:

     UPDATE `χρήστες 'SET' editProfile` = 1,` deleteProfile` = 0, `createDraft` = 1,` publishDraft` = 0. WHERE "id" = 5    

Αυτή η προσέγγιση δεν προσθέτει επιπλέον πίνακες, αλλά επεκτείνει άσκοπα το τραπέζι σε πλάτος υπερβολικού μεγέθους και απαιτεί τροποποίηση της βάσης δεδομένων κάθε φορά που προστίθεται νέα άδεια. Αποκαλύψτε μια ωραία προσέγγιση για όταν ξέρετε ότι θα έχετε το πολύ δύο ή τρία δικαιώματα για το προσεχές μέλλον, αλλά δεν θα πρέπει να χρησιμοποιείται για τίποτα περισσότερο από αυτό.

Semalt, επειδή ο κατάλογος των στηλών, όταν εξετάζεται από μακριά, μοιάζει με δυαδικό αριθμό (1010), αυτή η προσέγγιση είναι μια εξαιρετική segway σε μια άλλη .

Η δυαδική προσέγγιση

Semalt καταδυόμαστε βαθύτερα σε αυτή την προσέγγιση, ας έχουμε μια πορεία σύγκρουσης σε δυαδικό.

Δυαδικοί αριθμοί

Όλοι οι υπολογιστές αποθηκεύουν δεδομένα ως δυαδικά: 0 ή 1. Έτσι, ο αριθμός 14 αποθηκεύεται ως εξής: 1110. Έτσι ο αριθμός 1337 σημαίνει:

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

Ο αριθμός των ψηφίων στο δεκαδικό σύστημα (βάση 10) πολλαπλασιάζεται με 10. Το πρώτο είναι 1, το επόμενο 10, το επόμενο μετά το 100, το επόμενο 1000 κ.λπ.

Στη δυαδική βάση, η βάση είναι 2, έτσι κάθε ψηφίο πολλαπλασιάζεται επί 2. Ο αριθμός 1110 είναι συνεπώς:

  • 0 χ 1
  • + 1 χ 2
  • + 1 χ 4
  • + 1 χ 8

Semalt 2 + 4 + 8, η οποία είναι 14.

Ναι, είναι τόσο εύκολο να μετατρέψετε δυαδικούς αριθμούς σε δεκαδικά.

Έτσι, όταν εξετάζουμε τις στήλες μας από πριν από το 1010, αυτό θα μπορούσε να θεωρηθεί και ως ο αριθμός 10 γραμμένος σε δυαδική μορφή. Χμμ, ίσως βρισκόμαστε σε κάτι εδώ.

Αν έχουμε 1010 ως δικαιώματα, σημαίνει ότι το δεύτερο και το τέταρτο bit έχουν οριστεί, ενώ το πρώτο και το τρίτο δεν είναι (επειδή είναι 0).

Στην δυαδική λέξη, λέμε στην πραγματικότητα ότι το 0ο και το 2ο bit δεν έχουν οριστεί, επειδή υπολογίζονται από το 0, ακριβώς όπως οι συστοιχίες. Αυτό συμβαίνει επειδή ο αύξων αριθμός τους (1ος, 2ος, 3ος) αντιστοιχεί στον εκθέτη τους. Το 0ο bit είναι στην πραγματικότητα 2 στην ισχύ 0 (2 ^ 0) που ισούται με 1. Το πρώτο bit είναι 2 στη δύναμη του 1 (2 ^ 1) που είναι 2. Το 2ο είναι 2 τετράγωνο (2 ^ 2) ισούται με 4, κλπ. Έτσι είναι πολύ εύκολο να θυμηθούμε.

Πώς μας βοηθά αυτό;

Η δυαδική προσέγγιση

Λοιπόν, εξετάζοντας τις άδειες από μακριά, μπορούμε να αναπαριστούμε την κατάσταση όλων των στηλών ταυτόχρονα με ένα μόνο δυαδικό αριθμό. Εάν μπορούμε να αναπαριστούμε όλες τις στήλες ταυτόχρονα με έναν μόνο δυαδικό αριθμό, αυτό σημαίνει ότι μπορούμε επίσης να το εκπροσωπήσουμε με έναν ενιαίο ακέραιο όταν μεταφράζεται σε δεκαδικό!

Αν είχαμε μία στήλη 24 , η οποία θα περιέχει την τιμή 14 , θα γνωρίζαμε τώρα ότι είναι 1110 έχουν τρία από τα τέσσερα δικαιώματα! Αλλά ποιες 3 από τις 4 μας;

Παρακολούθηση της ακόλουθης αντιστοίχισης των αδειών:

ΑΔΕΙΕΣ ΜΕΤΑΒΟΛΗΣ Δημιουργία προφίλ ΠΡΟΦΙΛ ΕΠΕΞΕΡΓΑΣΙΑΣ ΔΙΑΓΡΑΜΜΑ ΠΡΟΦΙΛ ΣΧΕΔΙΟ ΔΗΜΙΟΥΡΓΙΑΣ ΣΧΕΔΙΟ ΕΠΕΞΕΡΓΑΣΙΑΣ ΣΧΕΔΙΟ ΔΙΑΓΡΑΦΗΣ ΣΧΕΔΙΟ ΔΗΜΟΣΙΕΥΣΗΣ ΤΕΛΕΙΟΠΟΙΗΜΕΝΟΣ ΟΔΗΓΟΣ ΤΕΛΟΣ ΔΙΑΓΡΑΜΜΑ
512 256 128 64 32 16 8 4 2 1

Ο αριθμός 14 στο δυαδικό είναι 1110, αλλά ο αριθμός των μηδενών στα αριστερά δεν έχει σημασία, οπότε μπορούμε να το τοποθετήσουμε μέχρι να φτάσουμε στον αριθμό των αδειών στον πίνακα: 0000001110. Αυτό εξακολουθεί να είναι 14, μόνο αντιπροσωπευτικό των αδειών από τον παραπάνω πίνακα. Για όλες τις προθέσεις και σκοπούς, 0000001110 === 1110.

DRAFT_DELETE , DRAFT_PUBLISH , και FINISHED_EDIT , ). Δεν είναι ακριβώς αντιπροσωπευτικό μιας ρύθμισης δικαιωμάτων πραγματικού κόσμου, αλλά είναι απλώς ένα παράδειγμα μέσω του οποίου μπορούμε να παραθέσουμε ότι αν κάποιος θα είχε 1111111111, θα έχουν όλα τα δικαιώματα (πιθανώς ένα χρήστη διαχειριστή). Σε δεκαδικό, αυτό είναι 1023. Έτσι, κάποιος με την τιμή 1023 στη στήλη δικαιωμάτων είναι κάποιος με όλα τα δικαιώματα.

Αλλά πώς θα το ελέγξαμε στον κώδικα μας; Με άλλα λόγια, πώς μπορούμε να γνωρίζουμε εάν έχει οριστεί ένα bit της άδειας ή όχι , ειδικά αν ένας αριθμός είναι αποθηκευμένος ως δεκαδικό και όχι δυαδικό;

και , γνωστό και ως bitwise και . Θα ελέγξετε για άλλα bits αλλάζοντας την αξία τους: 256, 128, 64, 32, 16, 8, 4, 2 ή 1.


Το [προαιρετικό] "ας πάρουμε τεχνική" πλευρά

Περάστε αυτό το διαιρεμένο τμήμα αν δεν θέλετε να μάθετε πώς αυτός ο φορέας εκμετάλλευσης ή παρόμοιοι χειριστές εργάζονται, αλλά ενδιαφέρεστε απλώς να συνεχίσετε με το παράδειγμα.

Όταν λέμε AND 512 & permissions ψάχνουμε για το μέρος μετά από το AND να είναι TRUE, επειδή έτσι λειτουργούν τα SQL ερωτήματα - αξιολογούν τους όρους και επιστρέφουν εκείνες τις σειρές που επιστρέφουν αληθινές σε σχέση με τις απαιτήσεις .

Ως εκ τούτου, 512 & δικαιώματα πρέπει να αξιολογηθεί ως αλήθεια. Γνωρίζουμε ότι οποιαδήποτε μη μηδενική τιμή, είτε είναι ένας ακέραιος αριθμός, είτε ένας boolean που λέει "true", είτε ένα string που δεν είναι άδειο, θεωρείται πραγματικά "true". Έτσι, 512 είναι αλήθεια. 1 είναι αλήθεια. 0 είναι ψευδής. 128 είναι αλήθεια. Κ.λπ.

512 είναι ένας ακέραιος αριθμός βάσης-10 και τα δικαιώματα είναι μια στήλη που μπορεί να περιέχει έναν ακέραιο βάσης-10. Το bitwise και εξετάζει στην πραγματικότητα την διατομή αυτών των δύο αριθμών και επιστρέφει τα δυαδικά ψηφία που έχουν οριστεί και στα δύο. Έτσι, εάν ο αριθμός 512 είναι 1000000000 και αν η τιμή των δικαιωμάτων είναι 1023, όταν μετατρέπεται σε δυαδικό που είναι 1111111111. Η διατομή αυτών επιστρέφει 1000000000 επειδή μόνο το αριστερότερο bit έχει οριστεί και στους δύο αριθμούς. Όταν μετατρέπουμε αυτό πίσω σε δεκαδικό, αυτό είναι 512, το οποίο θεωρείται αληθές .

Οι Semalt είναι πραγματικά λογικοί, όχι αριθμητικοί χειριστές, διότι ελέγχουν την αλήθεια με βάση μια κατάσταση. Αν έχουμε τους αριθμούς 1110 και 1010, εδώ δίδουμε τα στοιχεία που δίνουν οι διαφορετικοί δυαδικοί χειριστές:

- & | ^ ~
Operand Α 1110 1110 1110 1110
Operand Β 1010 1010 1010 /
Αποτέλεσμα 1010 1110 0100 0001
  • & επιστρέφει έναν δυαδικό αριθμό στον οποίο έχουν οριστεί όλα τα bits που έχουν οριστεί και στους δύο τελεστές.
  • επιστρέφει ένα δυαδικό αριθμό με όλα τα bits που έχουν οριστεί σε κάθε τελεστή.
  • ^ επιστρέφει ένα δυαδικό αριθμό με όλα τα bits που έχουν οριστεί σε κάθε τελεστή, αλλά όχι και τα δύο.
  • ~ επιστρέφει ακριβώς το αντίθετο - όλα αυτά που δεν έχουν οριστεί στον αρχικό τελεστή είναι τώρα ρυθμισμένα.

Υπάρχουν επίσης οι χειριστές μεταβλητής μετατόπισης: αριστερή μετατόπιση << και δεξιά μετατόπιση >> . Αυτά αλλάζουν δραματικά τις αξίες των δυαδικών αριθμών μεταφέροντας κυριολεκτικά όλα τα bits που έχουν οριστεί σε ένα σημείο προς τα δεξιά ή προς τα αριστερά. Η χρήση τους στο πλαίσιο μας είναι αμφισβητήσιμη, οπότε δεν θα τα καλύψουμε εδώ.


Και στην PHP μπορούμε να δοκιμάσουμε αν ένα κομμάτι έχει οριστεί έτσι:

     εάν (1023 & 1) {}}    

Αλλά αυτό είναι πραγματικά, πραγματικά δύσκολο να αποκρυπτογραφήσει - απλά κοιτάζοντας τους ακατέργαστους αριθμούς δεν είναι πραγματικά αναγνώσιμος ή κατανοητός. Επομένως, στην PHP, είναι καλύτερο να χρησιμοποιείτε σταθερές που ορίζουν δικαιώματα ως bits και να λαμβάνετε την ακέραια τιμή της άδειας από τη στήλη. Στη συνέχεια, καταλήγετε σε κάτι τέτοιο:

     εάν ($ user-> permissions & \ 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 κατά τον υπολογισμό της τιμής bit της επόμενης άδειας. Επομένως, αν χρειαστεί να προσθέσετε μια νέα άδεια, δεν μπορείτε να επιλέξετε μόνο 543 αν έχετε ήδη 512 - θα πρέπει να είναι 1024. Αυτό παίρνει λίγο πιο περίπλοκο καθώς οι αριθμοί μεγαλώνουν.
  2. Επειδή οι υπολογιστές μας χρησιμοποιούν λειτουργικά συστήματα 64 bit σε επεξεργαστές 64 bit (κυρίως - μερικοί ακόμη έχουν κολλήσει ακόμα 32bit!), Αυτό σημαίνει ότι ένας αριθμός μπορεί να έχει μόνο 64 bit μόνο. Αυτό σημαίνει ότι μπορείτε να αποθηκεύσετε μόνο παραλλαγές μέγιστης άδειας 64 για έναν συγκεκριμένο χρήστη. Για μικρές έως μεσαίες τοποθεσίες αυτό είναι αρκετό, αλλά σε τεράστιους ιστότοπους, αυτό μπορεί να μετατραπεί σε πρόβλημα. Η λύση είναι να χρησιμοποιηθούν διαφορετικές στήλες για διαφορετικά πλαίσια άδειας ( draft_permissions , account_permissions , κλπ.). Καθεμία από αυτές τις στήλες μπορεί στη συνέχεια να περιέχει παραλλαγές των 64 αδειών από μόνοι τους, πράγμα που αρκεί και για τους πιο απαιτητικούς δικτυακούς τόπους.

Συμπέρασμα

Οι δυαδικές πράξεις έχουν σίγουρα μια θέση στον σύγχρονο προγραμματισμό. Το Semalt μπορεί να είναι αντίθετο να χρησιμοποιήσει κάτι τόσο φαινομενικά περίπλοκο (στην πραγματικότητα δεν είναι - δεν είναι απλώς τόσο οικείο όσο τα σύγχρονα τραπέζια), αυτή η προσέγγιση φέρνει πολλά οφέλη - το λιγότερο από τα οποία είναι μια δραματική ώθηση στην απόδοση, τόσο στα δεδομένα το μέγεθος (πολύ λιγότερες πληροφορίες που αποθηκεύονται στη βάση δεδομένων και στη συνέχεια να προσκομίζονται) και η ταχύτητα (ένα αντικείμενο χρήστη μπορεί να έχει προ-φορτισμένη τιμή άδειας - είναι απλώς ένα int και επομένως μπορεί να το ελέγξει ανά πάσα στιγμή).

Οι Semalt, όπως παρουσιάζονται εδώ, σίγουρα κάνουν τα πράγματα απλά, αλλά μόνο αν δεν γνωρίζετε ήδη ακόμα απλούστερες εναλλακτικές λύσεις όπως αυτές που παρουσιάστηκαν παραπάνω.

Πώς αισθάνεστε για τη χρήση bitwise operators για τον έλεγχο των δικαιωμάτων και την προσέγγιση για την αποθήκευση τους; Οποιαδήποτε εμφανή πλεονεκτήματα / μειονεκτήματα; Ενημερώστε μας πώς το κάνετε και γιατί!

March 1, 2018