こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

同じ名前の変数…

数日前からPHPをはじめた者です。
クラス変数(という呼び方が適切かは??)と、その変数に値をセット/ゲットする関数を内包するクラスを作ってみたのですが、それに関してどうもピンと来ない部分があるので質問させてください。

以下がソースです。
class sample{

var $hensu;

function set_hensu($str){
$hensu = $str;
}

function get_hensu(){
return $hensu;
}

}

上記クラスを使って値のセット/ゲットをしようとしたのですが、結果は×でした。
ファンクション内の変数を、thisで指定するとうまく行きました。

最初に指定した変数と、ファンクション内の変数を同一のものだと認識させるには、ファンクション内でのthis指定の他に方法は無いのでしょうか?
もしくは、ファンクション内で書いた変数が新しい変数だと認識させない方法とか…。
無いなら諦めます。よろしくお願いします。

また、直接質問とは関係ないのですが、
どうしてPHPは変数名を書いただけで変数が作られてしまうのでしょう。メリットは何ですか?
分かりづらくて戸惑ってます。

投稿日時 - 2004-10-23 15:04:19

QNo.1053036

困ってます

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

> どうしてPHPは変数名を書いただけで変数が作られてしまうのでしょう。
PHP だけでなく Perl もです。変数定義のない言語もそれほど異質なものではありません。(そういった技術は可能ですし、それがわかりやすいという方もいます)
そもそも、変数定義は、その存在、型を明示化する、そして高速化することに意味があります。
PHP はスクリプト言語ですし、定義やらで回りくどい記述をするよりも、変数、関数も定義する必要のないよう設計されています。それが「PHPの仕様」です。
なぜ、という答えには「仕様だから」という答えしかありません。

様々な言語を学ばれているかのようにも思えますが、その書き方よりも、「言語」というものに触れてみてはどうでしょうか。


クラス内の変数の扱いのことですが、私からすれば逆に疑問を感じました。
変数定義をした方が分かりやすいと言っている方が、どうして変数の明示化を嫌うのかです。
ちなみに、function での変数を同一でないようにしたいという人がいたらどうでしょうか。新たな記述を設けなければいけません。

その前に、メンバ変数の扱いについてご存知でしょうか。
メンバ変数は、いわゆる普通の変数ではありません。クラス内で共有されたり、継承されたり・・・というものです。そのような変数が、一関数の明示されない記述によって同一化されたりしたらどうなるでしょうか。

そのため、PHP ではメンバ変数を this として与えます。(仕様です)
this で教えることがそれほど骨の折れることだと思いませんが、どうでしょう。

投稿日時 - 2004-10-24 01:02:15

お礼

こんにちは。ご回答ありがとうございます。

>クラス内の変数の扱いのことですが、私からすれば逆に疑問を感じました。
変数定義をした方が分かりやすいと言っている方が、どうして変数の明示化を嫌うのかです

ここは自分でも気づいてました^^;;
確かに矛盾してますね。返す言葉もありません…。
どうしてもいつも書いている言語の書き方を普通だと思ってしまっていたようです。
良くない事ですね^^;

>ちなみに、function での変数を同一でないようにしたいという人がいたらどうでしょうか。新たな記述を設けなければいけません。

その時に新たに定義するのが「普通」としていました…。

>その前に、メンバ変数の扱いについてご存知でしょうか。
メンバ変数は、いわゆる普通の変数ではありません。クラス内で共有されたり、継承されたり・・・というものです。そのような変数が、一関数の明示されない記述によって同一化されたりしたらどうなるでしょうか。

クラス内で共有化するものであるからこそ、
「普通」に使いたかったのです^^;


>そのため、PHP ではメンバ変数を this として与えます。(仕様です)
>this で教えることがそれほど骨の折れることだと思いませんが、どうでしょう。

例えば、var で変数を定義するときに、「これはクラス内共通だよ~」みたいな事を教えてあげられないのかな、と思ったのですが、無茶みたいですね^^;;
this…面倒ですが(笑)、読む人の事も考えたら明記してあげた方が良いですね。PHP以外でも。

>様々な言語を学ばれているかのようにも思えますが、その書き方よりも、「言語」というものに触れてみてはどうでしょうか。

この言葉、胸に響きました。
「何故こういう作りなのか」とか、歴史的背景などを考えてみると、納得できない事も無くなるのでしょうね。

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

投稿日時 - 2004-10-24 11:41:47

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

変数のスコープ(有効範囲)についての理解が不十分のように見受けます。
Cとか、JAVAとかのプログラミング経験があると直ぐ解るのですが、
basicとか、JavaScriptしか知らない、または全く始めてだと、
このあたりの理解にとまどうようですね。

PHP マニュアル(参考URLからダウンロードできます)の
anguage.variables.scope.html
「変数のスコープ」によれば

> 変数のスコープは、その変数が定義されたコンテキストです
つまり、関数内で使えば、localスコープを有するということです。
関数内でglobal変数(または、その外側に記述された変数)
を利用するには、global宣言したり、$GLOBALS[]配列を使用します。

global $a, $b;

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

参考URL:http://jp.php.net/download-docs.php

投稿日時 - 2004-10-23 17:01:38

お礼

回答ありがとうございます。
ローカル変数については理解しています。
(this指定の意味も解っています。当方Java経験者です)

関数内で指定した変数を関数外で使おうとは思っていません。逆の事がしたいのです。
新しく変数定義しないで、素直に利用だけしたいのです…。

変数を定義しなくても新しく作成されてしまうのが、解りづらいしメリットが感じられないのです。

大人しくthisで教えてあげるしかないんでしょうか。

投稿日時 - 2004-10-23 21:52:24