Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Klasa][PHP7] Prosta klasa do kilku operacji bitowych.
Forum PHP.pl > Inne > Oceny
KsaR
class.Bits.php
  1. <?php
  2. abstract class Bits
  3. {
  4. protected $bits = 0;
  5.  
  6. public function __construct($bits = NULL)
  7. {
  8. if ($bits !== NULL) $this->bits = $bits;
  9. }
  10.  
  11. public function has(int $bit): bool
  12. {
  13. return ($this->bits & $bit) === $bit;
  14. }
  15.  
  16. public function set(int $bit, bool $bool)
  17. {
  18. if ($bool)
  19. $this->bits |= $bit;
  20. else
  21. $this->bits &=~ $bit;
  22.  
  23. return $this;
  24. }
  25.  
  26. public function get(): int
  27. {
  28. return $this->bits;
  29. }
  30. }


class.Flags.php
  1. class Flags extends Bits
  2. {
  3. const _BAN_ = 1;
  4. const _ONLINE_ = 2;
  5. const _GLOBALS_ = 4;
  6. const _ECHO_ = 8;
  7. const _SPY_ = 16;
  8. }


Klasa jak widać prosta, zainspirowałem się do zrobienia jej po artykule nospor-a.
(Dwuwartościowe przechowywanie)

Oceniać można wszystko (nazewnictwo, co można by lepiej) itp.

Przykłady użycia:

Rejestracja Użytkownika
  1. $flags = new Flags;
  2. $flags->set(Flags::_GLOBALS_, true);
  3. # ... Potem przy insercie do bazy użyjemy dla pola `options`
  4. $flags->get();


Gdy już mamy zarejestrowanego a chcemy np. Zaktualizować status online/spy:
  1. $flags = new Flags($user['options']);
  2. $flags
  3. ->set(Flags::_ONLINE_, true)
  4. ->set(Flags::_SPY_, true);
  5. # przy update do bazy....
  6. $flags->get();


Aby sprawdzić czy uzytkownik jest zalogowany:
  1. $flags = new Flags($user['options']);
  2. #...
  3. if ($flags->has(Flags::_ONLINE_))
  4. {
  5. # online
  6. }
  7. else
  8. {
  9. # offline
  10. }


Oczywiście klasę Flags trzeba dopasować pod swoje wymagania.
@edit. Zmiana nazw klas na duże.
com
_BAN_ czemu taka konwencja?

I raczej już nazewnictwa plików tak klas się nie stosuje, a klasa z dużej litery.
KsaR
Cytat(com @ 21.02.2016, 18:14:13 ) *
_BAN_ czemu taka konwencja?

I raczej już nazewnictwa plików tak klas się nie stosuje, a klasa z dużej litery.

Przy echo problem był (w edytorze lub w php już nie pamiętam) dlatego na szybko przedrostki dodałem na ewentualność) - co do nazw, dzięki, zaraz pozmieniam tongue.gif
Pyton_000
const: https://github.com/php-fig/fig-standards/bl...md#41-constants
- Klasę Bits dałbym abstract, bo nie ma sensu robienie z niej instancji
- if (NULL !== $bits) - Yoda Conditions? Nie używa się wink.gif
- metoda isset zmienił bym na has

Warto dodać że min. wersja PHP 7.x smile.gif

Poza tym ok, nie ma za bardzo więcej co oceniać bo i nie wiele jest kodu smile.gif
com
problem z czym?
KsaR
Cytat(Pyton_000 @ 21.02.2016, 20:49:18 ) *
const: https://github.com/php-fig/fig-standards/bl...md#41-constants
- Klasę Bits dałbym abstract, bo nie ma sensu robienie z niej instancji
- if (NULL !== $bits) - Yoda Conditions? Nie używa się wink.gif
- metoda isset zmienił bym na has

Warto dodać że min. wersja PHP 7.x smile.gif

Poza tym ok, nie ma za bardzo więcej co oceniać bo i nie wiele jest kodu smile.gif

Co do constant - nie rozumiem, co trzeba zmienić? tongue.gif

Bits było na początku abstract ale na potrzeby forum skasowałem bo myślałem że źle ;p

Yoda Conditions - ... Mikrooptymalizacja, zawsze tak robię, problemów z tym nigdy nie miałem..
Jak doczytałem problemy mogą byc tylko w np. ''=$x; jednak tak nigdy nie robiłem.
Ps. PHP pierw sprawdza typ dlatego pierw typ potem ===.
Nie wiem dlaczego to złe w moim przypadku, jakieś wyjaśnienie?

Co do php7, jest w tytule [PHP7] od samego początku tongue.gif
A klasa mała bo tylko do "wartości dwustanowych"

Zaraz dodam abstract i zmienie isset na has, dzięki wink.gif
--
@com, chyba składnię mi źle podswietlało.
A innej nazwy odchodzącej od echo nie mogłem zastosować bo tak mam w bazie danych,
I w moim czacie (na gg) oznacza to czy ma odsylac wlasna wiadomosc wyslana na czacie czy nie tongue.gif
com
no formę jego zapisu trzeba zmienić.

Cytat
Mikrooptymalizacja

Faktycznie to dużo zmienia wink.gif
KsaR
Cytat(com @ 21.02.2016, 21:02:26 ) *
no formę jego zapisu trzeba zmienić.


Faktycznie to dużo zmienia wink.gif

Ok, zaraz poprawie biggrin.gif mi się zawsze w oczy poprostu rzuca jak jest na odwrót tongue.gif
WordPress też tak ma;;;
com
no to czas na zmiany, nie stosuje się nazw zastrzeżonych, ECHO nie zdziała bo to to samo co echo wink.gif

Nie ucz sie złych praktyk smile.gif

bo Yoda było kiedyś popularne bo ludzie nie rozróżniali = i == tongue.gif
KsaR
Cytat(com @ 21.02.2016, 21:06:25) *
no to czas na zmiany, nie stosuje się nazw zastrzeżonych, ECHO nie zdziała bo to to samo co echo wink.gif

Nie ucz sie złych praktyk smile.gif

A mógłbyś jeszcze objaśnić czemu to złe? Bo nadal nic nie wiem, a do-googlować nic nie mogę.
Cytat(https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/)
Yoda Conditions #
  1. if ( true == $the_force ) {
  2. $victorious = you_will( $be );
  3. }

When doing logical comparisons, always put the variable on the right side, constants or literals on the left.

In the above example, if you omit an equals sign (admit it, it happens even to the most seasoned of us), you?ll get a parse error, because you can?t assign to a constant like true. If the statement were the other way around ( $the_force = true ), the assignment would be perfectly valid, returning 1, causing the if statement to evaluate to true, and you could be chasing that bug for a while.

A little bizarre, it is, to read. Get used to it, you will.

This applies to ==, !=, ===, and !==. Yoda conditions for <, >, <= or >= are significantly more difficult to read and are best avoided.

Edit. No to nie rozróżniali, a coś wiekszego przeciw temu? Tu z wordpressa jak widac tylko do operatorów wiekszosci/mniejszosci się doczepili tongue.gif
com
https://www.ibuildings.nl/blog/2016/01/prog...cing-complexity

Napisałem Ci poco się Yoda stosuje, to jest ominiecie problemów słabych programistów którzy popełniają trywialne błędy, zaciemniając czytelność kodu wink.gif

A wp to nie jest dobrym przykładem niczego smile.gif

A tak wgl to nie do tego był mój komentarz a do nazw stałych w tym co zacytowałeś smile.gif
KsaR
Cytat(com @ 21.02.2016, 21:29:08 ) *
https://www.ibuildings.nl/blog/2016/01/prog...cing-complexity

Napisałem Ci poco się Yoda stosuje, to jest ominiecie problemów słabych programistów którzy popełniają trywialne błędy, zaciemniając czytelność kodu wink.gif

A wp to nie jest dobrym przykładem niczego smile.gif

A tak wgl to nie do tego był mój komentarz a do nazw stałych w tym co zacytowałeś smile.gif

No juz poprawione, ja nigdy nie mialem problemow z = ale znam osoby co zaczynaja z php (aktualnie) i mają tongue.gif ja tak jak pisalem mikro/makro-optymalizacja... Dla mnie tak czytelniej
Gdzieś o tym było na potwierdzenie ale nie chce mi się googlowac - ale bylo ze php pierw sprawdza typ zmiennej (tak jak w ===) i jesli typ jest pierwszy to by jeszcze lepiej, ale skoro zle to zle, więc nie bede uzywal juz biggrin.gif

Co do komentarza to dodalem w odpowiedzi na "problem z czym?"

Jednak oznaczylem "@com" - i tak 2 postow sie nie da pod rzad bo doda do 1 tongue.gif
com
to złego, że trzeba się zastanawiać nad takim kodem, czytamy od lewej do prawej wink.gif a ludzie, którzy pracują z tym strasznym kodem wp, często popełniali błędy bo go się źle czyta, no to ktoś wpadł na pomysł użyjmy yoda to nam się kody wysypie to poprawimy błąd smile.gif
KsaR
To cza by więcej Arabów zatrudnić, hehe biggrin.gif
com
Tobie może się tak lepiej czytać ale ktoś kto odziedziczy kod może już nie być z tego zadowolony, na tym poziomie ta optymalizacja nie ma znaczenia wink.gif a typ sprawdzany jest tylko przy ===, po to się stosuje 3 a nie 2 = wink.gif
lukaskolista
Co do yoda conditions - jest ok, używa się, przykład z najnowszego symfony:
https://github.com/symfony/symfony/blob/mas.../Constraint.php
Pyton_000
@lukaskolista zobacz z którego roku są te commity wink.gif 2014, 2010
com
lukaskolista

Yoda pojawia się w rożnych miejscach, ale nie znaczy, że to jest zalecana praktyka.

https://github.com/zendframework/zend-diact...tTrait.php#L110 tu tez ja znajdziesz, ale to jest kwestia przyzwyczajenia konkretnego programisty który to stworzył, nie dobrych praktyk wink.gif
lukaskolista
https://github.com/symfony/symfony/blob/mas...Yaml/Inline.php - commit sprzed 5 godzin.

Dodatkowo w żadnym PSR nic o tym nie ma, jakoś też w google nic nie mogę znaleźć na temat tego, żeby była to dobra czy zła praktyka.
com
co z tego ze commit 5 h temu, kod się utrzymuje latami przecież, dałem linka do strony gdzie jest napisane na bazie książek uncle boba smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2018 Invision Power Services, Inc.