PHPがよくわからない時に助けになりたいリンク集

# 規約
- [標準コーディング規約 - Qiita](https://qiita.com/katsukii/items/e68183f14407722de9cc)
- [予約語の一覧 - PHPマニュアル](http://php.net/manual/ja/reserved.php)

# コメントアウト
```php
// PHPの1行コメントアウト

/**
 * PHPの複数行コメントアウト
 */

{{-- Bladeのコメントアウト:このコメントはレンダー後のHTMLには現れない --}}
```
# インストール
- [Windows10にPHPをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/b9d23f319437cad5c1e9)
- [phpが32bitか64bitか確認する方法 - それマグで！](https://takuya-1st.hatenablog.jp/entry/20110807/1312731737)
- Apacheに設定する
    - [Apacheのhttpd.confにPHPを設定する方法 - Qiita](https://qiita.com/ponsuke0531/items/e27c3dafcc9741ef3e73)

# WordPressを使いたい
[WordPressが初めてでさっぱりわからないときに見たいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/f55096ae7d25e97057bf)

# `php.ini` はどこ？
```bash
# Webサーバが訳あって起動しないのでphpinfo();ができない場合
$ php --ini | grep php.ini
Configuration File (php.ini) Path: /etc
```
- [php.iniの探し方 - tweeeetyのぶろぐ的めも](http://tweeeety.hateblo.jp/entry/20121218/1355802787)
- [Sublime Textでphp.iniを開くコマンドを作ってみた - Qiita](https://qiita.com/ponsuke0531/items/2aab86653defee9ffe87)

# 配列を使いたい
[配列を使いたい時に見たいリンク集](https://qiita.com/ponsuke0531/items/cfa2a681417958c27c84)

# ターミナル上で実行したい
```bash
$ php -a
Interactive shell

php > $obj = new stdClass();
php > var_dump($obj);
object(stdClass)#1 (0) {
}
php > 
```
- [ターミナルからPHPを使うと何かと便利 - ふってもハレても](http://d.hatena.ne.jp/sho-yamasaki/20111116/1321459763)
- [PHPでコマンドライン実行時のパラメータ - Qiita](https://qiita.com/aic0o/items/91ca1ddc1fc6e025286f)

# 文字列
```php:文字が数字であるかどうかを調べる
ctype_digit(string $text) : bool
/** 利用イメージ. */
$moji = '2';
if(!is_null($moji) && ctype_digit($moji)) {
    // 文字が数字だったら数値型へ変換.
    $suji = intval($moji);
    // $sujiを処理する...
}
```

- [複数文字列の置換 - Qiita](https://qiita.com/kazu56/items/35c10fdd79393686b26d)
- [特定の文字列を含むかのチェック - Qiita](https://qiita.com/kazu56/items/2c72d187438de07c2503)
- [strpos — 文字列内の部分文字列が最初に現れる場所を見つける(高速でメモリ消費も少ない )](http://php.net/manual/ja/function.strpos.php)
- [strstr — 文字列が最初に現れる位置を見つける(大文字小文字を区別する)](http://php.net/manual/ja/function.strstr.php)
- [ctype_digit — 数字かどうかを調べる](https://www.php.net/manual/ja/function.ctype-digit.php)

## 結合したい
```php
$str1 = 'ponsuke';
$str2 = 'tarou';
// echoするだけなら連結しないでよくて超はやい
echo $str1, $str2
// 文字列内で結合 : 結合演算子より早い
$ketsugou = "{$str1}{$str2}"
// 結合演算子
$ketsugou = $str1 . $str2;
// 結合代入演算子
$ketsugou = $str1;
$ketsugou .= $str2;
```

- [文字列演算子](http://php.net/manual/ja/language.operators.string.php)
- [文字列連結どれが速い？ - PHP Note](http://www.sound-uz.jp/php/note/firstJoin)

## 比較したい
```php:比較したい
// 緩やかな比較「==」: str1=1; str2='1str';だと同じ で str1='1STR'; str2='1str';だと違う
// switch/caseはこの緩やかな比較をつかう
str1 == str2;
// 大文字小文字区別なし「strcasecmp」: str1=(string)1; str2='1str';だと違う で str1='1STR'; str2='1str';だと同じ
strcasecmp(str1, str2);
// ちゃんと「strcmp」: str1=(string)1; str2='1str';だと違う で str1='1STR'; str2='1str';だと違う
strcmp(str1, str2);
// 厳密な比較「===」: str1=1; str2='1str';だと違う で str1='1STR'; str2='1str';だと違う
str1 === str2;
```

## 文字を`"`と`'`で囲ったときの違い
```php
$hensu = 1;
// ダブルクォーテーション : 変数を変数値に置換する
var_dump("$hensu"); // 出力: PHP Notice:  Undefined variable: hensu in ....
var_dump("{$hensu}"); // 出力: 1
// シングルクォーテーション : 数を変数値に置換しない(処理が速い)
var_dump('$hensu'); // 出力: $hensu
```

- [ダブルクォーテーション、シングルクォーテーションの違い](http://www.24w.jp/study_contents.php?bid=php&iid=php&sid=string&cid=006)
- [文字列リテラルに式展開 - Qiita](https://qiita.com/tadsan/items/e4796449c736cfb5c9bd)

## isNullOrEmpty()的な
```php
1. is_null($str) || $str == ''
2. strlen($val) == 0
// スペースも許容したくない場合
3. strlen(trim($str)) == 0
// 「0」も「"0"」も「FALSE」も「空の配列」も許容したくない場合
4. is_null($str) || empty($str)
```

- [php string isnullorempty - [hello world 動かない　][検索]](http://shim0111.hatenablog.com/entry/2015/05/30/205406)

# 引数
```php
// 値渡し
function method($arg) {}
// 参照渡し
function method(&$arg) {}
// デフォルト引数値
function method($arg = 'pon') {}
// デフォルト引数値 && Null許容(引数を指定しなくてもエラーにならない)
function method($arg = null) {}
// 型宣言
function method(array $arg) {}
// 型宣言 && Null許容(引数にnullでもいいから指定しないとType error: Too few arguments to functionでエラーになる)
function method(?array $arg) {}

/* おまけ */
// Null許容の返り血(PHP7.1以降)
function method(?array $arg): ?array {}
```

- [関数の引数 - PHPマニュアル](http://php.net/manual/ja/functions.arguments.php#functions.arguments)
- [nullable な型 - PHPマニュアル](http://php.net/manual/ja/migration71.new-features.php#migration71.new-features.nullable-types)
- [NULL 許容型の宣言方法 - Qiita](https://qiita.com/ymm1x/items/e53ded283080ca3a42b4)
- [引数の二種類の NULL 許容型の宣言方法とその違い - Qiita](https://qiita.com/ymm1x/items/e53ded283080ca3a42b4)

# 関数にNULLを渡したらどうなるか知りたい
```php
// TypeError: trim() expects parameter 1 to be string, null given in xxx
$trimed = trim(null);
// TypeError : array_search() expects parameter 2 to be array, null given
$key = array_search('hoge', null);
// Type error: substr() expects parameter 1 to be string, null given
$parts = substr(null, 0, 6);
// ErrorException : count(): Parameter must be an array or an object that implements Countable
$count = count(null);
// ArgumentCountError : Too few arguments to function
foreach (null as $key => $value) {}

/** エラーにはならない系 **/
$a = strval(null); // $a = ""
```

# GetterとSetter
- [GetterとSetterを書きたい - Qiita](https://qiita.com/ponsuke0531/items/049bac05cb0b99b1ea40)

# 型変換したい
```php
# intにしたい
$i = (int)$a;
$i = (int)null; // $i = 0
$i = intval($a);
$i = intval(null); // $i = 0
# stringにしたい
$s = (string)$i;
$s = strval($i);
```

- [intval - PHPマニュアル](http://php.net/manual/ja/function.intval.php)

# PHPUnitでテストしたい
- [HomebrewでPHPUnitをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/365b9463cd381585a9a3)
- [MacのPhpStormでLaravelプロジェクトでPHPUnitをできるようにする記録 - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2019/05/08/000618)
- [PHPUnitを使えるようにする。 - Qiita](https://qiita.com/ponsuke0531/items/f17a6a1b10497e8ab97f)
- [protected,privateのメソッド、プロパティのテスト - Qiita](https://qiita.com/nao_tuboyaki/items/eb4bab18339c63f27ee8)
- [アサーション &mdash; PHPUnit latest Manual](https://phpunit.readthedocs.io/ja/latest/assertions.html)
- [引数が参照渡しの関数をテストする方法 - takafumi blog](http://takafumi-s.hatenablog.com/entry/2015/05/23/102122)
- [PECLでXdebugをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/036378e5f460984e20a5)

## 困った！
- [Maximum function nesting level of 'xxx' reached, aborting! - Qiita](https://qiita.com/ponsuke0531/items/4cdce2ad1a60ecad0f37)
- `'PHPUnit_Framework_TestCase' not found`
    - [PHPUnit_Framework_TestCaseはPHPUnit\Framework\TestCaseになった](https://tomomik.hatenablog.com/entry/2017/03/12/074003)
- `Error : Class 'xxxxx\ReflectionClass not found'`
    - [名前空間を定義した場合、グローバルな関数やクラスは先頭に「\」をつけ、グローバルな名前空間から参照する - Qiita](https://qiita.com/hththt/items/591743c9692138936981)

```php
NG : $reflection = new ReflectionClass(テスト対象クラス);
OK : $reflection = new \ReflectionClass(テスト対象クラス);
```

- `ReflectionException: Class config does not exist`
    - [dump-autoloadする - Qiita](https://qiita.com/ryokurosu/items/545b32efa0d16b39ff8a)
    - [.envにスペースが入っている値をダブルクオーテーションで囲う - Qiia](https://qiita.com/shalman/items/f5ed672c39ccd2f959cb)
- `This test did not perform any assertions`
    - [PHPUnitのdataProviderを使ったらrisky testになった話 - 水飴信号](https://sssignal.com/column/phpunit_risky_dataProvider)

# Laravelを使いたい
- [キャッシュクリア系コマンド - Qiita](https://qiita.com/Ping/items/10ada8d069e13d729701)
- [Laravelのプロジェクトを作ってみる。 - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2019/02/19/234611)
- [config情報を取得する方法｜株式会社Nextat](https://nextat.co.jp/staff/archives/122)

## Composerを使いたい
```bash
# インストール済みのパッケージ一覧
$ composer show
cache/adapter-common                  1.0.0   Common classes for PSR-6 ada...
cache/apcu-adapter                    1.0.0   A PSR-6 cache implementation...
...

# composer.json のクラスマップand名前空間の割り当てマップの変更を autoloader.php に反映させる
$ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: hisorange/browser-detect
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Discovered Package: maatwebsite/excel
Discovered Package: yajra/laravel-oci8
Discovered Package: ytake/laravel-aspect
Package manifest generated successfully.
```

- [逆引き！Composer コマンド・ライン一覧 - Qiita](https://qiita.com/KEINOS/items/86a16b06af6e936a1841#%E7%A2%BA%E8%AA%8D%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)

## 困った！

- [No application encryption key has been specified. - Qiita](https://qiita.com/ponsuke0531/items/197c76fcb9300d7c5f36)
- [Apacheを使ってLaravelのページを表示できない時の対応方法 - Qiita](https://qiita.com/ponsuke0531/items/cc07807d92ecad60a82f)
- [PHP Warning: require(/path/to/vendor/composer/../symfony/polyfill-mbstring/bootstrap.php): failed to open stream: No such file or directory in /path/to/vendor/composer/autoload_real.php on line 66 - Qiita](https://qiita.com/ponsuke0531/items/a269d9d79382e29b188a)
- [Composerが反応しない - Qiita](https://qiita.com/ponsuke0531/items/441d1983b5fea2d053c6)
- [認証のあるプロキシ環境下でComposer installがうまく行かない - Qiita](https://qiita.com/ponsuke0531/items/05e376e34133e720c1b4)
- [Dotenv values containing spaces must be surrounded by quotes. - Qiita](https://qiita.com/ponsuke0531/items/15f3ad0ba31becca9d5c)
- [Xdebug could not open the remote debug file '\tmp\xdebug.txt' - Qiita](https://qiita.com/ponsuke0531/items/14aaee33f7e408bebe05)
- [Please provide a valid cache path - Qiita](https://qiita.com/ponsuke0531/items/f0b68546068ac8922665)
- [キャッシュクリアできず.envを反映できない時の対応方法 - Qiita](https://qiita.com/ponsuke0531/items/1a665c68d12a74a29a42)


# PECLを使いたい
- [PECLの説明 &middot;  DQNEO起業日記](http://dqn.sakusakutto.jp/2015/07/php_extension_pecl_phpize.html)
- [PEARコマンドの使い方とオプション - 感謝のプログラミング](https://blog.codebook-10000.com/entry/20131201/1385885913)
- [pecl でパッケージをインストール。 - それマグで！](http://takuya-1st.hatenablog.jp/entry/2016/05/02/153440)

# IDEを使いたい
- [PhpStormを初めて使うときに役立てたいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/f1f5287e0be3ef9911ef)
- [IDEとしてSunblime Textを使いたい - Qiita](https://qiita.com/ponsuke0531/items/425281bb9bd62dfe0fc9)

# 困った!
- [PHP Fatal error:  Class 'hoge' not found in fuga.php on line xx - Qiita](https://qiita.com/suin/items/752f3721c4b9084fef4e)
- [PHP Warning:  PHP Startup: Unable to load dynamic library 'oci8_12c' - Qiita](https://qiita.com/ponsuke0531/items/fae6b9a64163cef51d2e)

# これなんだ？
- [無名関数って何？ - Qiita](https://qiita.com/ponsuke0531/items/6cc8e8e0a1f5c4b61c4d)

## stdClass
PHP標準クラスでプロパティもメソッドも何もないクラスだが、インスタンスを生成すると存在しないプロパティに好きにアクセスできる。

> stdClass is the default PHP object. stdClass has no properties, methods or parent. It does not support magic methods, and implements no interfaces.
> When you cast a scalar or array as Object, you get an instance of stdClass. You can use stdClass whenever you need a generic object instance.
> [PHP: クラスの基礎 - Manual](http://php.net/manual/ja/language.oop5.basic.php)

- [stdClass - Qiita](https://qiita.com/onomame/items/be2261c6eb566edab030)
- [PHP: 定義済のクラス - Manual](http://php.net/manual/ja/reserved.classes.php)
- [stdClassのオブジェクトを作る方法 - Qiita](https://qiita.com/ponsuke0531/items/e6ffbdf76c41f58cf254)
- [stdClassをnewしたらPHP Warning: Creating default object from empty value inとなったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/3211dd78d1940b22eea5)

## __()
> 手続き型ヘルパー
> `__($string, $params = array())`
> The __ 関数は、Lang::get の別名です。
> [Lang - クラス - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.7/classes/lang.html#/procedural_helpers)