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

このQ&Aのポイント
  • 子クラスに独自の実装をする学習をしています。親クラス Post を継承する子クラス showSponsor を作成し、スポンサー名を表示するメソッドを追加しました。
  • しかし、新しいインスタンスを作成する際に発生したエラーを解決することができません。エラーメッセージは 'undefined constant ’Yahoo’ - assumed '’Yahoo’'' です。
  • 原因がわからず困っているので、エラーの原因と解決方法を教えてください。
回答を見る
  • ベストアンサー

[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
  • 回答数1
  • ありがとう数1

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

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

よく見てみると、'Yahoo'と記載の、先頭のシングルクォーテーションが、全角のようです。書き直してみてください。

blueletter12345
質問者

お礼

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

関連する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
  • 【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
  • メンバインスタンスへのアクセス方法

    クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。 PHPの文法がまだよくわからないのですが、次のようにやると、エラーになってしまいました。 <?php class Test {  var $member;  public function __construct() {   $member = new Hello();  }  public function test() {   $this->member->world();  } } class Hello {  public function world() {   echo 'hello world';  } } $test = new Test(); // $test->test();はエラーとなってしまう。 $test->test(); ?>

    • ベストアンサー
    • 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
  • インターフェイスと抽象クラスについて

    オブジェクト指向について学んでいます。 下記のように、単体でクラスを定義して各メソッドの実行する方法などは理解しているつもりです。 class Test { public function __construct() { // コンストラクタ } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $test = new Test(); $test->setName('太郎'); echo $test->getName(); // 太郎 ここまではいいのですが、インターフェイスと抽象クラスってどんな時に使うべきなのでしょうか? 簡単な例で使い方を紹介しているサイトはいくつかあるのですが実用性がないものばかりで、これらは本当に必要なものなのか?という疑問があります。。。 具体的に実用性がある例で使い方とメリットをおしえていただけませんでしょうか?

    • ベストアンサー
    • PHP
  • php クラスについて

    普通にデータベースに登録はなんとか出来たので、クラスを作って登録をしてみようと色々なサイトを見て疑問点があり質問をさせて頂きました。 public function userContent($id) { } ここの$idというとこがわかりません。 if文などでは条件式を書くところなのでしょうがクラスでは何を書くべきなのでしょうか。 サイトによっては public function userContent($id) みたいに書いてないときもあります。 クラスを呼び出すページで $user = DB::connect()->userContent($_SESSION['id']); こうした場合()の中には受け取る変数を書いていくという認識でよろしいのでしょうか? 例えば、 insertの場合id,title,textのカラムがあれば クラスを呼び出すページ $user = DB::connect()->userContent($id, $title, $text); クラスを書くページ public function userContent($id, $title, $text) でinsertの内容を書いていく。 という認識で間違いないでしょうか? 初歩的すぎて中々記事が見つからずご質問させて頂きました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP5でクラスを作成しています。

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

    • 締切済み
    • PHP
  • PHPのクラス継承において質問

    class SuperClass{ public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } } class SubClass extends SuperClass{ public function getSubClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } $obj = new SubClass(); print "<br />"; $obj -> getSuperClassName(); print "<br />"; $obj -> getSubClassName(); 上記のようなコードがあった場合、 出力結果は SubClass SuperClass //継承しているにもかかわらず、SuperClassという文字列が返る。 SubClass SubClass と上記のようになります この結果に一点疑問があるのですが、親クラスのメソッドは子クラスに継承されるんですよね? であれば親クラスの public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } の箇所の print __CLASS__; の記述箇所はSubClassとでなければいけないような気がします。 しかし結果はSuperClassとでますが、このメソッドは子クラスに継承されていないのですか? publicなら継承されるとマニュアルにかいてありましたが、どうなっているのでしょうか よろしくご教授御願い致します。

    • ベストアンサー
    • PHP
  • PHPのクラスで定数配列を作りたい

    こんばんわ。 PHP5.6で勉強しています。5.6を選んだのは事例が多いと思ったからです。 文字列の定数配列が作れるならば、クラスの定数配列も作れるだろうと思っていましたが うまくできません。 イメージ的には以下のような感じです。 クラスで定数配列を作成することはできますでしようか? class AnimalItem { protected $_eng ; protected $_jpn ; protected $_deu ; function __construct( $eng, $jpn, $deu ) { $this->_eng = $eng ; $this->_jpn = $jpn ; $this->_deu = $deu ; } } class Foo { // const ANIMALS = array( 'dog', 'cat', 'bird'); const ANIMALS = array( new AnimalItem( 'dog', '犬', 'Hund' ) ,new AnimalItem( 'cat', '猫', 'Katze' ) ,new AnimalItem( 'bird', '鳥', 'Vogel' ) ); }

    • ベストアンサー
    • PHP
  • singletonの使い方

    はじめまして。 singleton(GoF)で少し疑問に思ったところがありましたので、 アドバイスをいただけたらと思い質問させていただきます。 たとえば以下のようなプログラムですが、 ==form.html== <html> <body> <form action="./Main.php" method="post"> name:<br /> <input type="text" size="20" name="name" /><br /> text:<br /> <textarea rows="8" cols="40" name="text"></textarea><br /> <br /> <input type="submit" value="submit!" /> <input type="reset" value="reset!" /> </form> </body> </html> ==Main.php== <?php require_once "Data.php"; require_once "NullCheck.php"; $data =& Data::getInstance(); $data->setName($_POST["name"]); $data->setText($_POST["text"]); $nc = new NullCheck($data); $result = $nc->check(); if(!$result == ""){ echo $result; }else{ echo "ok"; } ?> ==Data.php== <?php class Data{ var $name; var $text; function &getInstance(){ static $instance; if(!isset($instance)){ $instance = new Data(); } return $instance; } function setName($name){ $this->name = $name; } function setText($text){ $this->text = $text; } function getName(){ return $this->name; } function getText(){ return $this->text; } } ?> ==NullCheck.php== <?php class NullCheck{ var $data; var $err = ""; function NullCheck($data){ $this->data = $data; } function check(){ if($this->data->getName() == ""){ $err .= "nameが空欄です。<br>"; } if($this->data->getText() == ""){ $err .= "textが空欄です。<br>"; } return $err; } } ?> 上記を作る際、 submitを押すたびにオブジェクトが作られるのは無駄だと思い、 singletonを使いました。 しかし、空欄チェックのときはnewでインスタンスを生成しています。 やはりこの場合もsingletonを使用したほうがいいのでしょうか? 仮にもっと複雑な問い合わせフォームを作成し、 利用者が多くなった場合、 いろいろとインスタンス化(空欄チェックや文字列チェック等)すると オブジェクトがたくさんできてしまい負荷がかかるで、 できる限り不必要なインスタンス化は避けたいと思っています。 長々と書いてしまい申し訳ありませんが、 なにとぞよろしくお願いします。

    • ベストアンサー
    • PHP