Deletions are marked like this. | Additions are marked like this. |
Line 61: | Line 61: |
=== クラスの継承をおこなう場合に、その書き順に注意しないとclass not foundになる。 === これは明らかにバグと言えるが、少なくともphp5.1の時点では修正されていない。これを知らないとかなりハマることになる。 * [[http://ml.php.gr.jp/pipermail/php-users/2004-December/024440.html]] * [[http://d.hatena.ne.jp/harux/20041203#p1]] |
phpはヒドイ
phpのプログラムは本当にヒドイ。ヒドイ理由は二つある。
- phpプログラムを書いてるやつがヒドイ
- phpの言語仕様がヒドイ
以下、この二つの面から検証してみる。
phpプログラムを書いてるやつがヒドイ
phpプログラムを記述している者は、ほとんどがプログラミングの基礎的知識も持ちあわせていない、ド素人ばかりである。 これはもちろん私の経験上というだけの話であるが、しかし友人の話を聞いてみても、皆が皆口を揃えて言うのだから間違い無いところであろう。
どのようにヒドイかと言えば。。。。(これから記述予定)。
phpの言語仕様がヒドイ
メンバ変数・関数にアクセスするためには、必ず$this->を記述する必要がある
$a = 1; // ※1 function sample() { // ※2 } class Test { private $a; function test() { $a = 2; sample(); } function sample() { } }
などとし、test関数を呼び出すと、「private $a」には何も代入されない。 そうではなく、この場合グローバル変数である※1の$aに代入されてしまう。 Testクラス内のメンバー関数内でメンバー変数にアクセスするためには「$this->a = 2;」とする必要があるのである。
もし※1が定義されていない場合にtest()関数内で「$a = 2;」とすると、test()関数内のローカル変数が勝手に生成されてしまう。
また、「sample();」も同様に、メンバー関数ではなく、※2を呼び出してしまう。 正しくは「$this->sample();」としなければならない。
このように、phpの「クラス」なるものは、およそスコープというものがデタラメなのである。
変数が勝手に作成されてしまう
さらに、「$this->」をつけていても、問題の発生する場合がある。 上記の例で、宣言されていない変数を参照することができてしまうのである。 つまり、「$this->abc = 2;」とすると、勝手にクラスのメンバとしてabcが宣言されてしまい、エラー等は発生しない。 このため、せっかくメンバ変数の宣言機能があるにも関わらず、何の役割も果たしていないと言ってよい。
メンバ関数の方はさすがに勝手に宣言するわけにはいかないので「$this->hello();」などとするとエラーが発生してしまう。
クラスの継承をおこなう場合に、その書き順に注意しないとclass not foundになる。
これは明らかにバグと言えるが、少なくともphp5.1の時点では修正されていない。これを知らないとかなりハマることになる。