NEST :: laboratory RSSフィード

引っ越しました。

http://ginpen.com

基本的にこちらの内容は残しておきます。
ただいくつかの記事については向こうへ持って行こうと思っています。


カレンダー
<< 2007/07 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

本家はこちら: NEST http://nest.l-w-l.info

. archive / . bookmark

HTML, CSS, JavaScript中心に興味あることあれこれを扱う技術系blogです。昔はそうでなかったので、古いのには妙なものも混ざってるかもしれません。

なお全ては自分が理解した事の覚書的文書であるため、事実に反する場合があります。気付かれた方はご指摘頂ければと思います。

書いてる人 : 高梨ギンペイ@横浜でSEやってます。Twitter→@ginpei_jp

2007/07/04

[] PHPでオーバーライドすると、関係ないメソッドの動作が変わるかも

サブクラスでメソッドをオーバーライドし、そのメソッドを呼んでいるメソッドがスーパークラスにあると、そのメソッドの動作もが変わってしまう場合があるようだ。

<?php
class ClassA {
  function hoge() {
    print("hoge\n");
  }
  function callHoge() {
    $this->hoge();
  }
}
class ClassB extends ClassA {
  function hoge() {
    print("HOGE\n");
  }
}

$hoge = new ClassB();
$hoge->hoge();
$hoge->callHoge();
?>

出力結果:

HOGE
HOGE

PHPのクラスで自身のメソッドを利用する場合は$this->method()と書くのだが、この$thisは、インスタンスの自身を指すようだ。メソッド名だけを記述するとFatal error: Call to undefined functionになる。

ちなみに、やりたい事をC++で書くとこんな感じ。

#include<iostream>

using std::cout;
using std::endl;

class ClassA {
public:
  void hoge() {
    cout << "hoge" << endl;
  }
  void callHoge() {
    hoge(); // あるいはthis->hoge()でも同様
  }
};
class ClassB : public ClassA {
public:
    void hoge() {
    cout << "HOGE" << endl;
  }
};

int main() {
  ClassB *hoge = new ClassB();
  hoge->hoge();
  hoge->callHoge();
  delete hoge;
  return 0;
}

出力結果:

HOGE
hoge

クラスの自身を指すにはselfが使えるが、

  function callHoge() {
    self::hoge();
  }

と書いてもFatal error: Undefined class name 'self'となってしまう。どうやらselfはフィールドにだけ使えるらしい。でもClassBからparent::hoge()は使える。

  function callHoge() {
    ClassA::hoge();
  }

とクラス名を明示すれば期待通りに動くんだけど……。

だいたいなんで自身のメソッドを利用するのにオブジェクトやら名前空間やらが必要なんだ。メソッド名だけでアクセスさせてくれよ。何か方法があるのだろうか。

[] ツリー作成の再帰アルゴリズム

できた。

f:id:ginpei:20070705003243g:image
三つ並んでるのは実装上の都合です。

整形をどうするか悩んでいたけれど、やってみたら存外簡単だった。なんだ。