Locked History Actions

Diff for "php/horibble"

Differences between revisions 2 and 3
Deletions are marked like this. Additions are marked like this.
Line 10: Line 10:

== 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();」などとするとエラーが発生してしまう。

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();」などとするとエラーが発生してしまう。