PHP

PHP: ジェネレーター

October 6, 2020
PHP
PHP

関数で function ではなく yield を使うとジェネレーターとなる。 <?php function myGenerator() { yield 1; yield 2; yield 3; } foreach(myGenerator() as $i) { echo $i . "\n"; } 1 2 3 ジェネレーターを使ったフィボナッチ関数 # <?php function myFib() { $a = 0; $b = 1; for (; $c < 10000;) { $c = $a + $b; yield $c; $a = $b; $b = $c; } } foreach(myFib() as $i) { echo $i . "\n"; } 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 ジェネレーターの利点 # 全ての結果を計算して返すのではないので場合によってはメモリ効率が良い 関数内で状態を保持する=状態を保持するオブジェクトを簡潔に書ける

PHP: 名前空間

October 5, 2020
PHP
PHP

名前空間を作成する # my\ns という名前空間を定義する。 my_ns.php <?php namespace my\ns; class MyClass { function __toString() { return "from MyClass"; } } function myFunc() { return "from myFunc"; } const MY_CONST = "from MY_CONST"; 名前空間経由でアクセスする # <?php include('my_ns.php'); echo new my\ns\MyClass . "\n"; echo my\ns\myFunc() . "\n"; echo my\ns\MY_CONST . "\n"; from MyClass from myFunc from MY_CONST 名前空間に定義できるもの # class interface trait function const use キーワード # 短い名前で利用可能となるよう、現在の名前空間へ import が可能。 ...

PHP: クラス

September 24, 2020
PHP
PHP

基本形 # <?php class MyClass { public $name = "john"; public function say() { echo "hello " . $this->name . "\n"; } } $instance = new MyClass(); $instance->say(); //=> hello john インスタンスのプロパティおよびメソッドにアクセスするには -> 演算子を使う そのクラスの static なプロパティおよびメソッドにアクセスするには :: 演算子を使う メソッド内で自身のインスタンスにアクセスするには $this 変数を参照する コンストラクタ # __construct() がコンストラクタとなる。 <?php class MyClass { public $name; public function __construct($name) { $this->name = $name; } public function say() { echo "hello " . ...

PHP: 関数

September 24, 2020
PHP
PHP

基本形 # <?php function my_func($arg_1, $arg_2, /* ... */ $arg_n) { echo "hello! my func"; return $retval; } 引数の参照渡し # 仮引数に & を付与すると参照渡しになる。 <?php function increment_one(&$n) { $n += 1; } $a = 1; increment_one($a); echo $a; //=> 2 引数のデフォルト値 # <?php function greet($word = 'hello') { echo $word . "\n"; } greet("hi"); //=> hi greet(); //=> hello 仮引数への型宣言 # 仮引数にデータ型を宣言できる。宣言した型と一致しない場合は型変換が発生し、それができない場合は TypeError 例外がスローされる。 <?php function double(int $val) { return $val * 2; } echo double(1), "\n"; echo double("2"), "\n"; echo double([]), "\n"; 2 4 Fatal error: Uncaught TypeError: Argument 1 passed to double() must be of the type int, array given, called in /usr/src/myapp/a. ...

PHP: 制御構文

September 10, 2020
PHP
PHP

if / else / elseif / else if # 単一の statement でも常に波括弧を付けたい(単一の statement なら波括弧不要なのは C 言語と同じ)。 <?php if (expr) { statement; } if ~ elseif ~ else を使う。 <?php if (expr1) { statement1; } elseif (expr2) { statement2; } else if (expr3) { statement3; } else { statement4; } elseif と else if は等価だが、 endif を使う場合は elseif を使う必要がある。 <?php if (expr1): statement1; elseif (expr2): statement2; else: statement3; endif; while / do-while # expr が TRUE で処理が実行される。 ...

PHP: 演算子

September 8, 2020
PHP
PHP

PHP の演算子について。 算術演算子 # <?php $a = 10; $b = 3; var_dump([ '+$a' => +$a, '-$a' => -$a, '$a + $b' => $a + $b, '$a - $b' => $a - $b, '$a * $b' => $a * $b, '$a / $b' => $a / $b, '$a % $b' => $a % $b, '$a ** $b' => $a ** $b, ]); array(8) { ["+$a"]=> int(10) ["-$a"]=> int(-10) ["$a + $b"]=> int(13) ["$a - $b"]=> int(7) ["$a * $b"]=> int(30) ["$a / $b"]=> float(3. ...

PHP: リテラル

September 2, 2020
PHP
PHP

スカラー型のリテラル # <?php var_dump( // bool値のリテラル、case-insensitive TRUE, True, true, truE, // これでもいい FALSE, False, false, ); bool(true) bool(true) bool(true) bool(true) bool(false) bool(false) bool(false) <?php var_dump( // int値のリテラル、8進数、16進数、2進数もある 100, 0123, 0xBEEF, 0b00101101, 123_456_789, // php 7.4.0 から桁区切りにアンダースコアが使える 0x1F_2B_3C_4D, ); int(100) int(83) int(48879) int(45) int(123456789) int(522927181) <?php var_dump( // flaot値のリテラル 1.234, 1.2e3, 7E-10, 1_234.567, // php 7.4.0 から桁区切りにアンダースコアが使える ); float(1.234) float(1200) float(7.0E-10) float(1234.567) <?php var_dump( // int値で内部表現的にオーバーフローするとfloat値になる 9223372036854775807, 9223372036854775808, ); int(9223372036854775807) float(9. ...

PHP: 定数

August 26, 2020
PHP
PHP

PHP における定数について。定数名は慣習的に全て大文字+単語区切りはアンダースコア。 定数の定義 - define() # define() 関数で定数定義ができる。許可されていない定数名も定義できるが、その場合は constant() 関数で取得する必要がある。 <?php define("FOO", "bar"); echo FOO . "\n"; define("TAKO", array("ika", "uni", "maguro")); echo TAKO[1] . "\n"; define("INVALID CONSTANT NAME", "yah"); echo constant("INVALID CONSTANT NAME") . "\n"; bar uni yah 定数の定義 - const キーワード # const キーワードもある。 <?php const FOO = "bar"; echo FOO . "\n"; const TAKO = array("ika", "uni", "maguro"); echo TAKO[1] . "\n"; bar uni 定数のスコープ # グローバル。 ...

PHP: 変数

August 24, 2020
PHP
PHP

変数の基礎的なこと。 変数の利用 # PHP においては変数宣言は不要。代入により利用可能。 <?php $val = "hoge"; ?> var_dump($val) <?php var_dump($val) ?> var_dump($yet_val) <?php var_dump($yet_val) ?> unset($val) <?php unset($val) ?> var_dump($val) <?php var_dump($val) ?> var_dump($val) string(4) "hoge" var_dump($yet_val) NULL unset($val) var_dump($val) NULL unset() で変数を未使用状態にも戻せる。 文字列リテラル内の変数展開 # ダブルクォーテーションの文字列リテラル中の変数は展開される。変数に利用できない文字が出現すればデリミタ扱いだが、そうではない場合は {$var} と記述すれば良い。 <?php $name = "john"; $greeting = "hello"; echo "$name, $greeting\n"; echo "{$name}nnn!!!\n"; john, hello johnnnn!!! 値渡し / 参照渡し # PHP において代入は基本 値渡し 。代入右辺の変数に & を付与することで 参照渡し ができる。 ...

PHP: データ型

August 24, 2020
PHP
PHP

データの型について。PHP におけるプリミティブなデータ型は10種類ある。 スカラー型 # boolean integer float string 複合型 # array object callable iterable 特別な型 # resource NULL 型情報を取得する - gettype() # return values of gettype(): TRUE is <?php echo gettype(TRUE); ?> 1 is <?php echo gettype(1); ?> 1.0 is <?php echo gettype(1.0); ?> "str" is <?php echo gettype("str"); ?> array() is <?php echo gettype(array()); ?> new class{} is <?php echo gettype(new class{}); ?> fopen() is <? ...