Question

J'ai une classe de modèle (évidemment, il étend Doctrine_Record) que « agit comme » un modèle personnalisé.

Je veux obtenir des valeurs comme ceci: "echo $ Record-> virtual_field". Est-il possible de passer outre la méthode getter dans mon modèle personnalisé pour fournir une réponse personnalisée, puis passer soit sur la demande de la classe parente ou non?

En d'autres termes, est-il un moyen de passer outre Doctrine_Record :: __ get () à partir d'un modèle connexe?

Était-ce utile?

La solution

Ok. Je suppose que vous ne parlez pas de comportement réel 'ACTAS de modèles.

Si vous définissez une nouvelle méthode __get (), il remplace automatiquement la méthode __get des parents ().

Dans votre nouvelle méthode __get (), vous devez d'abord vérifier si elle existe dans votre instance en cours, puis. Du parent

Je piraté cela ensemble (gardez à l'esprit, il est presque minuit):

<?php
class bar {
public $data = array();
  public function __construct() {
    $this->data['virtual_field'] = "set in bar";
  }

  public function  __get($name) {
    if(array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
    return null;
  }

  public function __set($name, $value) {
    $this->data[$name] = $value;
  }
}

class foo extends bar {
public $data = array();
  public function __construct() {

  }

  public function  __get($name) {
    if(array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
    if (parent::__get($name))
      return parent::__get($name);

    return null;
  }

  public function __set($name, $value) {
    $this->data[$name] = $value;
  }
}

$a = new foo;
echo $a->virtual_field;

Maintenant, je ne sais pas comment cela fonctionne pour ce que vous essayez d'atteindre.

Autres conseils

class Product extends Doctrine_Record {

    //...

    public function __get($name) {
        if ($name == 'virtual_field') {
            return $this->virtual_field();
        }                                                     
        else {
            return parent::__get($name);
        }
    }


    public function virtual_field() {
        // calculate or retrieve virtual field value
        return $value;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top