2016-03-27 17 views
-2

Ich löse ziemlich seltsames Problem, das ich zum ersten Mal konfrontiert bin. Ich habe einige Hauptklasse mit Eigenschaft static::$someProperty und ich erweitere mit dieser Klasse andere Klassen, z. ClassA und ClassB. Problem ist jetzt, wenn ichPHP-Objekt-Eigenschaft überschreiben

$classA = ClassA 

laden und dort

static::$someProperty = "ClassA" 

und Echo diesen Wert einstellen, funktioniert es gut und das Rück "ClassA" aber dann auch

$classB = ClassB 

und Set I load

static::$someProperty = "ClassB" 

und wenn ich

echo static::$someProperty 

in $classA es jetzt, Wert ist "ClassB".

Wissen Sie, wie Sie dieses Problem lösen können? Wahrscheinlich ist es mit static verbunden, aber ich weiß jetzt nicht, was damit zu tun ist.

class Translateable extends Model{ 

     public static $transLang; 
     public static $transClassInstance; 
     public static $instance; 

     public $transInstance = null; 

     public function __construct(array $attributes = array()) { 
      self::$transLang = App::getLocale(); 

      $tcName = static::$instance->transClass; 
      static::$transClassInstance = new $tcName; 
      parent::__construct($attributes); 
     } 

    /** 
    * add trans to the item 
    * 
    * @return mixed 
    */ 
    public static function withTrans($lang = null) { 

     if($lang == null) { 
      $lang = static::$transLang; 
     } 

     return static::join(static::$transClassInstance->getTable(), function ($join) use ($lang) { 
      $join->on(static::$instance->getTable() . '.' . static::$instance->primaryKey, '=', static::$transClassInstance->getTable() . '.' . static::$instance->primaryKey)->where(static::$transClassInstance->getTable() . '.lang', '=', $lang); 
     })->where(static::$transClassInstance->getTable() . '.lang', '=', $lang) 
      ; 

    } 
    } 




    class Nested extends Translateable{ 

     // protected $lft, $lvl, $rgt, $parent_ID; 

     public static $transClassInstance; 
     public static $transLang; 


     public function __construct(array $attributes = array()) { 

      self::$transLang = App::getLocale(); 

      $tcName = static::$instance->transClass; 
      static::$transClassInstance = new $tcName; 

      parent::$instance = $this; 
      parent::__construct($attributes); 

     } 
    /** 
    * 
    * get $this item child 
    * 
    * @return null 
    */ 
    public function getChilds() { 

     $primaryKeyName = $this->primaryKey; 
     $parent_id = $this->$primaryKeyName; 
     // here is echo PageTrans instead of ProductCategoryTrans 
     echo static::$transClassInstance->getTable().'<br/>'; 
     echo static::$transClassInstance->getTable() . '.lang'.'<br/>'; 
     $query = static::where('parent_ID', '=', $parent_id)->where(static::$transClassInstance->getTable() . '.lang', '=', static::$transLang); 
     echo $query->toSql(); 
     $this->generateItemsQuery($query); 
     $query->orderBy('lft', 'ASC'); 
     $categories = $query->get(); 

     return $categories; 

    } 


    } 


class ProductCategory extends Nested{ 
    public $transClass = 'App\Models\ProductCategoryTrans'; 

    public function __construct(array $attributes = array()) { 

     static::$instance = $this; 
     parent::__construct($attributes); 

    } 
} 

class Page extends Nested{ 
    public $transClass = 'App\Models\PageTrans'; 

    public function __construct(array $attributes = array()) { 

     static::$instance = $this; 
     parent::__construct($attributes); 

    } 
} 

Beispiel Nutzung:

// find product category with ID == 1 
$productCategory = (new ProductCategory)->find(1); // "ClassA" 

// get some page... 
$page = (new Page)->find(1); // find page with ID == 1 // "ClassB" 

// get childs of loaded category 
$categoryChilds = $productCategory->getChilds(); // get this category 
+0

einige Code zeigen (Haupt-Klasse erweitern und statische Eigenschaft Einstellung innerhalb jedes Kind Klasse) – RomanPerekhrest

+1

Ich habe versucht, um die Formatierung von Inline-Code zu verbessern. Verwenden Sie 'ctl-k', um als Codeblöcke zu formatieren, und ich würde vorschlagen, diese als vollständige PHP-Anweisungen zu erweitern. –

+0

Können Sie erklären, was '$ classA = ClassA' bedeutet? Ist 'ClassA' ein Objekt der Klasse' ClassA'? – SOFe

Antwort

0

Versuchen zu verwenden self in classA und classB

self::$someProperty = 'test'; 
+0

Wenn ich dies verwende, muss ich ein anderes Problem lösen -> es in ** $ transClassInstance ** Variable Store-Instanz für den ersten Objekt (neue Produktkategorie) –