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

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

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

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

862閲覧

サブクラスの「例外の発行」がうまくいかない原因を教えて下さい

blueletter5

総合スコア24

PHP

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/09/13 06:49

PHPの入門書【「初めてのPHP」オライリー・ジャパン P104 *オブジェクトの拡張】
を進めています。
下記に記述しているEntree.phpなのですが、例外を2か所に発行しています。

class Entree内のコンストラクタ内の

php

1if(! is_array($ingredients)){ 2 throw new Exception('$ingredientsは配列にしてください'); 3 }

とサブクラス class ComboModel extends Entree内の

php

1public function __construct($name,$entrees){ 2 parent::__construct($name, $entrees); 3 foreach($entrees as $entree){ 4 if(! $entree instanceof Entree){ 5 throw new Exception ('Elements of $entrees must be Entree objects'); 6 } 7 }

の2か所です。例外の補足は一か所だけです。

php

1try{ 2 3}catch (Exception $e){ 4 echo $e->getMessege(); 5}

試しにインスタンスの引数をarray以外に変更すると

php

1$soup = new Entree('Chicken Soup','chicken');

第2引数は配列(array)ではないので
<表示結果>

php

1$ingredientsは配列にしてください

とちゃんと例外が処理されています。

ところが2つめのclass ComboModel extends Entree内の例外ですが、
コンストラクタの2つめの引数$entreesはクラスEntree内にあるオブジェクトでは
ないので例外が発行され、

Elements of $entrees must be Entree objects
と表示されないといけないと思うのですが、
実際の表示は
<表示結果>

php

1Sandwich contains chicken. 2Sandwich contains bread. 3Something in the combo contains chicken.

と何事もなく処理されています。

例外が2つ発行され処理が1カ所だけなのが原因なのでしょうか?
タイプミスなど何度か見返したのですが間違いは見つかりませんでした。
最初のclass Entree内の例外はちゃんと通知されるのに、
サブクラス、class ComboModel extends Entree内コンストラクタの例外は無視されているのは何が原因なのでしょうか?

わかる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

(Entree.php)

php

1<?php 2 3class Entree{ 4 public $name; 5 public $ingredients = array(); 6 7 public function __construct($name, $ingredients){ 8 if(! is_array($ingredients)){ 9 throw new Exception('$ingredientsは配列にしてください'); 10 } 11 $this->name = $name; 12 $this->ingredients = $ingredients; 13 } 14 15 public function hasIngredient($ingredient){ 16 return in_array($ingredient, $this->ingredients); 17 } 18} 19 20 21class ComboModel extends Entree{ 22 23 public function __construct($name,$entrees){ 24 parent::__construct($name, $entrees); 25 foreach($entrees as $entree){ 26 if(! $entree instanceof Entree){ 27 throw new Exception ('Elements of $entrees must be Entree objects'); 28 } 29 } 30 } 31 32 public function hasIngredient($ingredient){ 33 foreach ($this->ingredients as $entree){ 34 if($entree->hasIngredient($ingredient)){ 35 return true; 36 } 37 } 38 return false; 39 } 40 41} 42 43try{ 44 45$soup = new Entree('Chicken Soup',array('chicken, water')); 46$sandwich = new Entree('Chicken Sandwich', array('chicken','bread')); 47 48 foreach(['chicken','lemon','bread','water'] as $ing){ 49 if($soup->hasIngredient($ing)){ 50 print "Soup contains $ing.\n"; 51 echo "<br>"; 52 } 53 if($sandwich->hasIngredient($ing)){ 54 print "Sandwich contains $ing.\n"; 55 echo "<br>"; 56 } 57 58 } 59 60$combo = new ComboModel('Soup + Sandwich',array($soup, $sandwich)); 61 62 foreach(['chicken','water','pickles'] as $ing){ 63 if($combo->hasIngredient($ing)){ 64 print "Something in the combo contains $ing.\n"; 65 echo "<br>"; 66 } 67 } 68 69}catch (Exception $e){ 70 echo $e->getMessage(); 71} 72 73?>

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

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

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

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

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

maisumakun

2021/09/13 07:22

> コンストラクタの2つめの引数$entreesはクラスEntree内にあるオブジェクトでは ないので例外が発行され、 それを試してみたコードを提示していただけますか?
guest

回答1

0

ベストアンサー

もっとシンプルな例で試してみるとよいでしょう

PHP

1class a{ 2 public function __construct(){ 3 throw new Exception('test1'); 4 } 5} 6 7 8class b extends a{ 9 public function __construct($num=null){ 10 if(!$num) parent::__construct(); 11 throw new Exception ('test2'); 12 } 13} 14 15try{ 16 $x = new b(0); 17}catch (Exception $e){ 18 echo $e->getMessage(); 19} 20try{ 21 $x = new b(1); 22}catch (Exception $e){ 23 echo $e->getMessage(); 24}

投稿2021/09/13 10:34

yambejp

総合スコア114883

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問