12

親の静的関数から子関数を呼び出すにはどうすればよいですか?

php5.3には、get_called_class()親クラスから子メソッドを呼び出すために呼び出される組み込みメソッドがあります。しかし、私のサーバーはphp5.1で実行されています。

これを行う方法はありますか?

静的関数から呼び出したい。「$this」が使えないように

だから私は「自己」キーワードを使用する必要があります。

以下の例では、私の親クラスは「Test123」です。親クラスの静的関数「myfunc」から、この「self :: test();」のような子クラス関数を呼び出そうとしています。

abstract class Test123
{

  function __construct()
  {
    // some code here
  }

  public static function myfunc()
  {
    self::test();
  }

  abstract function test();
}

class Test123456 extends Test123
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}

$fish = new Test123456();
$fish->test();
$fish->myfunc();
4

3 に答える 3

23

編集:あなたが達成しようとしていることは、PHP 5.1では不可能です。PHP 5.1 には最新のスタティック バインディングはありません。子関数を呼び出すには、子クラスに明示的に名前を付ける必要がTest123456::test()あります。 PHP 5.1 で。selfTest123Test123static

関連: new self vs new static ; PHP 5.2 は Late Static Binding (新しい静的) と同等ですか?


静的な親関数を参照している場合は、php 5.1 で関数呼び出しの親 (または子) を明示的に指定する必要があります。

parentClass::func();
Test123456::test();

PHP 5.3 では、代わりにstaticキーワードPHP Manualを使用してこれを実行し、呼び出されたクラスの名前を解決できます。

static::func();
static::test();

それらが静的でない場合は、$this PHP Manualを使用してください:

$this->parentFunc();
$this->childFunc();

または、同じ名前の場合は、parent PHP Manualを使用します。

parent::parentFunc();

(これはまさにあなたが求めたものではなく、完全を期すためにここに置いているだけです)。

Get_called_class() は、遅い静的バインディングのような非常に特殊なケースのために導入されましたPHP Manual .

オブジェクトの継承PHP マニュアルを参照してください。

于 2011-07-13T12:03:21.833 に答える
0

親/子、クラス/オブジェクト、関数/メソッドについて少し混乱していると思います。

Ionus G. Stan は、親クラスで宣言されていないメソッドを呼び出す方法の説明を提供しました (彼が言うように、これは抽象的であるか、__call() メソッドを実装する必要があります)。

ただし、子クラスでオーバーライドされたメソッドを親から呼び出す方法を意味する場合、それは不可能です-また、すべきではありません。検討:

Class shape {
 ...
}

Class circle extends shape {
  function area() {

  }
} 
Class square extends shape {
  function area() {

  }
}

'shape' のインスタンス (area メソッドを持たない) で area メソッドを呼び出すことが意図されている場合、どの子を使用する必要がありますか? 両方の子メソッドは、形状クラスによって一般的でない/実装されていないプロパティに依存します。

于 2011-07-13T12:07:56.637 に答える
0

これを試して:

<?php
 class A {
 public static function newInstance() {
$rv = new static();  
return $rv;
}

public function __construct() { echo " A::__construct\n"; }
}
class B extends A {
public function __construct() { echo " B::__construct\n"; }
} 
class C extends B {
public function __construct() { echo " C::__construct\n"; }   
}
?>
于 2011-07-13T12:48:33.603 に答える