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

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

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

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

Q&A

2回答

1540閲覧

動的に生成したオブジェクト変数に関数を追加する方法

Clementine

総合スコア157

PHP

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

0グッド

2クリップ

投稿2019/03/05 04:44

表記の件につきまして質問いたします。

php

1class Sample 2{ 3 public function __call($name, $args) 4 { 5 if ($name == 'hello') { 6 return 'Hello '.$args."\n"; 7 } 8 } 9 10 public function getItem() 11 { 12 $attr = [ 13 'a' => 123, 14 'b' => 456, 15 'c' => 789, 16 ]; 17 18 return (Object)$attr; 19 } 20 21} 22$sample = new Sample(); 23$obj = $sample->getItem(); 24 25$obj->hello('Mike');

「Hello Mike」の出力する方法を調べています。
上記のソースだと「__call」は「$obj」ではなく「$sample」が対象となっているのは理解していますが、
動的に生成した「$attr」を対象とする方法が見つかりません。

何卒、ご教授の程、お願いします。

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

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

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

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

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

m.ts10806

2019/03/05 04:53

無理、な気がします。Sampleクラスから離れた単なるオブジェクトなわけですし。 この「動的に生成したオブジェクト」を利用したい背景とか経緯、大目的部分を具体的に記載いただけますか?
Clementine

2019/03/05 04:58

コメントありがとうございます。 本件の目的・経緯につきましては諸事情により記載は控えさせて頂きます。
papinianus

2019/03/05 05:04

> 動的に生成した「$attr」を対象とする方法 ここのところが理解ができません。たぶんstdClassに__callをもたせる、っていう方向性はなかなか厳しいものがある(言語仕様的に絶対無理かどうか分かりません)と思うのですが、$attrを対象にhelloを呼ぶというのをもうちょっと噛み砕いていただけませんか? もしくは、getItemをするときに、Sampleクラス(か何か自作の別クラス)を返すようにしてはダメなのでしょうか?この辺の制限も追記していただけないでしょうか?
m.ts10806

2019/03/05 05:12

なるほど。では具体的な回答も控えさせていただきます。 それだけ要件不明瞭ということになります。(「できません」って回答ならできますが)
guest

回答2

0

(object)$attrのようにして生成するオブジェクトは、stdClassのインスタンスとなっていて(PHPリファレンス)、自分でメソッドを追加することはできません

特殊な機能性をもたせたいのであれば、(object)キャストは使わず、自前でクラスを立てて、そのインスタンスを返すようにしてください。

投稿2019/03/05 05:05

maisumakun

総合スコア145183

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

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

0

まず、マジックメソッドについて公式マニュアルをよく読んで下さい。
http://php.net/manual/ja/language.oop5.overloading.php#object.call

関数を追加するわけではなく、「クラスに定義されていないメソッドが呼ばれた場合の処理」を受け持たせているだけです。
今回の場合だと、"a"をクラス名とする"123"メソッドのように呼ばれた場合の処理を記述しておく必要があります。
当然ながら、class aは事前に定義が必要です。

あと、課題は自分でやって下さい。
わからなければ授業の担当者に質問して下さい。

投稿2019/03/05 04:54

編集2019/03/05 04:57
kunai

総合スコア5405

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問