bookmark_border[PHP] floatとdoubleは何が違うのか

結論

同じ。

どちらも倍精度浮動小数点数

PHPはC言語で作られています。PHPでdoubleまたはfloatと定義すると内部のC言語ではdoubleとして扱われます。

IEEE 754の倍精度浮動小数点数に沿った表現であるかは保証されておらず、それは実行するマシンに依存します。小数点の桁数が違うと説明する文献もありますがそれはJavaなど別の言語での仕様で、PHPでは同じです。

なぜdoubleとfloatがあるのか

変数の型を取得するgettype関数の公式ドキュメントには次のような説明があります。

"double" (歴史的な理由により float の場合は、"float" ではなく、 "double" が返されます)

PHP: gettype – Manual

(太字は本ブログ)

PHP 7.4.21 で gettype を実行したところ確かに double と返してきます。

print(gettype(1.23));
// double

しかし var_dumpfloat と述べます。

var_dump(1.23);
// float(1.23)

なにか事情がありそうです。

“歴史的な理由” とは何か

doubleとfloatが統一されていない理由、残念ながらはっきりしたことはわかりませんでしたが興味深い考察をしていらっしゃる方がいらっしゃいました。

お前は PHP の歴史的な理由の数を覚えているのか (49ページ目から)

当初PHPの開発チームは浮動小数点数をdoubleとしていたものの、途中からfloatへの置き換えが始まった履歴(git)が取り上げられています。float, doubleどちらにするのかチームで方針の不一致と見られる履歴もご指摘あり。

これらが「歴史的理由」の背景と考えられます。

カテゴリー: PHP

bookmark_borderクラス名間違っていないのに Target class [○○] does not exist. になる- Laravel8

TL;DR

該当のControllerをuseし、::classでそのクラスの完全修飾名を取得。それをControllerとして指定する。

use App\Http\Controllers\HogeController;
Route::get('/hoge', [HogeController::class, 'hogeAction']);

起こるエラー

Illuminate\Contracts\Container\BindingResolutionExceptionTarget class [コントローラーの名前] does not exist.

問題のコードと前提

HogeController.phpはapp/Http/Controllersに間違いなく配置されている。Route::getで指定しているクラス名もtypoしていない。

Route::get('/hoge', 'HogeController@hogeAction');

対処

Laravel8系において、Controllerはクラスの完全修飾名で指定する。

use App\Http\Controllers\HogeController;
// HogeController::class の実行結果は
// 'App\Http\Controllers\HogeController'
Route::get('/hoge', [HogeController::class, 'hogeAction']);

以下でも同じ動作をしますが、Controllerのクラス名::classを使用する上記の方法の方が可読性が良さそうです。(公式ドキュメントのサンプルコードもControllerのクラス名::classの形)

Route::get('/hoge', 'App\Http\Controllers\HogeController@hogeAction');

参考

Laravel 8.x 公式ドキュメント Routing#The Default Route Files

https://laravel.com/docs/8.x/routing#the-default-route-files