[PHP-users 9142] クラス関数とオブジェクト関数で同一名を使うには?
Mashiki
php-users@php.gr.jp
Mon, 05 Aug 2002 23:36:22 +0900
mashikiです。いつもお世話になっています。
PHPのクラス内の関数において、
「Class名::メソッド名()」の形式でクラス関数として呼び出されたのか、
「$obj->メソッド名()」の形式でオブジェクト関数として呼び出されたのか、
判別する方法はあるでしょうか?
「Class名::メソッド名()」の場合、マニュアルに
「$this を使用することはできません。」と記述されていたので、
$thisがセットされているかで判断しようと思いましたが、
以下のような簡単な例ではうまくいくのですが、
もう少し複雑なプログラムになると、「Class名::メソッド名()」
で呼び出しても、$thisにまったく関係ない別のクラスが入っていたり
してうまくいきませんでした。
マニュアルに載っている「$this を使用することはできません。」の
くだりは、「使用してはいけません」のようです。
<?php
class ClassA {
var $key, $val;
function ClassA($key) {
static $val=0;
$this->key = $key;
$this->val = ++$val;
}
function &getA ($key='AUTO') {
static $rA;
// オブジェクトなら自分自身を返し、クラスなら
// 同じキーのオブジェクトがあればそのオブジェクトを返す。
// 無ければオブジェクトを作成してそれを返す。
if (!isSet($this)) { // ★この行で判断したい
if (!isSet($rA[$key])) {
$rA[$key] =& new ClassA($key);
}
return $rA[$key];
} else {
return $this;
}
}
function printA() {
print_r($this);
}
}
echo "<pre>";
echo "1\n";
$a = ClassA::getA('key1');
$a->printA();
echo "2\n";
$b = ClassA::getA();
$a->printA();
$b->printA();
?>
環境
php4.2.2
apache1.3.26
MiracleLinux2.0
# クラス関数とオブジェクト関数で名前を変えろというのは
# 正当な意見だとは思っています。