1
<?php
class A {
    var $name= 'A';
    function main($objC){
        var_dump($this);B::request('init', $objC);
    }

}
class B {
    var $name= 'B';
    function request($func, $objC){
        if (method_exists($objC, $func)){
            var_dump($this);$objC->$func($this);
        }
    }

}
class C {
    var $name= 'C';
    function init($pobj){       
        var_dump($this);
    }
}
$objA =  new A;
$objB = new B;
$objC = new C;
$objA->main($objC);

出力:

object(A)[1]
  public 'name' => string 'A' (length=1)

object(A)[1]
  public 'name' => string 'A' (length=1)

object(C)[3]
  public 'name' => string 'C' (length=1)

$thisClass B常にそのオブジェクトを意味すると考えましたClass Bvar_dump($this);しかし、そうではないようですclass B、誰でも説明できますobject(B):

object(A)[1]
      public 'name' => string 'A' (length=1)
4

1 に答える 1

1

完全なエラー ログを有効にしてこれを実行すると、その理由が説明されます。

厳格な基準: 6 行目の /php/tests/o2.php の互換性のないコンテキストから $this を想定して、非静的メソッド B::request() を静的に呼び出すべきではありません

基本的に、静的に呼び出されるメソッドで $this を使用しても意味がないため、PHP は実際にコンテキストを適用しようとします....呼び出し元のメソッドから $this を適用するように見えます

于 2013-08-21T09:39:08.280 に答える