私が初めて直面している非常に奇妙な問題を解決しています。 プロパティstatic::$someProperty
を持つ主要なクラスがいくつかあります。このクラスを他のクラスに拡張します。 ClassA
およびClassB
。私はPHPオブジェクトのプロパティが上書きされました
$classA = ClassA
をロードし、そこ
static::$someProperty = "ClassA"
を設定し、この値をエコーするとき 問題は、今、それが正常に動作して"ClassA"
を返すが、その後、私はまた
$classB = ClassB
とセットをロード
static::$someProperty = "ClassB"
とするとき、私$classA
で
echo static::$someProperty
今、値"ClassB"
があります。
この問題を解決するにはどうすればよいですか?おそらくそれはstatic
と接続されていますが、私はこれで何をするべきではありません。
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);
}
}
使用例:
// 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
を
self
を使用してみてください私が試し – RomanPerekhrest(メインクラスを拡張し、それぞれの子クラス内の静的プロパティを設定する)いくつかのコードを示しインラインコードからの書式設定を改善します。コードブロックとしてフォーマットするには 'ctl-k'を使います。これを完全なPHP文に拡張することをお勧めします。 –
'$ classA = ClassA'の意味を説明できますか? 'ClassA'は' ClassA'クラスのオブジェクトですか? – SOFe