【PHP】コンストラクタ―について

このQ&Aのポイント
  • コンストラクタメソッドは、インスタンス生成時にオブジェクトを初期化するために使用されます。
  • 特定の引数を受け取ることもでき、インスタンス生成時に自動的に呼び出されます。
  • コンストラクタを使用することで、プロパティへの値の設定や初期化処理を簡潔に行うことができます。
回答を見る
  • ベストアンサー

【PHP】コンストラクタ―について

コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

もし違っていたら申し訳ないんですが、 public function __construct($text)とある、変数$textと、【private $text】は、名前が同じだけで別のものを指している、ということはご理解いただけていますか。 これは、以下のように書いても同じ動作をします。 public function __construct($hogehoge) { $this->text = $hogehoge; } ここでいう$hogehogeは、「$posts[0] = new Post('hello');」で与えられている'hello'が代入されたものになります。

blueletter12345
質問者

お礼

ありがとうございました。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.1

コンストラクタは、そのclassを使用するにあたって必要な初期化処理を定義しておくモノです。 何らかのデータを与えた後で無いと他の処理が利用できないようなclassであれば、newする時に必要なデータを引数で与えて貰うことで確実に動作できるよう初期化します。 引数が必要なければ、コンストラクタで外部から通信でデータを受け取って初期化処理したり、現在の時刻などを使って初期化処理を行ったります。 特に初期化処理を必要としないclassであればコンストラクタは用意する必要はありません。 あくまでも、そのclassの設計次第です。

関連するQ&A

  • [PHP]子クラスに独自の実装をする

    現在子クラスに独自の実装をしていくという学習をしています。 親クラス Post を継承する子クラス showSponsor を作成してみました。 子クラスのコンストラクタの引数に親クラスのプロパティ'$text'、と子クラスで 新たに作成した'$sponsor'を入れました。 その後、newで新しく作った'showSponsor 'のインスタンスを作りました。 スポンサー名は'Yahoo'としてみました。 $posts[2] = new SponsoredPost('hello hello', ’Yahoo'); その後、同様に新しく作成した ’showSponsor()’ メソッドを表示するために $posts[2]->showSponsor(); を追加しました。 この記述で実行すると "Warning: Use of undefined constant ’Yahoo’ - assumed '’Yahoo’' (this will throw an Error in a future version of PHP) in C:\xampp\htdocs…" と出ます。「'Yahoo'という定義されていない定数を使っている」というような意味かと思います。 子クラスである'SponsoredPost'内の sponsoreのどこかにミスがあるのでしょうか? エラー行はコード内に記述したある $posts[2] = new SponsoredPost('hello hello', ’Yahoo'); の部分です。 表示結果では一応’Yahoo’の文字出ていますが、 ' (シングルクォート) も一緒についています。文字列ということを表すためにつけたものです。 初学者の自分にはエラーの原因がわかりません。 もしエラーの原因がわかる方いらっしゃいましたら教えてください。 宜しくお願い致します。 ------------------------------------ <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s',$this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent:: __construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts=[]; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); //★エラー行 $posts[2] = new SponsoredPost('hello hello', ’Yahoo'); $posts[0]->show(); echo "<br>"; $posts[1]->show(); echo "<br>"; echo "<br>"; $posts[2]->show(); echo "<br>"; $posts[2]->showSponsor(); ------------------------------------

    • ベストアンサー
    • PHP
  • 【PHP】クラスを継承した際にデータ型も継承すると

    とある有料のオンライン学習サイトをつかっています。 学習項目の流れは以下の通りです。 現在「15 型の継承について見ていこう」で躓いています。 01 オブジェクトを使ってみよう (02:56) 02 投稿に関する処理を作ろう 03 クラスでデータ型を定義しよう 04 インスタンスを作ってみよう 05 コンストラクタを使ってみよう 06 クラスを整理しておこう 07 アクセス修飾子について見ていこう 08 メソッドを介してプロパティを操作しよう 09 プロパティで型宣言をしてみよう 10 staticキーワードを使ってみよう 11 オブジェクト定数を使ってみよう 12 クラスを継承してみよう 13 子クラスで独自の実装をしていこう 14 メソッドをoverrideしてみよう 15 型の継承について見ていこう *型の継承 *型を継承するメリット この項目で記述されているソースコードは下記のとおりです。コード内のクラス、SponsoredPostは クラスPostを継承しています。よって両方のクラスともにPost型として扱えると説明があります。 ソース内のこの箇所で processPostという関数を作成し、変数$postにPost型と型付けをしています そしてforeachでPostで型付けられた$post型(クラスPostとそれを継承したクラスSponsoredPost)をひとつづつ取り出し、processPostを用いてそれぞれにshow()メソッドで表示させています。 ----------------------- <?php class Post{ protected $text; public function __construct($text){ $this->text = $text; } public function show(){ printf('%s',$this->text); } class SponsoredPost extends Post{ private $sponsor; public function __construct($text, $sponsor){ parent::__construct($text); $this->sponsor = $sponsor; } public function show(){ printf('%s by %s', $this->text, $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('iPhone','Apple'); function processPost(Post $post){ $post->show(); } foreach($posts as $post){ processPost($post); ------------- クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。「15 型の継承について見ていこう」という項目では 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 と解説してあります。 クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。私の知っているデータ型(文字列型、整数型、浮動小数点数型、論理型、配列型、オブジェクト型、リソース型、NULL)は下記の2か所だけです。 show()メソッド内の、['%s']と['%s by %s']で文字列が指定されています。 したがってこの項目で説明されている 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 とは、「クラスを継承する際にプロパティやメソッドだけでなく、データ型、ここでは(['%s']と['%s by %s'])も継承されるということが説明されているという解釈でよろしいのでしょうか? 少し混乱しています。もし私の解釈が間違っているようでしたら教えてください。 初学者です。よろしくお願いいたします。 <表示結果>

    • ベストアンサー
    • PHP
  • javaでのコンストラクタの実行

    javaでのコンストラクタの実行 フィールドにHello a=new Hello(); とかいてメインメソッドにもHello b=new Hello(); とかくとaインスタンスとbインスタンスのどっちのコンストラクタが先に実行されるんですか? よろしくお願いします。

    • ベストアンサー
    • Java
  • コンストラクタすると同時にメソッドをオーバーロードするには?

    コンストラクタすると同時にメソッドをオーバーロードするには? リスナー関数でthisの参照先が変わってしまう問題に悩んでいます。 <!-- 方法(1) コンストラクタした後にメソッドを上書きする --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value){ this.value = value ? value : 'Hello, World!'; } Hello.prototype.start = function (event) { alert(this.value); } var world = new Hello(); var start = function (event) { world.start.call(world, event); }; // thisがworldを参照するようにstartメソッドを作り直す document.getElementById('Test').addEventListener('click', start, false); //--></script> 上記コードは期待通りの動作ですが、せっかくコンストラクタしたにも関わらず、メソッドを上書きしなくてはなりません。 コンストラクタした時点でstartメソッドが完成しているのが理想です。 (以下、全角空白は半角空白に置換してください) <!-- 方法(2) クロージャでメソッドを生成する --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value) {  function start (event) {   alert(this.value);  }  this.value = value ? value : 'Hello, World!';  this.start = (function(that){   return function (event) {    start.call(that, event);    that = null;   };  })(this); } var world = new Hello('Hello, World2!'); document.getElementById('Test').addEventListener('click', world.start, false); //--></script> こちらは完全に期待通りの動作を示しますが、prototype を使用していないのが少し気になります。 <!-- 方法(3) クロージャで prototype.start を上書きする --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value) {  this.value = value ? value : 'Hello, World!';  this.start = (function(that, start){   return function (event) {    start.call(that, event);    that = start = null;   };  })(this, this.start); } Hello.prototype.start = function start (event) {  alert(this.value); }; var world = new Hello('Hello, World2!'); document.getElementById('Test').addEventListener('click', world.start, false); //--></script> 結果としては期待通りのコードになったのですが、以下の点が気になっています。 ・方法(2)、方法(3) を比較すると、それぞれどのようなメリット、デメリットがあるのか。(prototypeが高速と聞いてからは (3) に傾いているのですが、よくわかっていません) ・コンストラクタ時に発動する特別なメソッド、プロパティが用意されているのか。 ・クロージャを使わずに解決できるのか。 ・全く別の方法(もっと良い実装)があるのか。 コードの書き方は千差万別だとは思いますが、主観で結構ですので、アドバイスいただければ幸いです。 # start() はサンプル故に短いコードですが、実際には比較的長いコードがある状態を想定しています。

  • PHP5でクラスを作成しています。

    PHP5でクラスを作成しています。 コンストラクタの段階で論理エラーにしたくて、インスタンス値をnullにしたいです。 つまり直ちにプログラムを止めずに、クラスの生成(インスタンス化)を失敗させる 方法を__construct()関数内でどのように書けば良いのでしょうか? class Sample { function __construct() { // この中で処理の異常が発生! // インスタンス作成を失敗させる or インスタンス値をヌルにする。 //? //?どのように書けば?? //? } } $a = new Sample(); if ($a === null) { printf("正しくインスタンスの生成ができませんでした。"); } よろしくお願いします。

    • 締切済み
    • PHP
  • PHP4でのSmarty派生クラスの定義について

    こんにちはよろしくお願いします。 PHP4でSmarty派生クラスを定義する方法を教えてください。 PHP5のサンプルコードで次のようなものがありました。 PHP4では,「private」が使えないらしいとか,「__construct」ではなくてクラス名がコンストラクタ名になるとかでうまくいかないようです。どのように修正すればよいのでしょうか? また,「__destruct」はどのようにすれば良いのでしょうか?コンストラクタ名とデストラクタ名が同じでよいのでしょうか? よろしくお願いします。 <?php require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("sqlite://localhost/samples.db"); } public function __destruct() { $this->_db->disconnect(); } public function getDb() {return $this->_db;} } ?>

    • ベストアンサー
    • PHP
  • constructorプロパティとオブジェクト関係

    JavaScriptのconstructorプロパティについて教えてください。 ・constructorプロパティは、内部プロパティ[[Construct]]と同義でしょうか? ・constructorプロパティが存在しない組込オブエジェクトは、「Global」「Math」「JSON」の三つだけ? ・上記以外の組込オブエジェクトは、全てnewできる、ということでしょうか? ・「new Object」「new Function」できるのは、constructorプロパティがあるから、という理解で合っているでしょうか?

  • php5のコンストラクタをphp4仕様に変えたいです。

    今日からつかえるPHP5サンプル集を使ってphpの練習をしています。 この中にDBを使った掲示板のサンプルがあり、DBの出入力をクラスファイルで行っています。 そのphp5の__constract()を使っている部分を、php4に対応した形にしようとして躓いています。 以下、コードです。一部編集しています。 【Article.class.php】 class Article { //*この部分を追加 function Article() { $this->__construct(); }// function __construct(){ /* コンストラクタ */ } var $_id; …中略 function getId(){return $this->_id;} …中略 function setId($id){$this->_id=$id;} …中略 function getArticleInfo($cnt,$num){ $aryArt=array(); $db=DB::connect("mysql~"); $rs=$db->query("SELECT * FROM bbs_master WHERE parent=0 ORDER BY sdat DESC LIMIT ".$cnt.",".$num); while($row=$rs->fetchRow(DB_FETCHMODE_ASSOC)){ $objArt=new Article(); $objArt->setId($row['id']); …中略 //*これ以下を実行するとieで"ページを表示できません。"が出る $aryTmp=Article::getChildArticleInfo($objArt->getId()); $objArt->setChild($aryTmp); $aryArt[]=$objArt; } return $aryArt; } function getChildArticleInfo($id){ …各記事の子記事を抽出するプログラム } return $aryArt; } } PEARの読み込みやDB接続は成功しているのは確認済みです。 上記コード中の再帰的にArticle::getChildArticleInfo($objArt->getId());を呼び出しているところで実行できなくなるようです。 これをphp4でも動作するように変更できないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • [PHP] デストラクタについて教えて下さい

    あるPHPの入門書にデストラクタについての解説があります。 *デストラクタ 「コンストラクタとは反対に、オブジェクトが破棄されるタイミングで実行されるのがデストラクタです。名前は __destructに固定されている。 デストラクタには、クラスの中で使用したリソースを破棄するなど、主に終了するときの処理を記述するのが一般的です。」 とあります。 以下のような記述をしました。(person.php) <?php class Person{ public $lastName; public $firstName;  public function __construct($lastName, $firstName){ $this->firstName = $firstName; $this->lastName = $lastName; } public function show(){ print "<p>私の名前は {$this->lastName} {$this->firstName}です。</p>"; } public function __destruct(){ print "<p>インスタンスが破棄されました。<p>";  } } ?> 上の記述をインスタンス化する記述です。(instancne.php) <?php require_once('person.php'); $p = new Person('田中', '幸太郎'); $p->show(); ?> <表示結果> 私の名前は 田中 幸太郎です。 インスタンスが破棄されました。 となります。試しにもうひとつインスタンスを追加します。 <?php require_once('person.php'); $p = new Person('田中', '幸太郎'); $p->show(); $p1 = new Person('鈴木', '京子'); $p1->show(); ?> <表示結果> 私の名前は 田中 幸太郎です。 私の名前は 鈴木 京子です。 インスタンスが破棄されました。 インスタンスが破棄されました。 説明にある、 「オブジェクトが破棄されるタイミングで実行されるのがデストラクタです。」 「デストラクタには、クラスの中で使用したリソースを破棄するなど、主に終了するときの処理を記述するのが一般的です。」 これらの意味がわかりません。 コンストラクタの 「new 演算子によってインスタンス化されるタイミングで実行される」 「プロパティの初期化」 などの意味は理解できているつもりです。 デストラクタを使うと「オブジェクトが破棄される」、「クラスの中で使用したリソースを破棄する」と ありますが、『一度インスタンスを作るとクラス内のリソースが破棄されるのかな?』と思い ためしにもう一つインスタンスを作成しました。上記の通り問題なく使えています。 膨大な記述になると、クラス、この場合は 「class Person」」は再利用出来なくすると言った意味になるのでしょうか? 他の教材やネットで検索してみたりしたのですが、イメージがつかめません。 以下のPHP公式のサイトから考えてみると、クラス内で参照できるものがなければ、コールされるという風に解釈できるかもしれませんが、意味がわかりません。 デストラクタ(__destruct)はコンストラクタ(__construct)の反対というように記述されているものもありますが余計に意味が分かりません。 初学者にもわかるようにデストラクタについて教えてもらえないでしょうか? またどういうケースで利用するのかもよく分かりません。 そのあたりも併せて教えて下さい。 宜しくお願いいたいます。 (参考) デストラクタ __destruct(): void PHP には、C++ のような他のオブジェクト指向言語に似たデストラクタの概念があります。 デストラクタメソッドは、 特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 あるいは、スクリプトの終了時にも順不同でコールされます。 https://www.php.net/manual/ja/language.oop5.decon.php

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトを privateプロパティ($_db)に設定しているのですが$_dbの値が アクセサメソッドを通じてgetすると空白になってしまいます。 色々やってみましたが理由が分からず、 ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。 なぜコンストラクタ外に出るとprivateプロパティの値が取得できなくなるのか分かりません。 どなたかご教示ください。 どうぞよろしくお願いします。 下記ソースです。 *(Smarty.classの派生クラス)********************************************** <?php require_once("DB.php"); require_once("Smarty.class.php"); class MySmarty extends Smarty{ private $_db; public function __construct(){ parent::__construct(); $this->template_dir="C:/xampp/modules/access_control/templates"; $this->compile_dir="C:/xampp/modules/access_control/templates_c"; $this->config_dir="C:/xampp/config"; $this->config_load("access_control.conf",basename($_SERVER['SCRIPT_NAME'],".php")); $tihs->_db=DB::connect($this->get_config_vars('db_string')); if (PEAR::isError($db)) { die($db->getMessage()); } } public function __destruct(){ $this->_db->disconnect(); } public function get_db(){return $tihs->_db;} } ?> *********************************************** *(メインのPHP)********************************************** <?php require_once("../../modules/access_control/class/MySmarty.class.php"); require_once("../../modules/access_control/class/name_search.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); ←ここで値が取得できない $o_smarty->assign("toolname",name_search::getToolName($db)); $o_smarty->display(basename($_SERVER['SCRIPT_NAME'],".php").".tpl"); ?> ***********************************************

    • ベストアンサー
    • PHP

専門家に質問してみよう