2017-03-29 2 views
1

Ich möchte, dass meine Klasse Methoden von ihren Eltern erbt, ich habe dies getan, indem ich die Klasse erweitert habe. Aber ich möchte auch eine Klasse unter Verwendung des Basisnamens (ohne Namespace) instanziieren und die korrekte Klasse instanziieren lassen, basierend auf dem aktuellen Namespace ausgewählt werden und dann auf eine "gemeinsame" Klasse zurückgreifen, falls sie nicht existiert.Dynamisch verschiedene Klassen abhängig vom aktuellen Namespace verwenden

Beispiel

<?php 

namespace common\models { 


    class Account extends Model{} 
    class Orders extends Model{} 

    class Customer extends Model{ 

     use common\models\Account; 

     public static function getAccountClass(){ 
      echo get_class(new Account()); 
     } 
     public static function getOrdersClass(){ 
      echo get_class(new Order()); 
     } 
    } 
} 


namespace frontend\models { 

    class Account extends common\models\Account {} 

    class Customer extends common\models\customer { 

    } 
} 

ich die common\models\Customer::getAccountClass() zur Ausgabe common\models\Account

und

frontend\models\Customer::getAccountClass() zur Ausgabe frontend\models\Account

aber als frontend\models\Orders nicht existiert frontend\models\Customer::getOrdersClass() noch Ausgang common\models\Orders möchte

Antwort

0

Versuchen Sie vollständige Namespace wie folgt zu verwenden:

use common\models\Account as A2; 
public static function getAccountClass(){ 
    echo get_class(new A2()); 
} 

oder

public static function getAccountClass(){ 
    echo get_class(new common\models\Account()); 
} 
0

Es gibt keinen "richtigen" Weg, es zu lösen. Aber Sie so etwas wie dieses

hinzufügen eine Komponente oder einen Helfer oder sogar fügen Sie es dem Konstrukt Ihrer ersten Klasse tun könnte (abhängig wie viel müssen Sie es verwenden):

public static function getClass($class) 
{ 
    if (class_exists('frontend' . '\\' . $class)) { 
     return frontend . '\\' . $class; 
    } else { 
     return $class; 
    } 
} 

Und dann nur Sie kann so etwas tun

public static function getAccountClass(){ 
    return self::getClass(Account::class); 
} 
Verwandte Themen