4

アプリケーションで一般的な CRUD に使用する親オブジェクトがあります。これには基本的な保存および取得メソッドがあるため、すべてのオブジェクトにそれらを再含める必要はありません。私の子オブジェクトのほとんどは、この基本オブジェクトを拡張します。これはうまくいきましたが、シリアル化された子オブジェクトを取得する際に問題が見つかりました。親オブジェクトで「取得」メソッドを使用して、子のインスタンスを作成し、シリアル化されていない子のプロパティからそれ自体を設定します。これは、オブジェクトを「自己非シリアル化」できることを意味します。

唯一の問題は、子オブジェクトに保護されたプロパティまたはプライベート プロパティがある場合、親オブジェクトはそれを読み取ることができないため、取得中に取得されないことです。

したがって、「自己非シリアル化」するより良い方法、または親オブジェクトが保護されたプロパティを「見る」ことを許可する方法を探していますが、取得プロセス中のみです。

コードの例:

BaseObject {

 protected $someparentProperty;

 public function retrieve() {

  $serialized = file_get_contents(SOME_FILENAME);
  $temp = unserialize($serialized);
  foreach($temp as $propertyName => $propertyValue) {
    $this->$propertyName = $propertyValue;
  }     

 }

 public function save() {

    file_put_contents(SOME_FILENAME, serialize($this));
 }
}

class ChildObject extends BaseObject {

 private $unretrievableProperty;  

 public setProp($val) {
    $this->unretrivableProperty = $val;
 }
}

$tester = new ChildObject();
$tester->setProp("test");
$tester->save();

$cleanTester = new ChildObject();
$cleanTester->retrieve();
// $cleanTester->unretrievableProperty will not be set

EDITED:「プライベート」ではなく、保護された子プロパティと言うべきでした。

4

4 に答える 4

3

このようにしてみてください:

abstract class ParentClass
{
  protected abstract function GetChildProperty();

  public function main()
  {
    $value = $this->GetChildProperty();
  }
}

class ChildClass extends ParentClass
{
  private $priv_prop = "somevalue";

  protected function GetChildProperty()
  {
    return $this->priv_prop;
  }
}
于 2011-01-19T16:49:42.587 に答える
0

$this->unretrievableProperty を返す子オブジェクトの getProperty() 関数はどうですか

于 2010-08-14T16:36:26.800 に答える
0

同じクラスの可視性ポリシーが継承/親クラスに適用されるようには見えません。PHPのドキュメントはこれに対処していません。

取得メソッドを静的に宣言し、現在の「自己非シリアル化」アプローチではなく、静的呼び出しを介して $cleanTester を取得することをお勧めします。

static function retrieve() {
  $serialized = file_get_contents(SOME_FILENAME);
  return unserialize($serialized);
}

[...]

$cleanTester = BaseObject::retrieve();

または、__get()メソッドを利用してアクセスできないプロパティにアクセスすることもできます...これをクラスに追加して、BaseObject保護されたプロパティを子クラスから取得できると思います。同じクラスの可視性ポリシーを適用する必要があるため、メソッド private または protectedBaseObjectを定義できます。__get()

BaseObject {
  private function __get($propertyName) {
    if(property_exists($this,$propertyName))
      return $this->{$propertyName};

    return null;
  }
于 2010-08-14T16:46:53.210 に答える
0

これを修正する最善の答えは、リフレクションを使用することです。

例:

$_SESSION[''] = ''; // init

class Base {
    public function set_proxy(){
        $reflectionClass = new ReflectionClass($this);
        $ar = $reflectionClass->getDefaultProperties();

        !isset($ar['host'])  or  $_SESSION['host'] = $ar['host'];
    }
}

class Son1 extends Base {
    private $host = '2.2.2.2';
}

class Son2 extends Son1 {

}


$son1 = new Son1();
$son1->set_proxy(); 
var_dump($_SESSION); // array(2) { [""]=> string(0) "" ["host"]=> string(7) "2.2.2.2" }

unset($_SESSION);
$_SESSION[''] = ''; // init

$son2 = new Son2();
$son2->set_proxy(); 
var_dump($_SESSION); //  array(1) { [""]=> string(0) "" }
于 2015-05-10T18:59:11.567 に答える