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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    <?if (strlen($prod['img'])>0):?>						
    	<img src="<?=URL::site()?>resize/resizer.php?type=photos&width=260&height=210&method=crop&image=<?=$prod['img']?>"/></a>						
    <?else:?>
    	<img src="<?=URL::site()?>resize/resizer.php?type=catalog&width=260&height=210&method=crop&image=nophoto.jpg"/></a>
    <?endif?>

    Вы ещё не знаете, как использовать ООП для генерации URL? Тогда мы идём к вам!

    Запостил: UncaughtException, 07 Октября 2015

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

    • Где тут ООП, UncaughtException?
      Ответить
      • Среди пыхомакак бытует поверье, что если перед говнофункцией написать "public static", то код автоматически становится объектно-ориентированным.
        Ответить
      • URL::site()
        Ответить
        • URL:: — это не объект, а в некотором роде... пространство имён. ООП тут и не пахнет.

          Для тру-ООП нужно:
          1. Собирать ссылку с помощью http-build-query, передавая ей объект, публичные поля которого содержат type, width, height, method, image.

          См.: http://php.net/manual/ru/function.http-build-query.php

          2. Вместо явного ветвления внутри функции вызывать метод одного из двух классов, унаследованных от одного абстрактного или реализующих один интерфейс. Метод первого класса должен передавать type=photos и заданный image, а метод второго — type=catalog и image=nophoto.jpg.

          3. С учётом первого пункта даже два класса не понадобятся: всё можно инициализировать уже в конструкторе.

          Кажется, я учу чему-то плохому...
          Ответить
          • Вы вдохновили меня вернуться к "проекту" в котором встретилось сиё творение и реализовать столь божественный замысел. Да прибудет с вами ООП. Аминь.
            Ответить
          • А ведь можно сделать threaded code, как в форте, на виртуальных методах! И вообще не пользоваться устаревшими ифами и форами...
            Ответить
            • > И вообще не пользоваться устаревшими ифами и форами
              Так вроде в smalltalk ифов и форов как таковых нет - ветвление делается через посыл объекту boolean двух лямбд: ifFalse и ifTrue, и объект по своему стейту понимает, что вызвать
              aBoolean
              	ifTrue: [someCode]
              	ifFalse: [otherCode]
              А for - через внутренний итератор
              1 to: 20 do: [:x | x printNl ]
              Ответить
            • Шитый код и без ООП можно сделать:
              $methodTable = array(
                false => function($image) {return array ('type' => 'photos', 'image' => $image); },
                true => function($image) {return array ('type' => 'catalog', 'image' => 'nophoto.jpg'); }
              );
              
              $properties = $methodTable[strlen($prod['img'])>0]($prod['img']);
              Ответить
              • патерн матчинг прям.
                Ответить
                • А теперь немного чОрной магии:
                  <?php
                  class AbstractPhoto {
                    public $width = 260;
                    public $height = 210;
                    public $method = 'crop';
                    public $type = 'unknown';
                    public $image = 'nophoto.jpg';
                    public function __construct($image) {
                      $this->type = strtolower(get_class($this));
                    }
                  }
                  
                  class Photos extends AbstractPhoto {
                    public function __construct($image) {
                      parent::__construct($image);
                      $this->image = $image;
                    }
                  }
                  
                  class Catalog extends AbstractPhoto {
                  }
                  
                  class PseudoArray implements ArrayAccess  {
                    private $classTable = array (false => 'Photos', true => 'Catalog');
                    public function offsetGet ($offset) {
                      $class = $this->classTable[strlen($offset)>0];
                      return new $class($offset);
                    }
                    public function offsetExists ($offset) {return true;}
                    public function offsetSet ($offset, $value) {}
                    public function offsetUnset ($offset) {}
                   }
                  
                  
                  $properties = new PseudoArray();
                  
                  var_dump($properties['']);
                  
                  var_dump($properties['ololo.jpg']);


                  http://ideone.com/1P60V1
                  Ответить
    • Эм, разве это говно не выдаст два < img>?
      Ответить
      • С чего ты взял? http://ideone.com/nhfZ2x
        Ответить
        • Пардон, не знал про "if (a):".
          Ответить
          • Это альтернативная форма синтаксиса с эндифами и эндфорами, почти как в Бейсике: http://php.net/manual/ru/control-structures.alternative-syntax.php

            Очень редко используется, однако, есть любители пихать её в пыхошаблоны, чтобы фигурные скобки глаза не мозолили либо потому что endif заметнее, чем скобка.
            Ответить

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