質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2551閲覧

[PHP]のデストラクタ(__destruct)について

blueletter5

総合スコア24

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/06/25 07:42

あるPHPの入門書には以下のように解説があります。

*デストラクタ
コンストラクタとは反対に、オブジェクトが破棄されるタイミングで実行されるのがデストラクタです。名前は __destructに固定されている。
デストラクタには、クラスの中で使用したリソースを破棄するなど、主に終了するときの処理を記述するのが一般的です。

以下のようにPHPコードを記述すると…
このように表示されます。

最初にインスタンス$practiceを作成するとコンストラクタ(__construct)ですぐに

鈴木さんは男性です

と出力されるのはわかりますが、直後にデストラクタ(__destruct)によってこのオブジェクトは
破棄され

破棄されました

と出ないのでしょうか?

理屈だと

鈴木さんは男性です

破棄されました

岡本さんは女性です

破棄されました

と出ると思っていました。

インスタンスを作成するとすぐにコンストラクタが呼ばれ、終了するとデストラクタが呼ばれると
いう順番にはならないのでしょうか?

初学者でデストラクタ(__destruct)がよく理解できません。
どなたか、入門者にもわかるように解説していただけないでしょうか。
よろしくお願いいたします。

鈴木さんは男性です 岡本さんは女性です 破棄されました 破棄されました
<?php class MySample{ public $name; public $gender; public function __construct($name, $gender){ $this->name = $name; $this->gender = $gender; print "<p>{$name}さんは{$gender}です</p>"; } public function __destruct(){ print "<p>破棄されました</p>"; } } $practice = new MySample("鈴木","男性"); $practice2 = new MySample("岡本","女性"); ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

phpは一行ずつコードを処理していくので、

インスタンスを作成するとすぐにコンストラクタが呼ばれ、終了するとデストラクタが呼ばれると

いう順番にはならないのでしょうか?

質問に書いてあるコードの場合、以下の行で作られた$practice

$practice = new MySample("鈴木","男性");

が、この行より後の処理で使われるかどうかはコードの最後の処理を終えるまでphpには分からないからです(目視でコードを読める人間とは違うので)
そのため最終行の処理まで終えた時点で$practiceがこれ以上使われないという事をphpが理解でき、$practiceが破棄されます

関数の終了によっても変数が使われないという事がphpに理解出来るので__destructが動くタイミングとなります

php

1<?php 2class MySample{ 3 4 public $name; 5 public $gender; 6 7 public function __construct($name, $gender){ 8 $this->name = $name; 9 $this->gender = $gender; 10 11 print "<p>{$name}さんは{$gender}です</p>\n"; 12 } 13 public function __destruct(){ 14 print "<p>{$this->name}は破棄されました</p>\n"; 15 } 16} 17 18$practice = new MySample("鈴木","男性"); 19$practice2 = new MySample("岡本","女性"); 20 21 22(function(){ 23 $practice = new MySample("fn","伊藤"); 24})(); 25(function(){ 26 $practice = new MySample("fn","佐藤"); 27})(); 28 29 30 31hen(); 32function hen(){ 33 $practice = new MySample("ふぁんく","武藤"); 34} 35

投稿2021/06/25 08:37

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHPマニュアルには下記のようにあります。

デストラクタメソッドは、 特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 あるいは、スクリプトの終了時にも順不同でコールされます。

提示のコードはnewされただけなので、参照するリファレンスがひとつもなくなったわけではないです。

ご希望の動作はnewした直後にnullを入れるなど明示的に情報を破棄すると得られます。

基本は「スクリプト終了時に自動で実行される」という認識で良いと思います。

投稿2021/06/25 07:51

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

インスタンスを作成するとすぐにコンストラクタが呼ばれ、終了するとデストラクタが呼ばれると

いう順番にはならないのでしょうか?

この場合はなりません。

$practiceで作ったオブジェクトは、コードの最後まで$practiceから参照できるままなので、デストラクタが実行されるのは次の行に入る前ではなくコードの終了直前です。

$practice = null;のようにオブジェクトを消せば、そこでデストラクタが走ります。

投稿2021/06/25 07:48

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHP

1$practice = new MySample("鈴木","男性"); 2unset($practice); 3$practice2 = new MySample("岡本","女性"); 4unset($practice2);

投稿2021/06/25 07:48

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問