[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

# クラス関数とオブジェクト関数で名前を変えろというのは
# 正当な意見だとは思っています。