Autor Zpráva
marcus33cz
Profil
Hraju si teď s jedním frameworkem. Je v něm třída (DB_Entity), která umí chytře ukládat do databáze, upravovat údaje apod.

Aby ty údaje šly ukládat, je vždy třeba definovat sloupce ($columns), jaké v tabulce jsou.

Vytvořil jsem si třídy, které tuto třídu rozšiřují:
abstract class User extends DB_Entity{
  public $columns = array(
        'username' => array(
          'type' => 'varchar',
          'length' => 45
        ),
        'password' => array(
          'type' => 'varchar',
          'length' => 45
        )
    );

...
}

class Customer extends User{
...
}

class Seller extends User{
...
}


Rád bych to udělal tak, abych měl rodičovskou třídu User - v ní by byly společné věci pro zákazníka i prodejce (username, heslo, datum registrace) a pak by prodejce i zákazník měli svou vlastní třídu.
V té by pro prodejce bylo třeba IČ, pro kupujícího třeba nejbližší prodejna. Tedy do pole $columns z User bych chtěl v definici Seller přidat další položky
class Seller extends User{
    public $columns = tady by mělo být to z třídy User +
          'companyID' => array(
            'type' => 'int'
          )
   ...
}


Zkoušel jsem to různě, ale buď mi šlo dát tam údaje jenom z User nebo jenom z Seller.

Dá se to nějak udělat v definici?

Do konstruktoru to můžu dát bez problému, ale moc se mi to tam nelíbí a mám takový pocit, že to tam nepatří (navíc je v tom pak bordel).
Do té třídy DB_Entity to taky dávat nechci, protože musí fungovat i pro třídy, které třeba nebudou mít username apod.

Díky
Alphard
Profil
V definici nemůže ani spojovat pevné stringy nebo provádět triviální matematické operace, viz http://cz.php.net/manual/en/language.oop5.properties.php (invalid property declarations v example). Hodně bych se divil, kdyby šlo mergovat array...
marcus33cz
Profil
Jo, tak právě to je to, o co jsem se pokoušel. :-) Co navrhuješ? Pro každou třídu to definovat znovu?

Nechci to cpát do konstruktoru - ta array bude hodně velká. Ale zároveň nechci mít v kódu duplicity.
Alphard
Profil
marcus33cz:
Co navrhuješ? Pro každou třídu to definovat znovu?
Já nemám v lásce ORM a hlavně duplicitní informace o tabulkách. Z názvu DB_Entity nepoznám, k čemu to patří, Zend, Doctrine? Pokud z těchto entit tabulky vytváříte, možná bych napsal vše pro každou třídu, ať je na první pohled jasné, jak to vypadá. V dokumentaci nebo fóru daného frameworku se podívejte na doporučené postupy.
Váš přístup lze realizovat jedině s kontruktorem.

Teď jsem si hrál s určitým nápadem
if (!empty(parent::$struct) && self::$struct[0] == '::parent::')
{
  unset(self::$struct[0]);
  print_r(array_merge(parent::$struct, self::$struct));
}
ale je to spíš zoufalý pokus, nehezký a neřešící vícenásobnou dědičnost.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0