現在の言語: 日本語

戻る

object型
php型宣言

object型はphpでクラスのインスタンスを表します。
クラスのインスタンス化以外には下記の内容があります。

(1)PHPの組み込み関数や機能が返すオブジェクト
json_decode() 関数は、デフォルトでJSON文字列をPHPのオブジェクトに変換して返します。
これはクラス定義のない汎用的なオブジェクト(stdClass)です。
$json_string = '{"name": "book", "price": 1000}';
$data = json_decode($json_string);

(2)データベース結果セット
// PDOの例 (PDO::FETCH_OBJ を使用)
$stmt = $pdo->query('SELECT * FROM tbl');
$bject = $stmt->fetch(PDO::FETCH_OBJ);

(3)配列からオブジェクトへのキャスト(変換)
配列を (object) のキャスト演算子を使って強制的にオブジェクトに変換できます。
$array_data = ['a' => 1, 'b' => 2];
// 配列をオブジェクトに変換
$object = (object) $array_data;

(4)stdClass の直接利用
stdClass はPHPに標準で備わっている「空っぽの汎用クラス」です。
これはPHPの内部で汎用オブジェクトが必要なときに使われるもので、
開発者がデータコンテナとして直接 new することも可能です
$generic_object = new stdClass();
$generic_object->status = "active";
$generic_object->num = 100;

オブジェクト以外の型を関数の型に渡した場合はエラーになります。
function test(object $cls)
{
  ...
}
$num = 100;
test($num);//エラーになります。
int/float/bool/array/null等のオブジェクト以外の型も同様にエラーとなります。
TypeError という実行時エラーが発生します。
ただし、nullを渡した場合でnull許容型を使用した場合はエラーとなります。
function test(?object $cls)
{
  if($cls === null)
  {
    echo "nullが渡されました。";
  }
}
test(null);//エラーにはなりません

null許容型とは引数の型に?をつけることでnullを許容する設定になります。


[サンプル]

copy
class test1
{
  public int $total = 0;
  public string $result = "";
  public function test1(int $num1, int $num2)
  {
      $this->add($num1, $num2);
  }
  private function add(int $num1, int $num2)
  {
    $this->total = $num1 + $num2;
    $this->result = "$num1 + $num2 = $this->total";
  }
}
echo "<pre>";

$cls1 = new test1();
$cls1->test1(2, 3);
echo "total:$cls1->total".PHP_EOL;
echo "result:$cls1->result".PHP_EOL;

echo "</pre>";
copy
class test1
{ 
	public int $total = 0; 
	public string $result = ""; 
	public function test1(int $num1, int $num2) 
	{ 
		$this->add($num1, $num2); 
	} 
	private function add(int $num1, int $num2) 
	{ 
		$this->total = $num1 + $num2; 
		$this->result = "$num1 + $num2 = $this->total"; 
	}
}
echo "<pre>";

$cls1 = new test1();
$cls1->test1(2, 3);
echo "total:$cls1->total".PHP_EOL;
echo "result:$cls1->result".PHP_EOL;

echo "</pre>";

newキーワード
$cls1 = new test1();
クラスからオブジェクトを作成します。
new演算子ではallocate(メモリの確保)とinitialize(初期化)の両方が同時に行われます。
allocやinitに相当するような明示的なメモリ割り当てステップはありません。
もしも初期化時点で引数に値を渡したい場合は
newの直後に引数を実装します。
(例)
class test
{
public function __construct($num)
{
$this->num = $num;
}
private int $num;
...
}
$cls = new test(100);

->演算子
$this->total = $num1 + $num2;
プロパティに値を入れたり、値を取得するため使用します。
また、メソッド呼び出しにも使用します。
$this->add($num1, $num2);


copy
class test2
{
  function test()
  {
    return;
  }
}
echo "<pre>";

$obj1 = new test2();
$obj2 = new test2();
unset($obj1);
$obj2 = null;

echo "</pre>";

copy
class test2
{ 
	function test() 
	{ 
		return; 
	}
}
echo "<pre>";

$obj1 = new test2();
$obj2 = new test2();
unset($obj1);
$obj2 = null;

echo "</pre>";
メモリ解放
unsetやnullを使用して解放処理を実装します。
上記はtest2クラスをインスタンス化したオブジェクト変数をそれぞれに割り当てています。
例えば、このサンプルでは
unset($obj1);
と書かれていますが、
この後に
$obj1 = null;
としても不具合が起こることは通常ないようです。
ただし、冗長なコードとなってしまいます。
unset($obj1);
$obj1変数を未定義の状態にします。
メモリ上のオブジェクトへの参照は、ここで解除され
$obj1は存在しない変数として扱われます。
$obj1 = null;
直線のunset($obj1)により$obj1は既に存在しないことになっています。
そのため、nullを設定しようとしている処理は
何もしない、あるいは、
存在しない変数にnullを代入しようとしている結果
となります。
phpインタプリタは柔軟な仕組みなため、存在しない変数への代入をしても
致命的なエラーにはならずに、安全に処理されます。
$obj2 = null;
ガーベッジコレクション(GC)の対象になります。
これはunset($obj1);のケースも同様にガーベッジコレクションの対象となります。
phpのメモリ解放の仕組みは参照カウンタを使用しています。
変数を使用した分だけインクリメント(1個ずつ増えていく)します。
そして、変数が参照から外れると、その分だけマイナスになります。
そして変数を参照しているカウント数が0になると即座にメモリを解放します。
ガーベッジコレクションは参照カウンタの弱点を補うための仕組みとして採用されています。
参照カウンタだけでは循環参照を解決できません。
循環参照
AがBを参照して
BがAを参照している
という両者が参照し合っている状態
こうなると両方のオブジェクトのカウント数が常に1以上になってしまいます。
そして誰も使っていないのにメモリが解放されなくなってしまうのです。
PHPのガーベッジコレクションは定期的にメモリが一定量士用意されたときに起動して
このような循環参照によって発生したゴミ(ガーベッジ)を見つけ出し
強制的に解放する仕組みです。



戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。