[PHP]オーバーライドでの呼び出したメソッドはだれのか?

PHPでのオーバーライドでの親子メソッド呼び出しで
混乱したので整理。

まず、普通のoverride


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        echo 'Bです';
    }
    public function test() {
        $this->who();
    }
}

$cls = new B();
$cls->test();

// [実行結果]
// Bです

まだ、Aのメソッドは一つも呼び出されていません。

test()を親クラスのtest()に変えてみると


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        echo 'Bです';
    }
    public function test() {
        parent::test();
    }
}

$cls = new B();
$cls->who();

// [実行結果]
// Bです

これもBのwho()が呼び出されます

クラスBから、Aのwho()が呼びたいなら


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        parent::who();
        //echo 'Bです';
    }
    public function test() {
        parent::test();
    }
}

$cls = new B();
$cls->who();

// [実行結果]
// Aです

これで、親クラスのwhoメソッドが呼ばれます

そして、staticの場合


class A {
    public static function who() {
        echo 'Aです';
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo 'Bです';
    }
    public static function test() {
        parent::test();
    }
}

// [実行結果]
// Aです

BからAのtestを呼ぶ、self::who()はAのwho()となります

overrideしたBのwho()としたいなら
遅延静的束縛 (Late Static Bindings)ってのですね
(PHP5.3以降じゃないと効かないです)


class A {
    public static function who() {
        echo 'Aです';
    }
    public static function test() {
        static::who();
    }
}

class B extends A {
    public static function who() {
        echo 'Bです';
    }
    public static function test() {
        parent::test();
    }
}

// [実行結果]
// Bです

self::でなくてstatic::にしてやると
overrideが効きます

遅延静的束縛を忘れかけてました..

centosでxhprofをインストールしてみる

centosでxhprofをインストールしてみます

<環境>
Centos 6.3
Apache 2.2
PHP 5.3

pecl install xhprof
だとエラーがでたので
pecl install xhprof-0.9.3

で、すんなりはいりました

php.iniに
extension=xhprof.so
を追記

Apache読み込み直し
/etc/init.d/httpd reload

phpinfoを確認、xhprofが増えていれば成功

xhprofを動かしてみる

xhprofを動かしてみる

インストールはこちらから
Windows http://blog.bgbgbg.net/archives/479
Linux http://blog.bgbgbg.net/archives/491

Apacheの公開フォルダで
git clone git://github.com/facebook/xhprof.git xhprof

今回は、公開フォルダ直下に設置

ブラウザで
http://(サーバーのIP)/xhprof/examples/sample.php
にアクセス
なにやら配列が表示されます

http://(サーバーのIP)/xhprof/xhprof_html/
にアクセス

xhprof_display

で見れます

Windowsの場合は
php.iniに追加で
xhprof.output_dir = “D:/Apache/htdocs/xhprof/tmp”
などと出力先を指定、フォルダを作ってあげないとエラーがでます

実際に使うときは、評価したいトップのPHPファイルにexamples/sample.php
を参考に記載してやればO.K.

Callgraphをみるとエラーが…
dot-Tpngとかが動かない?

yum install graphviz graphviz-gd
でgraphvizをインストールすると
みれた!

xhprof_callgraph

Windowsは、エラーひっかかる..
またトライします

windowsでxhprofを使う

Windows環境でxhprofを使ってみます

<環境>
Windows XP
Apache 2.2
PHP 5.3

ソースをコンパイルしてDLL作らないとない…?と思ったら見つけました

http://dev.freshsite.pl/php-extensions/xhprof.html

自分の環境にあったものをダウンロード

phpをインストールしたフォルダのなかの
extフォルダに保存

php.iniを開き、
extension=xhprof_0.10.3_php53_vc9.dll
と記載(落としてきたものにあわせて)

windowsキー+r でコマンドプロンプト起動
httpd -k restart
でApache再起動

Apache公開フォルダに
phpinfo.php
ファイルを作成


<?php
phpinfo();

と記載

ブラウザで「http://localhost/phpinfo.php」を表示

xhprof

xhprofが出てきてれば成功