Locked History Actions

Diff for "php/horibble"

Differences between revisions 5 and 6
Deletions are marked like this. Additions are marked like this.
Line 68: Line 68:

== PHP処理系実装が低レベル ==

 * require_onceに失敗すると、なぜかapacheのログに「an unknown filter was not added: PHP」というログが残される。どのrequire_onceが失敗しているのか一切不明。

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の時点では修正されていない。これを知らないとかなりハマることになる。

PHP処理系実装が低レベル

  • require_onceに失敗すると、なぜかapacheのログに「an unknown filter was not added: PHP」というログが残される。どのrequire_onceが失敗しているのか一切不明。