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

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

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

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

Q&A

1回答

732閲覧

PHPのコードに関する質問

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

1グッド

0クリップ

投稿2020/02/04 09:22

パーフェクトPHPを使って学習中なのですが、オーバーロードのところで少し疑問に思ったことがありました。
__get()の中のif文の中は、該当する配列の要素がなかったらエラーを返すということでしょうか?
そのあとのreturn文はなんのためにあるんでしょうか??
__set()のところもなんかよくわかりません。
噛み砕いて教えて欲しいです。

php

1<?php 2 3class SomeClass { 4 5 private $values = array(); // privateな値を保存するコンテナ 6 7 // privateなコンテナへのアクセサ(getter) 8 9 public function __get($name) { 10 11 echo "get: $name",PHP_EOL; 12 if (!isset($this->values[$name])) { 13 throw new OutOfBoundsException($name . "not found."); 14 } 15 16 return $this->values[$name]; 17 18 } 19 20 // privateなコンテナへのアクセサ(setter) 21 22 public function __set($name,$value) { 23 24 echo "set: $name setted to $value",PHP_EOL; 25 $this->values[$name] = $value; 26 27 } 28 29 public function __isset($name) { 30 31 echo "isset: $name", PHP_EOL; 32 return isset($this->values[$name]); 33 34 } 35 36 public function __unset($name) { 37 38 echo "unset: $name", PHP_EOL; 39 unset($this->values[$name]); 40 } 41 42 public function __call($name,$args) { 43 44 echo "call: $name", PHP_EOL; 45 46 // アンダースコアをつけ、メソッド名とする 47 48 $method_name = "_" . $name; 49 if(!is_callable(array($this,$method_name))) { 50 throw new BadMethodCallException($name . "method not found."); 51 } 52 53 return call_user_func_array(array($this,$method_name),$args); 54 } 55 56 public static function __callStatic($name,$args) { 57 58 echo "callStatic: $name", PHP_EOL; 59 60 $method_name = "_" . $name; 61 if(!is_callable(array("self",$method_name))) { 62 63 throw new BadMethodCallException($name . "method not found."); 64 } 65 66 return call_user_func_array(array("self",$method_name),$args); 67 } 68 69 private function _bar($value) { 70 71 echo "bar called with arg '$value'", PHP_EOL; 72 } 73 74 private static function __staticBar($value) { 75 76 echo "staticBar called with arg '$value'", PHP_EOL; 77 } 78 79 80} 81 82// 以下テストケース 83$test = new SomeClass(); 84$test->foo =10; 85var_dump($test->foo); 86var_dump(isset($test->foo)); 87var_dump(empty($test->foo)); 88unset($test->foo); 89var_dump(isset($test->foo)); 90$test->bar('baz'); 91SomeClass::staticBar('baz');
abababaa👍を押しています

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

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

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

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

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

m.ts10806

2020/02/04 10:12

教えてもらいたいのに退会するんですか?
m.ts10806

2020/02/04 10:13

パーフェクトPHPには何も解説が書いてませんでしたか?
m.ts10806

2020/02/04 10:13

PHPマニュアルで機能確認してみましたか?
guest

回答1

0

まずマジックメソッドの項を読んで理解を深めましょう。
そこに提示の__get()__set()もあります。

まずは本来の意味をPHPマニュアルでおさえましょう。

該当する配列の要素がなかったらエラーを返すということでしょうか?

「エラー」って結構曖昧な表現です。
コード見たまま表現しましょう。「OutOfBoundsExceptionを投げる」です。
マニュアルの通り「値が有効なキーでなかった場合にスローされる例外」です。

getするためにはsetされてないといけませんから、setされてない情報をgetしようとしたということでExceptionに落とすわけですね。参照できないわけですし。

そのあとのreturn文はなんのためにあるんでしょうか??

"get"ですから、取得出来たらその結果を呼び出し元に返さなければなりません。

__set()のところもなんかよくわかりません。

setしてます(これ以上かみ砕きようがないですけど)

PHPマニュアルより

__set() は、 アクセス不能(protected または private)または存在しないプロパティへデータを書き込む際に実行されます。`

書籍のコードだとは思いますが、ところどころechoで「何をしているか」が書かれています。
確かに実際の開発時には不要となる記述ではありますが、折角書いてくれているのですし、しっかり読みましょう。

投稿2020/02/04 11:30

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問