仕事で見かけた見かけたくなかったPHPのコード達

PHPで仕事をしていると色々変なコードを見かける事があるので適当にまとめてみた。

## タブ幅が自由

どういうエディタの設定になっているのだろうか。

```php
  function doSomethig($some, $thing) {
     $testa = 1;
     $testb = 2;
        if ($some) {
          callSomething();
          return $thing;
       }
      $thing .= "a";
      return $thing;
    }
```

## ネストがすごい

前述のタブ幅の現象が合わさると、ネストしてもあんまり深くないと感じるらしく永久にネストされる。

```php
  function deepFunc() {
    if ($this->data) {
      while($user = $this->getNextUser()) {
        if ($user['good']) {
          foreach ($user['rows'] as $row) {
            foreach ($row['children'] as $child) {
              if ($child['good']) {
                if ($user['category'] == $child['category']) {
                  $user['bad'] = true;
                }
              }
            }
          }
        }
      }
    } else {
      anotherMoreDeepFunc();
    }
  }
```

（実際はもっと横にも縦にも長いしついでに配列もネストしてるので非常に長い）

## 一つのファイルが2000行超えている

エディタが重い

## メソッドにフラグをいっぱいつける

しかも重要な引数が一番後ろだったりする

```php
function getData($category, $date, $good_only = false, $gabt = false, $simple = false, $importantValue = null)
```

## メソッド名の規則がよく分からない

```php
function get_mostNiceValue() {
}
```

## 空行がいっぱいある

```php
class MyClass
{
    function myMethod() {
        $a = $this->test();
        return $this->func($a);




    }




}
```

## 分かりやすい変数名より慣れ親しんだ変数名だけ使う

```php:分かりやすい
$users = User::getAll();

foreach ($users as $user) {
    $items = $user->getItems();

    foreach ($items as $item) {
        $item->doSomething();
    }
}
```

```php:分かりにくい
$data = User::getAll();

foreach ($data as $key => $value) {
    $data2 = $value->getName();

    foreach ($data2 as $key2 => $value2) {
        $value2->noOneKnowWhatWillHappen();
    }
}
```

## テンプレートには絶対に決まった変数の入れ物だけ渡す

```php:コントローラ側
$dataForView = [];
$dataForView['users'] = $this->Users->find('all');
$dataForView['page'] = $page;
$this->set('dataForView', $dataForView);
```
```php:テンプレート側
<?php foreach ($dataForView['users'] as $user): ?>
```

## フレームワークのQuery Builderの理解を諦める

```php:Laravel
$products = Product::where('category_id', $categoryId)
    ->where('closed', false)
    ->whereBetween('votes', [1, 100])
    ->where(function ($query) {
        $query->where('flag1', true)
            ->orWhere('flag2', true);
    })
    ->get();
```

と書けばいいところを

```php:自由なLaravel
if ($query) {
    $query .= " and ";
}
if ($categoryId) {
    $query .= " category_id = {$categoryId}";
}
if ($query) {
    $query .= " and ";
}
$query .= " closed = 0"
$query .= " and votes between 1 and 100";
$query .= " and (flag1 = 1 or flag2 = 1)";
$products = Product::whereRaw($query)->get();
```

## 複雑な処理は全部SQLでやってPHP側をシンプルにする

```php:php側
$sql = "select id as a0, concat(last_name, first_name) as a1, ";
$sql .= " (select count(*) from items where user_id = users.id) as a2, ";
$sql .= " if(flag1 > flag2, data1, data2) as a3, ";
$sql .= "...他にもwhenとかたくさん使う。何をやっているかもう誰にも分からない"
$rows = $db->get($sql);
```

じゃじゃーん！

```php:テンプレート側
<?php foreach ($rows as $row): ?>
<td><?= $row['a0'] ?></td>
<td><?= $row['a1'] ?></td>
<td><?= $row['a2'] ?></td>
<td><?= $row['a3'] ?></td>
<td><?= $row['a4'] ?></td>
<td><?= $row['a5'] ?></td>
<?php endforeach ?>
```

## なんかJOINするとうまくいかなかったらしく全部selectする

```php
$select = 'SELECT users.id,';
$select .= 'users.name,';
$select .= 'users.email,';
$select .= 'users.pref,';
$select .= 'users.city,';
$select .= 'users.address,';
$select .= 'users.building,';
$select .= 'users.tel,';
$select .= 'users.fax,';
$select .= 'users.country,';
// ...以降usersのカラム全部列挙
$select .= 'groups.name as group_name,';
$select .= 'groups.email as group_email,';
$select .= 'groups.flag1,';
$select .= 'groups.flag2,';
$select .= 'groups.flag3,';
// ...以降groupsのカラム全部列挙
// ...以降JOINしている全てのテーブルのカラム全部列挙。１画面では収まらない。
```

* 汎用メソッドなので当然全部列挙
* もちろんモデルのリレーション設定は一切されていない。

## フレームワークは使わない

* 後続の人は全員フルスクラッチしなければならない
* フレームワークが分かる人は来てくれなくなる＝フレームワーク分からないレベルの人しか集まらなくなる負のループが訪れる。

## 自作のフレームワークを使う

まさかの5〜10年後くらいに修正依頼が来て、使っていたことすらも忘れていたのでかなりびっくりする。
ちなみにこれは最近の筆者体験談。PHP4のころのフレームワーク。

そしてあの頃は自作フレームワークが乱立していたので、いくつかの案件でやむなく使うことになったフレームワーク達を作った業者を興味本位で検索して生存しているかを確認したりする事になる。