PHPで長い文字列を扱う方法色々

PHPでHTMLやSQLを書く際に、
一行で書いちゃうととても見づらいので改行したり色々すると思います。

今回はそんなときの書き方をいろいろまとめてみました。

:warning: **テストコードの検証と、速度の検証はまだしていません。**
:warning: **phpのバージョンによっても速度等に差異が出ます。**
:warning: **宗教戦争になります。たのしい読み物ぐらいの感覚でご覧ください。**

## 文字列結合

+ 最もよく見かける書き方だと思う。
+ お手軽簡単、途中で条件分岐とかも挟みやすい。
+ ただし、結合毎の処理とメモリ確保を行うため高速ではない。

```php5
<?php
$break = '<br/>';

$str = '私は事実毫もこうした記憶物について事のためでありでしょなけれ。'
      .'はなはだほかを赴任めももちろん'
      .'そんな沙汰ありでかもを落ちが来るなをはふり思っうなかって、'
      .'しっかりにはいうないましうなけれ。'
      ."人々に籠っですのももう今日にやはりたでます。{$break}";

echo $str;
```

## [ヒアドキュメント](https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc)

+ これもよく見かける~~perlちほーのフレンズ~~書き方。
+ 複数行にまたがる文を書く場合はコピペも出来て非常に便利。
+ だいたいの場合、結合をするよりは早い。
+ ダブルクォート囲みと同様に文字列置換を行うため、シングルクォート囲みではない点で、速度が劣ることもある。
   + ```__LONG_STRRING__``` の部分をシングルクォート囲みにするとナウいドックとして、シングルクォート囲みと同じ評価で文字列中の変数の展開しない。※[nowdoc 構文 (PHP 5.3.0 以降)](https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.nowdoc)
+ 「ヒアドキュメント」という名前はよく忘れられる。
+ 閉じる部分（下記例では```__LONG_STRRING__```）の前にスペースとかが入るとエラーになる。<br/>~~やや初心者が使用したら原因不明のエラーになって、死んだ目をしてデバッグし続けていることがある。たすけてあげよう。~~
   + これはPHP7.3で改善されるらしい！<br/>[PHP RFC: Flexible Heredoc and Nowdoc Syntaxes](https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes)

```php5
<?php
$break = '<br/>';

// __LONG_STRRING__は任意の文字列。__HTML__とか__SQL__等でも良い。
$str =<<<__LONG_STRRING__
私は事実毫もこうした記憶物について事のためでありでしょなけれ。{$break}
はなはだほかを赴任めももちろん{$break}
そんな沙汰ありでかもを落ちが来るなをはふり思っうなかって、{$break}
しっかりにはいうないましうなけれ。{$break}
人々に籠っですのももう今日にやはりたでます。{$break}
__LONG_STRRING__;

echo $str;
```

## PHPコード混在

+ ~~俺がWordpressだ~~これもよく見かける書き方。
+ 何らかのテンプレートエンジン([Smarty](https://www.smarty.net/)等)より早く、一方で見づらい。
+ 途中にif()やfor()なんかがあった場合は特に見づらい。~~多重入れ子だったりしたらプルリク時に顔文字付きのコメントが付いたりする。~~
+ 基本的に最速だが、何度もechoを挟んだりすると誤差程度に遅いこともある。
+ 内容を文字列に代入したりには後述のob_start()とかと組み合わせる。

```php5
<?php
$break = '<br/>';
?>
私は事実毫もこうした記憶物について事のためでありでしょなけれ。<?php echo $break; ?>
はなはだほかを赴任めももちろん<?php echo $break; ?>
そんな沙汰ありでかもを落ちが来るなをはふり思っうなかって、<?php echo $break; ?>
しっかりにはいうないましうなけれ。<?php echo $break; ?>
人々に籠っですのももう今日にやはりたでます。<?php echo $break; ?>
```

## 出力バッファ

[ob_start()](http://php.net/manual/ja/function.ob-start.php)
>(PHP 4, PHP 5, PHP 7)
>ob_start — 出力のバッファリングを有効にする
>**警告**
>web サーバーによっては (例: Apache)、コールバック関数からコールされた際に、スクリプトの実行ディレクトリを変更するものがあります。コールバック関数の内部で chdir(dirname($_SERVER['SCRIPT_FILENAME'])) などと指定することで、これをもとに戻すことが可能です。

+ 本来は名前の通り、文字列出力を制御するための関数群。
+ メモリを確保するクセが特殊。ほぼ高速だが、条件次第。
+ 使っている人は、大体phpの仕様をよく知っている~~変態~~人。
+ 表示に使う場合、そのままob_flush()も出来る。
+ チマチマ出力するとgzip転送との兼ね合いで「早く見えるけど実は遅い」が起きることがある。
+ echoを複数書かずにカンマ区切りにしていたら本当の**変態**。
+ ob_start()～ob_end()で囲まれていることに気付かないことがある。
+ 途中でうっかりreturn()とかされた日には~~お漏らしして死ぬ~~ob_start()を閉じていない警告が出たり、他の文字列処理を巻き込んで表示して大事故になる。
+ var_dump()とか警告とかも吸い取るため、色々な使い方ができる。

```php5
<?php
ob_start();

$break = '<br/>';

echo '私は事実毫もこうした記憶物について事のためでありでしょなけれ。',
     'はなはだほかを赴任めももちろん',
     'そんな沙汰ありでかもを落ちが来るなをはふり思っうなかって、', $break;

echo 'しっかりにはいうないましうなけれ。',
     "人々に籠っですのももう今日にやはりたでます。{$break}";

$str = ob_get_clean(); // サンプルコードなので一度文字列に代入します。

echo $str;
```

## 配列結合

[implode (string $glue, array $pieces)](http://php.net/manual/ja/function.implode.php)
>(PHP 4, PHP 5, PHP 7)
>implode — 配列要素を文字列により連結する

+ 使っている人は、大体phpの仕様をよく知っている~~変態~~人。
+ 配列作成時にいっきにメモリを確保する書き方をすれば高速。
+ 途中で条件分岐書いたりは苦手。
+ 配列結合とかを行うとメモリを食うし、遅くなることもある。

```php5
<?php
$break = '<br/>';

$arr = [
    '私は事実毫もこうした記憶物について事のためでありでしょなけれ。',
    'はなはだほかを赴任めももちろん',
    'そんな沙汰ありでかもを落ちが来るなをはふり思っうなかって、',
    'しっかりにはいうないましうなけれ。',
    "人々に籠っですのももう今日にやはりたでます。{$break}",
];

$str = implode('', $arr);

echo $str;
```

# 出典等

ダミーテキストの生成には下記のサイトを利用させていただきました。

+ [すぐ使えるダミーテキスト](http://lipsum.sugutsukaeru.jp)様 - 夏目漱石 氏「私の個人主義」 [原文(青空文庫様)](http://www.aozora.gr.jp/cards/000148/card772.html)