0

クラスaでは、setter定義されています。classbを拡張する classaには、クラスが参照できないprivate変数があります。このコードの in クラスは、変数に到達できないため、最初の値とは異なる値に変数を設定するaことsetterはありません。このコードを実行すると、ケース A に対して が出力されます。atest0

ただし、ケース B を実行するExceptionと、プロパティtest2が存在しないというメッセージが表示されます。

<?php

error_reporting(E_ALL);
ini_set('display_errors', true);

class a {
    public function __set($prop, $value) {
    if((!property_exists($this, $prop))) {
      $className = get_called_class();
      throw new Exception("The property `{$prop}` in `{$className}` does not exist");
    }
    $this->$prop = $value;
    return true;
  }
}

class b extends a {
    private $test = 0;

    public function getTest() {
        return $this->test;
    }
}

// Case A
$b = new b;
$b->test = 1;
echo $b->getTest();

// Case B
$b = new b;
$b->test2 = 2;

私の質問は、クラスaが実際に変数testを認識できず、その値を設定できない場合、エラー、例外、警告、または小さな通知さえも表示されないのはなぜですか?

これは、実際のプロジェクトで私に起こった状況であり、エラーが生成されず、コードが論理的に正しいように見えるため、見つけるのが困難でした。では、今後この種のミスを防ぐにはどうすればよいでしょうか。

4

1 に答える 1

0

classbは classaを継承している__set()ため、 class からメソッドを継承していaます。これは、プロパティを設定しようとすると、コードbb実行されることを意味します__setget_called_class()プロパティの外部に値をエコーすることで、これをテストできます。

于 2015-02-02T08:48:22.840 に答える