2017-09-17 2 views
1

héritée Lorsque j'utiliseobtenir la fonction statique de

DemoStyle::order(); // returns {{%demo_style}} but not 'site.site_demo_style' 
DemoLayout::order(); // returns {{%demo_layout}} but not 'site.site_demo_layout' 

Je reçois le nom de mauvaise table. Je crois que c'est ActiveRecord :: tableName() renvoie un nom incorrect. Comment obtenir tableName à partir de DemoStyle et DemoLayout.

class Sortable extends ActiveRecord 
{ 
    public static function order() 
    { 
     return self::tableName(); 
    } 
} 

class DemoStyle extends Sortable 
{ 
    public static function tableName() 
    { 
     return 'site.site_demo_style'; 
    } 
} 

class DemoLayout extends Sortable 
{ 
    public static function tableName() 
    { 
     return 'site.site_demo_layout'; 
    } 
} 

Veuillez ne pas voter pour.

+0

Vous devez être clair et afficher un code complet. Si vous vous attendez à upvote. – Ravi

Répondre

0

MISE À JOUR

Pourquoi utilisez-vous des méthodes statiques? Lorsque vous définissez une méthode abstraite et ne pas utiliser le contexte statique, cela fonctionne pour moi:

<?php 
    abstract class Sortable 
    { 
     public abstract function tableName(); 


     public function order() 
     { 
      return $this->tableName(); 
     } 
    } 

    class DemoStyle extends Sortable 
    { 
     public function tableName() 
     { 
      return 'site.site_demo_style'; 
     } 
    } 

    class DemoLayout extends Sortable 
    { 
     public function tableName() 
     { 
      return 'site.site_demo_layout'; 
     } 
    } 

echo (new DemoStyle)->order(); 

MISE À JOUR 2

Exemple dans la documentation php pour le contexte statique: Late Static Bindings

+0

Maintenant, vous avez changé votre liste, et pour moi cela fonctionne bien! –

+0

Que voulez-vous dire? Avez-vous 'site.site_demo_style'? – holden321

+0

La mise à jour fonctionne pour moi ^^ Excusez le désordre ... –

0

Dans cette situation,

static::tableName()