153 votes

PHP résumé des propriétés

Est-il possible de définir résumé des propriétés de la classe en PHP?

abstract class Foo_Abstract {
    abstract public $tablename;
}

class Foo extends Foo_Abstract {
    //Foo must 'implement' $property
    public $tablename = 'users';   
}

168voto

Mathieu Dumoulin Points 7125

Il n'y a pas une telle chose comme la définition d'une propriété.

Vous ne pouvez déclarer des biens parce qu'ils sont des conteneurs de données réservée en mémoire lors de l'initialisation.

Une fonction sur l'autre main peut être déclaré (type, nom, paramètres) sans être défini (corps de la fonction manquante) et, ainsi, peuvent être abstraites.

"Abstraite" indique seulement que quelque chose a été déclaré mais non défini et, par conséquent, avant de l'utiliser, vous devez définir, il ou elle devient inutile.

65voto

connec Points 2033

Non, il n'y a aucun moyen de faire appliquer qu'avec le compilateur, vous auriez à utiliser au moment de l'exécution des contrôles (par exemple, dans le constructeur) pour l' $tablename variable, par exemple:

class Foo_Abstract {
  public final function __construct(/*whatever*/) {
    if(!isset($this->tablename))
      throw new LogicException(get_class($this) . ' must have a $tablename');
  }
}

Pour appliquer ce pour toutes les classes dérivées de Foo_Abstract que vous auriez à faire Foo_Abstract du constructeur final, la prévention primordiale.

Vous pouvez déclarer un résumé de lecture à la place:

abstract class Foo_Abstract {
  abstract public function get_tablename();
}

class Foo extends Foo_Abstract {
  protected $tablename = 'tablename';
  public function get_tablename() {
    return $this->tablename;
  }
}

45voto

fyrye Points 759

Selon le contexte de la propriété, si je veux de la force de la déclaration d'un objet abstrait dans la propriété d'un objet enfant, j'aime utiliser une constante avec l' static - clé pour la propriété dans l'abstrait constructeur de l'objet ou de méthodes setter/getter.

Autre que celle de l'enfant objet remplace le parent de l'objet de la propriété et des méthodes si redéfini. Par exemple, si une propriété est définie comme privé dans le parent et redéfini comme publics dans l'enfant, la propriété est publique.

http://www.php.net//manual/en/language.oop5.static.php

abstract class AbstractFoo
{
    public $bar;

    public function __construct()
    {
       $this->bar = static::BAR;
    }
}

class Foo extends AbstractFoo
{
    //const BAR = 'foobar';
}

$foo = new Foo; //Fatal Error: Undefined class constant 'BAR' (uncomment const BAR = 'foobar';)
echo $foo->bar;

26voto

ulkas Points 1952

comme indiqué ci-dessus, il n'existe pas de définition exacte. j'ai, cependant, utiliser cette solution de contournement simple pour forcer l'enfant de la classe pour définir le "résumé" de la propriété:

abstract class Father {
  public $name;
  abstract private function setName();    //now every child class must declare this function and thus declare the property
  public function __construct(){
    $this->setName();
  }
}

class Son extends Father{
private function setName(){
  $this->name="son";
}
function __construct(){
  parent::__construct();
}
}

7voto

hakre Points 102271

Comme vous avez pu l'avoir trouvé par le test de votre code:

Erreur fatale: les Propriétés ne peuvent pas être déclarée abstract ... sur la ligne 3

Non, il n'est pas. Les propriétés ne peuvent pas être déclarée abstract en PHP.

Cependant, vous pouvez mettre en œuvre un getter/setter abstrait, ce pourrait être ce que vous cherchez.

Les propriétés ne sont pas mises en œuvre (en particulier les propriétés publiques), ils existent (ou pas):

$foo = new Foo;
$foo->publicProperty = 'Bar';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X