PHPの遅延静的束縛のメモ
遅延束縛とは...
静的継承のコンテキストで呼び出し元のクラスを参照できるようになります。
https://www.php.net/manual/ja/language.oop5.late-static-bindings.php
続きを読むPHPのClassの基礎基礎メモ
Classの基本
Classの使い方
こんな感じのの簡単なクラス。
<?php namespace MyClass; class MyClass { private $last_name = '鈴木'; public $first_name = '一郎'; public function my_name() { echo $this->last_name . $this->first_name; } }
使うほうはこんな感じ。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->my_name(); // 鈴木一郎 $my_class->first_name = '太郎'; $my_class->my_name(); // 鈴木太郎 ?>
Classで利用できるアクセス修飾子
クラスで利用できるアクセス修飾子は3つ。
アクセス修飾子 | 説明 |
---|---|
public | どこからでも参照、呼び出しができる |
private | 自分のクラス内でのみ参照、呼び出しができる |
protected | 自分のクラス、もしくは自分のクラスを継承しているクラスのみ参照、呼び出しができる |
privateのプロパティにアクセスしようとするとエラーになる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->last_name = '伊藤'; // Uncaught Error: Cannot access private property $my_class->my_name(); ?>
クラス内でprivateプロパティにアクセスしてみる。
<?php namespace MyClass; class MyClass { function __construct() { echo '私の名前は'; } private $last_name = '鈴木'; public $first_name = '一郎'; public function my_name() { echo $this->last_name . $this->first_name,PHP_EOL; } public function change_last_name() { $this->last_name = '伊藤'; } }
以下のように変更することができる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->first_name = '太郎'; $my_class->change_last_name(); $my_class->my_name(); // 伊藤太郎 ?>
クラスに未設定のプロパティについて
以下のようにクラスに未設定のプロパティの読み書きも可能です。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->first_name = '太郎'; $my_class->age='30'; $my_class->my_name(); // 伊藤太郎 ?>
ただし、プログラムの見通しが悪くなるのであまり利用しないほうが良さそうです。
staticプロパティ
クラスのプロパティはインスタンスごとに管理する値のインスタンス変数になります。 staticをつけて定義した場合は、クラス全体に影響するクラス変数になります。
<?php namespace MyClass; class MyClass { private $last_name = '鈴木'; public $first_name = '一郎'; public static $biz = '株式会社ほげほげ'; public function my_name() { echo self::$biz . 'の' . $this->last_name . $this->first_name,PHP_EOL; } public function change_last_name() { $this->last_name = '伊藤'; } }
staticプロパティを書き換えた場合、クラス全体に影響します。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class::$biz = '有限会社フガフガ'; $my_class->first_name = '太郎'; $my_class->my_name(); // 有限会社フガフガの鈴木太郎 $my_class2 = new MyClass(); $my_class2->first_name = '次郎'; $my_class2->my_name(); // 有限会社フガフガの鈴木次郎 ?>
定数について
クラスの定数は、const
キーワードを利用します。 定数は変数のように、$
をつけません。 アクセスできる範囲はpublicです。
<?php namespace MyClass; class MyClass { const YEAR = 2019; public function shoConst(){ echo self::YEAR; } }
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->shoConst(); // 2019 ?>
関数
static メソッド
staticメソッドは、インスタンス化されていないくても外部から呼ぶことができます。 また、$thisを利用することができずselfを利用します。
<?php namespace MyClass; class MyClass { private static $name = '太郎'; public static function get_name(){ return self::$name; } public static function set_name($v){ self::$name = $v; } }
こんな感じになる。直接クラスから呼び出すこともできる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); echo $my_class->get_name(); //太郎 MyClass::set_name('TAEO'); echo MyClass::get_name(); // TARO ?>
コンストラクタ
コンストラクタはインスタンスが作成されるタイミングで実行されます。
<?php namespace MyClass; class MyClass { private $name; public function __construct($v) { $name = $v; echo $name; } } ?>
こんな感じで、インスタンスを作ったタイミングで実行される。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $name = '太郎'; $my_class = new MyClass($name); // 太郎 ?>
デコンストラクタ
インスタンスが消された(スクリプトが終了した)タイミングで実行されます。
<?php namespace MyClass; class MyClass { public function __construct() { echo 'インスタンスを作成'; } public function hello(){ echo 'hello'; } function __destruct(){ echo 'インスタンスを破棄'; } }
こんな感じ。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); //インスタンスを作成 $my_class->hello(); // hello // インスタンスを破棄 ?>
継承
クラスの継承はextends
キーワードを利用します。
class subClass extends SuperClass{ ... }
オーバーライド
親クラスの定義を子クラスで同じ名前で定義すると上書きできることをオーバーライドと言います。
親クラス
<?php class SuperClass { public $name = '太郎'; public function show_name(){ echo $this->name; } }
子クラス
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { public $name = 'TARO'; }
実行すると$name
が子クラスの値でおきかえられます。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //TARO ?>
parentキーワード
子クラスの中から親クラスの操作をしたい場合はparent
キーワードを利用します。
親クラス
<?php class SuperClass { private $name = '太郎'; public function __construct($v) { $this->name = $v; } public function show_name(){ echo $this->name; } }
子クラス
子クラスから親クラスのコンストラクタを実行してみる。
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { private $name = '小太郎'; public function __construct() { parent::__construct($this->name); } }
実行してみる。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //小太郎 ?>
finalキーワード
finalキーワードをつけてメソッドを宣言すると、子クラスからのオーバーライドができなくなります。
親クラス
<?php class SuperClass { private $name = '太郎'; public final function show_name(){ echo $this->name; } }
子クラス
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { private $age = 25; public function show_name(){ echo $this->age; } }
実行するとエラーになる。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //Cannot override final method SuperClass::show_name() ?>
PHP超初心者のメモ
初心者の私が、PHPを勉強していて少し気になったことを自分用にメモしています。 少しずつ足していきます。
phpのスコープ
phpでfor文やif文の中はブロックスコープになりません。 関数の中はブロックスコープになります。
<?php function func(){ $hoge = '1'; } var_dump($hoge); // NULL ?>
もしfor文などの中で変数を定義した場合は、その後利用しないのであれば、unset
したほうがよさそうです。
<?php $a = [1,2,3]; foreach ( $a as $value){ $b = 2; $value += $b; } var_dump($b); // int(2) unset($b); var_dump($b); // NULL ?>
引数の参照渡し
関数の引数の頭に & をつけると引数の修正が可能になります。
<?php function func(&$var){ $var ++; } $hoge = 1; func($hoge); echo $hoge; //1 ?>
引数を参照渡しにするケースがあるのかが疑問でしたが、以下のように使う場合無駄な変数を定義しなくてすむので便利です。
<?php function func(&$var){ return $var += 10; } $hoge = 1; echo func($hoge); //11 ?>
タイプヒンティング(型宣言)
関数にわたす引数の型を定義することができます。
<?php function func(int $var){ return $var + 10; } $hoge = 1; func($hoge); echo $hoge; //1 ?>
phpでクロージャーを使う
phpでクロージャーを利用する場合、親スコープから変数を引き継ぐ場合にuse
を利用する必要があります。
<?php $count = function(){ $n = 0; return function() use (&$n){ return ++$n; }; }; $func = $count(); echo $func(); // 1 echo $func(); // 2 echo $func(); // 3 ?>
定義済み関数の取得
PHPには定義済みの関数があります。 1つは、PHPにで利用できる関数。 もう一つは、プラグインなどをインストールすることで利用できる関数です。
どのような定義済み関数があるか以下で確認できます。 でもたくさんありすぎて見ずらいです。。。
<?php var_dump(get_defined_functions()); ?>
$self と $thisの使い分け
$self と $thisの使い分けがいまいちわかりませんでした。 簡単な使い分けとしては以下になるのでしょうか。。。
$self ・・・ 自クラスの静的(static)プロパティや、メソッドにアクセスするときに使う $this ・・・ 自クラスの動的(staticがついていない)プロパティやメソッドにのアクセスするときに使う
PHPのヒアドキュメントやNowdocのメモ
複数行にまたがる文字列を扱うときに便利なヒアドキュメントやNowdoc。 EOMは他の文字でもOK(開始と終了が同じ文字なら)。 よく使われるのがEOM(End Of Message)みたい。
続きを読むPHPで定数を利用するメモ
定数の定義
定数定義にはdefineかconstを利用します。 defineとconstの違いは、defineはnamespaceの影響を受けないけど、constは受けるだけなのでしょうか。。。
define
define('ABC','ほげほげ'); echo ABC; // ほげほげ
const
const ABC = 'ほげほげ'; echo ABC; // ほげほげ続きを読む