注意 - 皮肉的な記事です. いくつか使っていて, 辛いところを記述するので, ネタみたいな記事です.
配列周り
PHPには, 配列がありまして, $foo = [1, 2, 3]とかです. 前までは$foo = array(1, 2, 3)でした.
そんな配列なのですが, JavaScriptとかRubyとかと違って, arrayであって, array objectではないわけです. そんなわけで, 配列の操作がしたければ, array_*()を使うわけです. array_push()に関しては, $array[] = $valでできます.
そんなPHPの配列で面白いところは, array_map()です. array_push($array, $val_1), array_filter($array, $callback), array_reduce($array, $callback)など, 第1引数に配列を持ちます. しかし, array_map()はarray_map($callback, $array)と順番が逆なのです. これが辛い. 統一していて欲しい.
PHPの配列が辛い人は, Illuminate\Support\Collectionを使ってオブジェクトにすればいいと思うので, composer install illuminate/supportしましょう.
オブジェクトのコピー
PHPのオブジェクトを別の変数に渡す時, cloneを利用します.
<?php
class Sample {
public $count = 0;
}
$foo = new Sample();
$bar = clone $foo;
$bar->count++;
var_dump($foo->count); // int(0)
var_dump($bar->count); // int(1)
もしもcloneを使用しないと, 思わぬ副作用を生み出します.
<?php
class Sample {
public $count = 0;
}
$foo = new Sample();
$bar = $foo;
$bar->count++;
var_dump($foo->count); // int(1)
var_dump($bar->count); // int(1)
$foo->countも書き換わってしまうんですね. そんなcloneですが, クローンが作成される際に呼ばれるマジックメソッド__clone()というものがあります. これは作成された新たなオブジェクトで呼ばれます.
<?php
class Sample {
public $count = 0;
public function __clone() {
$this->count++;
}
}
$foo = new Sample();
$bar = clone $foo;
var_dump($foo->count); // int(0)
var_dump($bar->count); // int(1)
これにより, 遺伝子操作されたクローンを作ることができます. 使う機会があるかはわかりませんが.
ついでに
homebrewでのPHPのインストール方法が変わりました. いままではbrew install php72だったのですが, これからは, brew install php@7.2という形になります. あと, xdebugがインストールされていないようなので, 調べたらpeclを使ってとあったので, pecl install xdebugをしましょう. 詳しくは GitHubのIssueで https://github.com/Homebrew/homebrew-php/issues/4721