1. PHP / Говнокод #27634

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    switch ($group) {
            case 'Root':
                break;
            case 'Admin':
                break;
            case 'Accountant':
                break;
            case 'Manager':
                break;
            }
    
    return $group;

    Вот так можно проверить что ничего не надо делать

    Запостил: zoorg, 01 Сентября 2021

    Комментарии (10) RSS

    • $group может быть экземпляром класса с магическим методом __toString, производящим побочные эффекты.
      Ответить
    • А теперь я вам покажу немного уличной магии:
      <?php
      
      function kukarek($group) {
          switch ($group) {
              case 'Root':
                  break;
              case 'Admin':
                  break;
              case 'Accountant':
                  break;
              case 'Manager':
                  break;
              }
      
          return $group;
      }
      
      class Pituh {
          public $count = 0;
          private $name;
          public function __construct($initial) {
              $this->name = $initial;
          }
          public function __toString() {
              ++$this->count;
              return $this->name;
          }
      }
      
      $group = new Pituh('Admin');
      
      kukarek($group);
      
      echo "Меня посчитали $group->count раз(а).\n";


      https://ideone.com/TbzIwf

      В принципе, можно было ещё склонялку слов добавить, но для демонстрации пойдёт.

      Именно поэтому «PHP» — рахат-лукум моей души.
      Ответить
      • Менеджера посчитали больше. Он важнее.
        https://ideone.com/LvQsJQ

        Туштринг на каждом кейсе без кэширования? Какой багор )))
        Ответить
        • Напесал класс, который уворачивается от сравнения:
          https://ideone.com/bfYN4z
          Ответить
          • Какой скилл )))
            Ответить
            • <?php
              
              class SchrodingersPituh {
                  public $count = 0;
                  public function __construct() {
                  }
                  public function __toString() {
                  	$this->count ^= 1;
                  	return $this->count ? '' : '1';
                  }
              }
              
              function kukarek($pituh) {
              	if (!"$pituh") {
              		echo "Ne pituh\n";
              	}
              	if ("$pituh") {
              		echo "Pituh\n";
              	}
              }
              
              kukarek(new SchrodingersPituh());


              https://ideone.com/FsmdvI
              Ответить
        • Угу. «PHP» не знает, с чем будут сравнивать значение, поэтому на каждом кейсе производит преобразование типов индивидуально. Хотя и так ясно, что в ветках «case» будут либо строки, либо числа, либо булины, а сравнение объектов с последними (в смысле с числами и с булинами) можно произвести только через «туштринг», так что результат вызова «туштринг» можно было бы и закэшировать.

          Хорошо хоть, что выражение из заголовка switch() вычисляется один раз.

          Именно поэтому «PHP» — щербет моего сердца.
          Ответить
        • А в «JavaScript» похоже, что switch...case производит строгое сравнение (через «===», а не через «==»), поэтому toString() не вызывается:
          https://ideone.com/NET1vN
          Ответить
      • > склонялку слов добавить
        odin raz, odip rba, odiq rbe, odir rbi, odis rbo, odit rbu, odiv rca, odiw rce, odix rci, odiy rco, odiz rcu, odob rda, odoc rde, odod rdi, odof rdo, odog rdu, odoh reb, odoj rec, odok red
        Ответить
    • проверяю отпраку коментов в говнокодах :)
      Ответить

    Добавить комментарий