PHP

【PHP】配列の空文字キーに関する発見。

とかの時

ってやると

こうなるんだね、初めて知った。

【CakePHP3】Bakeの流れ。

  • まずDBにテーブルを作成する。 ※例えばusersテーブルを作成する。

  • んで次のコマンドを実行。

これでCRUD機能の完成。

【PHP】で画像を綺麗にリサイズする。

PHPで画像周りの操作をする際はよくGDエクステンションを用いるが、GDの基本リサイズ関数であるimagecopyresized()は縮小した際のジャギがひどく全くもって使い物にならない。 一応フィルタでスムージングもしくはガウシアンぼかしを適用できるが、やるだけ無駄。 そして多少結果がマシになるimagecopyresampled()という関数も用意されているがこれもゴミ。~~ホントゴミ~~。

ということでこれからはPHPで画像の操作をする場合はImageMagickを用いよう。(強制)

Imagickとは

ようはGDより高性能で使いやすいいわゆる神エクステンション。100種類を超す形式の画像読み込みや変換に対応しており、WEBで扱うであろうファイル形式は当然いける。詳細は下記リンク。

http://php.net/manual/ja/book.imagick.php

インストール手順

yumを使おう。

  • とりあえずインストールされているPHPのバージョンを確認。

http://i.gyazo.com/029e75b8904c5e9616af581e28896157.png

  • 今回はremiのPHP5.6を導入。

http://i.gyazo.com/0e209e57a0bf0087515b150764d1ff1e.png

  • php56-php-pecl-imagick-devel.x86_64をインストールする。

※ココから先は環境に依存する(?)場合あり。

ImagickをPHPから読み込む。

  • 先ほどのyum操作でインストールされ、生成されたimagick.soをPHPのインクルードディレクトリにコピーしてやる。 ※自分の場合は下記の感じ。
  • 次にphp.dディレクトリにiniファイルを作成。
  • 下記のように記述。
  • そしたらhttpdを再起動

  • phpinfo()にて下記のように表示されていればインストール成功。

http://i.gyazo.com/1c5a35da23a9e58293ab8a7c6c53400b.png

使ってみる。

とりあえず当初からやりたかった画像のきれいなリサイズと切り抜きをやってみた。 今回は元画像の縦長、横長にかかわらず正方形になるようトリミングし、指定のサイズに縮小する処理を行いたかったのでそれをやる。

これだけ。イヤほんと簡単。しかもめちゃくちゃキレイ。かなり最適化されてる。 ジャギが全く無いしGDはでスムージングを行なった処理と比較しても格が違う。そもそもの画像処理アルゴリズムが違うんだろうけど、GDがどれだけクソかわかる。

しかもサムネイル作成用の関数が用意されていて長さ指定するだけで中央から綺麗にトリミングしてくれるという至れり尽くせりっぷり。画像のフォーマット別に読み込み関数が分かれていない点も最高に使いやすいし、今後画像処理はImagickで行うことを確信した。

【PHP】privateなメソッドを外部から実行する。

PHP5.4から実装されたClosure::bind()を用いる。

たとえば下記のようなコード。

当然Fatal error: Call to private method hello::world() from contextと怒られる。

しかしClosure::bind()を次のように用いると。

なんと画面にhello Worldが表示される。

第1引数に渡した関数内の処理は、第3引数に渡した名前のクラス内で実行されているものとして扱われるため、正常に関数を呼び出すことができている。 そう、Closure::bind()無名関数に限り実行時コンテキストを動的に変更できるというチート機能を有しているのである。

これを応用すると、PHPUnitでのテストケースにおいてもprivateな関数をテストすることができるようになるため、非常に強力な機能の一つであると言える。

【PHP】Xdebugのvar_dump()を通常のものに戻す。

Xdebugがインストールされている環境でvar_dump()を使用すると、なんだか無駄にごちゃごちゃしてて挙句の果てにはmore elementsとかいう世紀末な状態になっていたので戻す方法をメモ。

php.iniに下記を追記。

これでサーバーを再起動すればOK。

発狂せずに済んだね。

【PHP】のコンパイル時にライブラリが足りないよと怒られたら。

だいたいは怒られているパッケージ名に-develがついたパッケージをyumでいれてやれば解決する。
指摘されているパッケージそのものをinstallとかreinstallとかしても一向に解決しないので注意。

【PHP】「Fatal error Unsupported operand types in」エラー。

変数の型が違う物同士を演算しようとすると出る。

【PHP】PHP5.6でdie();を連続して記述するとサーバーからのレスポンスが帰ってこない。

なんで?

これは帰ってくる。というか普通にダンプ内容が表示される。

これはデータを受信していません、になる。 Chromeで言うとエラーコードERR_EMPTY_RESPONSEになる。

仕様なのか、、、??

追記:

die();の問題じゃないっぽい。
どうやらクラス内定数周りが絡むとこうなることが多い気がする。

要調査。