About Cosense
Help
Log in
PHP
n
u
m
b
e
r
P
H
P
マ
ニ
ュ
ア
ル
で
表
記
さ
れ
る
擬
似
型
の
一
種
だ
が
、
注
意
が
必
要
>
n
u
m
b
e
r
は
、
引
数
が
i
n
t
e
g
e
r
ま
た
は
f
l
o
a
t
の
ど
ち
ら
で
も
よ
い
こ
と
を
示
し
ま
す
。
>
h
t
t
p
:
/
/
p
h
p
.
n
e
t
/
m
a
n
u
a
l
/
j
a
/
l
a
n
g
u
a
g
e
.
p
s
e
u
d
o
-
t
y
p
e
s
.
p
h
p
#
l
a
n
g
u
a
g
e
.
t
y
p
e
s
.
n
u
m
b
e
r
引
数
の
型
宣
言
と
し
て
書
い
て
も
期
待
し
た
効
果
を
得
る
こ
と
は
で
き
な
い
キ
ー
ワ
ー
ド
で
も
予
約
語
で
も
な
い
そ
の
た
め
n
u
m
b
e
r
ク
ラ
ス
を
ユ
ー
ザ
ー
定
義
す
る
こ
と
が
可
能
型
宣
言
に
n
u
m
b
e
r
と
書
く
と
上
記
の
ク
ラ
ス
を
意
味
す
る
こ
と
に
な
る
P
H
P
7
で
は
弱
い
キ
ー
ワ
ー
ド
と
し
て
n
u
m
b
e
r
で
は
な
く
n
u
m
e
r
i
c
が
追
加
さ
れ
た
型
チ
ェ
ッ
カ
ー
の
実
装
に
よ
っ
て
非
互
換
が
あ
る
の
で
、
P
H
P
D
o
c
に
記
述
す
る
の
は
オ
ス
ス
メ
で
き
な
い
P
H
P
D
o
c
で
書
く
と
i
n
t
|
f
l
o
a
t
に
相
当
し
そ
う
に
見
え
る
が
、
実
際
は
s
t
r
i
n
g
を
含
む
P
h
p
S
t
o
r
m
は
サ
ポ
ー
ト
し
て
る
っ
ぽ
い
P
h
a
n
は
p
h
p
d
o
c
_
t
y
p
e
_
m
a
p
p
i
n
g
設
定
を
追
加
す
る
こ
と
で
利
用
で
き
る
経
緯
s
u
p
p
o
r
t
@
p
a
r
a
m
n
u
m
b
e
r
·
I
s
s
u
e
#
2
9
4
·
p
h
a
n
/
p
h
a
n
Related
Sort by
Related
Modified
Created
Last visited
Most linked
Page rank
Title
Links
擬似型
英語: [** pseudo-types]かつて使われていた用語で[型宣言]できないが、データの性質を表す[型]のことこれらの表記の多くはPHPの言語機能として正式に取り入れられたため[* 役割を終えた]2020年12月にPHPマニュアルから削除されており、[* 現役の用語ではない][*** PHPマニュアルで利用されていた擬似型]
型チェッカー
[静的解析器]の一種[関数]や[変数]などの[型]の整合性を検査する現在では複数の実装がある[PhpStorm][Phan]
integer
整数のこと。`(integer)"1"`のようにキャストできるPHPDocでは[int型]と同じ意味になる([phpDocumentorの型])ただし、PHPの[型宣言]では`int`ではなく`integer`と書くと期待通りに動作しない`integer`は[予約語]ではなく、クラス名として利用できるため
PHP 7
[* PHP 7]はメジャーバージョン。2015年12月3日にリリースされた[PHP 7.0]から2019年11月28日にリリースされた[PHP 7.4]まで、およそ4年にわたって開発された。PHP 7.3以前は既に[The PHP Group]によるメンテナンスは終了済みPHP 7.4も2021年11月28日アクティブサポートは終了し、セキュリティサポートフェイズに移行した[*** PHP 7の特徴]
型宣言
[関数宣言]および[プロパティ]に[型]を記述すること[英語:] [* type declaration]https://www.php.net/manual/ja/language.types.declarations.php引数には全ての[データ型]が記述できるわけではなく、[型宣言できない型]もある。[*** builtin types (組み込み型)]
予約語
#英語: [* reserved words]
PHPDoc
[DocComment]に特定の記法で構造化されたメタデータのこと
PHPマニュアル
[PHP公式サイト]に掲載されてるPHPについての詳細な説明書http://php.net/manual/ja/[関数リファレンス][言語リファレンス]まめちしき
PHPマニュアル
関数プロトタイプ
[PHPマニュアル]の[関数リファレンス]特有の記法[*** 2019年1月以降の表記]「[引数]を一つ以上の任意個とり、[戻り値]は[void]」の意味[*** 2019年1月以前の表記]PHPの[シンタックス]および[擬似型]との互換性は[* ない]
php.net
PHPの公式サイト。[The PHP Group]が管理している。[*** 主なコンテンツ][PHPマニュアル]PHPのダウンロードと変更履歴 https://www.php.net/downloadsメーリングリスト https://www.php.net/mailing-lists.php
コア拡張
PHPの[拡張モジュール]のうち、[PHP]に標準で組み込まれていて、ユーザーが任意で無効化できない機能。[php-src]に含まれているが標準では有効化されない拡張モジュールは[バンドル拡張]と呼ばれる。[*** 一覧]最新の一覧は[PHPマニュアル]の[拡張モジュールの一覧/分類 > 所属 #コア拡張 https://www.php.net/manual/ja/extensions.membership.php#extensions.membership.core]にリストアップされている。
list構文
配列を[デリファレンス]する言語構造。[タプル]や[名前付きタプル]を変数に分解するために用いることができる。[list型]との相性はあまりよくないので注意。PHP 7.1より以前は`list() =`と書く必要があった[PHP: 7.1 新機能 - Manual https://www.php.net/manual/ja/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring]
マジック定数
PHP処理系によって[即値]に展開される[定数]のようなもの。[PHPマニュアル]では[* マジカル定数]とも呼ばれる。マジック定数は定数ではない。`PHP_VERSION`は定義済み定数だが、`__FILE__`はマジック定数。
2020年のパーフェクトPHP Part2
この記事は[2020年のパーフェクトPHP]として「パーフェクトPHP」の[* Part 2 PHP 〜 overview]の内容を補足しています。>未検証の内容を含み、正確ではない内容を含むことを承知ください。[*** 2章 PHPの基本]この章の内容は2020年現在でもあまり変わっておらず[* 大筋において信頼できます]このあと原書のミスについて細かく指摘する箇所もありますが[*/ 実用的な問題はない]ので気にしないでも構いません
型
[値]の性質を表す要素全ての値は何らかの[データ型]に属するPHP処理系が実行時に評価するのは[データ型][型宣言][引数の型宣言]
void
[** 空][* 二種類の意味がある][戻り値]に書ける`void`ある[関数]が値を返さないことを[* 示す]キーワード実際に値を受けると[null]になる
擬似型
mixed型
PHPの[擬似型]のひとつ。[ユニオン型]で表すと`array|bool|callable|int|float|null|object|resource|string`に相当する。ほかの言語では`any`などと呼ばれる[PHP 8.0]で[トップ型]として追加された。[型宣言]で利用できる
callable
[呼び出し]できる値を指す[組み込み型]([特殊型])[コールバック]とも呼ばれるPHPマニュアルの[擬似型]として`callback`と書かれていた時期もあった実際の型宣言には`callable`のみ有効
名前空間付きクラス名
[クラス]が属する[名前空間]と[クラス名]を結合したもの。[FQSEN]と違って、クラス名の先頭に`\`が付かないただしクラス名を要求する文脈で先頭に`\`を付けても多くの場合は問題なく許容される`::class`で生成できる → [::class]型チェッカーによっては[class-string型]という[擬似型]として扱われる
データ型
[英語:] [* data types] / [* primitive types][値]の分類要素。PHPの全ての値は何らかのデータ型に属する。いろいろある[bool] / [boolean]
引数
アリティ
[* アリティ]([英語:] [* arity])は関数の[パラメータ]の個数のこと。[アリティ - Wikipedia https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3]プログラミングの文脈においては[可変長引数]を扱えるため、基本的に呼び出し時の[引数]の数ではなく、定義されたパラメータ(仮引数リスト)の数を基準とする。
タプル
値が組になったもののこと。#英語: [* tuple] (トゥープル)[*** タプルの例]先に伸べた通り「値が組になったもの」という意味なのだが、実際の例としては[引数]が想像しやすいだろう。[array_pad() https://www.php.net/manual/ja/function.array-pad.php]を例にとる
値
#英語: [** value][変数]に入れたり、[関数]や[メソッド]の[引数]として渡せるもの[出力]できるかどうかは、[データ型]による
無名クラス
即時的なクラス宣言から[オブジェクト]([インスタンスオブジェクト])を[実行時]に動的に生成する機能http://php.net/manual/ja/language.oop5.anonymous.phpPHP 7で追加された[stdClass]とは[*/ 完全に別物] [** ←重要]利用目的もまったく異なる
コールバック
英語: [** callback][引数]や(あるいは[プロパティ])として保持された[callable]な値を[呼び出し]すること
関数
英語: [** function]「[引数]を取ったり取らなかったりして、[値]を返したり返さなかったりするもの」
可変長パラメータ
0個以上の任意個の[パラメータ]を受け付ける言語機能[英語:] [* variadic parameters]関数定義で`...`を使ったパラメータ宣言はPHP 5.6で追加された[PHP RFC: Syntax for variadic functions https://wiki.php.net/rfc/variadics][*** 可変長パラメータ宣言]
型宣言
Attacking PHP
2008年に[まつもとゆきひろ]氏によって書かれたエッセイ。[Attacking PHP - Matzにっき(2008-01-26) https://matz.rubyist.net/20080126.html#p04]>PHPがいかに駄目な言語か、という話。[*** 2024年にはどうか][* 以下の見解は[@tadsan]による私見である。]
iterable
[型宣言]に記述できる[特殊型]のひとつ`array|Traversable`と等価[PHP: Iterable - Manual https://www.php.net/manual/ja/language.types.iterable.php]
ユニオン型
[英語:] [* union types][日本語:] [* ユニオン型] / [* 合併型]`A|B`と書くことで、「AまたはB」を示す[型]。かつては[PHPDocに記述可能な型]として定義され、[PHP 8.0]で[型宣言]として記述可能になった。PHP 8.2では[DNF型]として[交叉型]と組み合せた複雑な論理式が記述可能になった。
組み込み型
[データ型]と[特殊型]のうち、[型宣言]に記述可能な型のこと一般的に、組み込み型は[* すべて小文字で表記する][*** 組み込み型の一覧][int型][bool型]
resourceは型宣言できない
トップ型
あらゆる型を部分型に持つ型のことPHP以外の言語では`any`などと呼ばれることがある#英語: [* top type] [Top type - Wikipedia https://en.wikipedia.org/wiki/Top_type][PHP 8.0]では[mixed型]がトップ型として型宣言できるようになった
PHP 7
Suhosin
Stefan Esser氏が開発したPHPのセキュリティモジュール。現在は[Suhosin-NG]に移行したので、旧版は[* Suhosin5]と呼ばれる。[* 公式サイト]: https://suhosin5.suhosin.org/stories/index.htmlドイツの[* SektionEins GmbH]社で開発が継続されていたが、2015年にリリースされた[PHP 5]対応の[* 0.9.38]を最後に開発が停滞していた。その後[PHP 7]対応を目指した[* Suhosin7]([https://github.com/sektioneins/suhosin7])の開発が着手されたが、正式リリースされることがないまま、[Snuffleupagus]
ReturnTypeWillChange
PHP組み込みの[アトリビュート]。バージョンアップに伴って型宣言が変更されたインターフェイスの警告を抑止できるPHP 8.1で追加された[PHP RFC: Add return type declarations for internal methods https://wiki.php.net/rfc/internal_method_return_types][*** どのようなときに使うのか]
binary
[* 二進法]とか[* 二つのなんとか]みたいな意味のなんか例: binary tree → [* 二分木]、binary operator → [* 二項演算子]そのなかでも、二進法で表現されたデータ([ビット])並び([バイト列])から構成されたデータ、その中でも[テキスト]ではないものを一般に[* バイナリデータ]と呼ぶ本来はテキストデータもバイナリデータであるが、わざわざ正方形を平行四辺形とは呼ばないようなもの
list型
静的解析ツールに実装された独自の型。基本的には[PHPDoc]に書くことで用いる。#Psalmの型 #PHPStanの型 #Phanの型[デリファレンス]によって[多値]を擬似的に再現する[list構文]とは別`list($a, $b) = f()` のような形式で返り値を受け取るパターン([タプル])とは使用箇所が異なるリストとは、以下のような連番の要素を持つ配列を指す
型チェッカー
PhpStormの擬似ジェネリクス
[ジェネリクス]をサポートする[型チェッカー]では`ArrayObject<DateTime>`のように記述できます。しかし、残念ながら過去(2021年以前)の古い[PhpStorm]はこの形式の型表記をサポートしていませんでした。`/**``* @return ArrayObject|DateTime[]``*/`
Exakat
https://github.com/exakat/exakat-ce[型チェッカー]ベースの[静的解析器]。[コードフォーマッター]の機能も内包している。商用製品だが、[* Exakat community edition]として[AGPL]でライセンスされた[自由ソフトウェア]としてもリリースされている。
Psalmの型
[静的解析器]・[型チェッカー]である[Psalm]が独自に提供している[型]。[*** 一時情報源]Psalm Documentationを参照してください[Using Type Annotations - Documentation https://psalm.dev/docs/annotating_code/typing_in_psalm/][Atomic Type Reference - Documentation https://psalm.dev/docs/annotating_code/type_syntax/atomic_types/]
静的解析器
検査対象のスクリプトを実行しなくてもコードの[* 特徴]を把握するためのプログラムPHPの文脈においては、「[古典的な静的解析器]」と「[型チェッカー]ベースの静的解析器」がある[古典的な静的解析器]大雑把に、バッドスメルやバッドノウハウを検知する[* 精密な]文法解析や変数スコープの分析はしないことが多い
Psalm
[* Psalm] (/sɑːm/ サーム) はVimeo社のMatthew Brown氏([@muglug https://github.com/muglug])が開発するPHPの[静的解析器]・[型チェッカー]。[* 公式サイト][Psalm - a static analysis tool for PHP https://psalm.dev/][* 開発リポジトリ]GitHub: [vimeo/psalm: A static analysis tool for finding errors in PHP applications https://github.com/vimeo/psalm]
PHPDoc
class-string型
静的解析ツールに実装された独自の型。基本的には[PHPDoc]に書くことで用いる。#Psalmの型 #PHPStanの型 #Phanの型 #PhpStormの型[Psalm]と[PHPStan]の実装ではジェネリクスを組み合わせることができる。[*** マニュアル][Psalm]
non-empty-array型
空ではない配列を意味する、静的解析ツールに実装された独自の型。基本的には[PHPDoc]に書くことで用いる。#Psalmの型 #PHPStanの型
PhpStorm
Intelephense
[* Intelephense]は[LSP]を実装した[言語サーバー]および連動した[Visual Studio Code]拡張。[* 公式サイト]: [Intelephense https://intelephense.com/][* ライセンス]: [プロプライエタリ][* npm]: https://www.npmjs.com/package/intelephense高度な機能は有料だが、[- 2022年5月現在で買い切り1800円] [* 2023年2月現在で20USD(= 2637円)] [/ (為替変動)]なのでコストパフォーマンスはかなり高い。
T[]型
#phpDocumentorの型 #Psalmの型 #PHPStanの型 #Phanの型`string[]`や`DateTime[]`のように[型名]の後に`[]`を後置することで、前置した型が要素になる配列を表します`T[]`は`array<T>`と書くのと同等です`T[]`記法では[配列キー]の型や[non-empty-array型]/[non-empty-list型]を表すことができません[array<K,T>]型で`array<int, string>`や`array<string, DateTime>`のように書くのがベターです
array shapes記法
配列の内部構造を記述する記法のこと。Psalmでは[Object-like arrays]と呼ぶ[array shapes記法(Object-like arrays)と旧PSR-5記法で型をつける - Qiita https://qiita.com/tadsan/items/bfa9465166c351da37e5][Psalm: Object-like arrays https://psalm.dev/docs/annotating_code/type_syntax/array_types/#object-like-arrays]
Phan
PHPのオンラインサンドボックス環境
ブラウザからPHPを実行・評価できる環境[*** オンライン実行環境][** PHP特化][PHP Playground] https://php-play.dev/[WebAssembly]でコンパイルされたPHPをブラウザで実行できることが特徴
New Links
キーワード
ユーザー定義
弱いキーワード
Created
7 years ago
by
USAMI Kenta
Updated
7 years ago
by
USAMI Kenta
Views: 349
Page rank: 12.2
Copy link
Copy readable link
Start presentation
Hide dots
number
PHPマニュアル
で表記される
擬似型
の一種だが、注意が必要
number
は、
引数
が
integer
または
float
のどちらでもよいことを示します。
http://php.net/manual/ja/language.pseudo-types.php#language.types.number
引数の型宣言として書いても
期待した効果を得ることはできない
キーワード
でも
予約語
でもない
そのため
number
クラスを
ユーザー定義
することが可能
型宣言
に
number
と書くと上記のクラスを意味することになる
PHP 7
では
弱いキーワード
として
number
ではなく
numeric
が追加された
型チェッカー
の実装によって非互換があるので、
PHPDoc
に記述するのは
オススメできない
PHPDoc
で書くと
int|float
に相当しそうに見えるが、実際は
string
を含む
PhpStorm
はサポートしてるっぽい
Phan
は
phpdoc_type_mapping
設定を追加することで利用できる
経緯
support @param number · Issue #294 · phan/phan