Autor | Zpráva | ||
---|---|---|---|
Honza_n Profil * |
#1 · Zasláno: 3. 7. 2010, 17:07:10
Zdravím,
mám metodu, uvnitř které se snažím nastavit dvourozměrné pole jako konstantu, nevím co dělám špatně, ale vrací mi to hlášku Warning: Constants may only evaluate to scalar values in c:\www\words\class_words.php on line 34 define ('mz1', array ( 0 => array ('pán', '', 'a', 'ovi,u', 'a', 'e', 'ovi,u', 'em'), // zkráceno 5 => array ('stroj','', 'e', 'i', 'i', '', 'i', 'em') )); Že my nebylo možné toto použít uvnitř třídy? |
||
Majkl578 Profil |
#2 · Zasláno: 3. 7. 2010, 17:09:06
Konstanta nemůže být pole, pouze skalární typ (string, int apod.).
|
||
Honza_n Profil * |
#3 · Zasláno: 3. 7. 2010, 18:34:28
Tak jsem to zřejmě vyřešil pomocí this->myproperty_xx . Ale měl bych ještě jednu otázku. Jelikož je to moje první třída.
Vytvářím objekt, který má obsahovat vzory pro český pravopis podstatných jmen. V budoucnu bych tu třídu chtěl ale ještě využít pro cizí jazyky. A protože je tam několik skupin (asi v desítkách) asi by to bylo poněkud nesystémové všechny tyto pole strkat přímo pod třídu. Nevím. Když počítám, že v budoucnu přibudou ještě vzory pro přídavná jména, slovesa v různých časech, atd. Tak by v tom byl asi galimatiáš. V tomto jazyce asi není ekvivalentní náhrada pro prototypy? Myslím tím, že nemohu použít něco ve smyslu nazev_tridy.skupina_vzoru.vzor v tomto jazyce musím odkayovat přímo na vlastnost nazev_tridy->vzor a nejde udělat něco jako nazev_tridy->skupina->vzor ? |
||
DoubleThink Profil * |
#4 · Zasláno: 3. 7. 2010, 19:33:03
Honza_n:
„a nejde udělat něco jako“ Jde. Vlastnost může obsahovat také instanci třídy, například předdefinované stdClass. |
||
Honza_n Profil * |
#5 · Zasláno: 3. 7. 2010, 20:04:34
No tak jsem našel dva příklady. Ten první moc nechápu:
<?php $obj = (object) array("vlastnost1" => "hodnota", "vlastnost2" => "hodnota"); // tradiční přístup $obj = new stdClass; $obj->vlastnost1 = "hodnota"; $obj->vlastnost2 = "hodnota"; ?> Znamená to, že se nejdříve má vytvořit pole a pak se to má převést na objekt? A pak jsem v komentářích našel tenhle příklad: <?php $o = (object) array( "color" => '#ffffff', "fonts" => (object) array('font' => 'Arial') ); ?> A ten je funkční: stdClass Object ( [color] => #ffffff [fonts] => stdClass Object ( [font] => Arial ) ) Takže díky za skvělý typ |
||
DoubleThink Profil * |
#6 · Zasláno: 3. 7. 2010, 20:15:33
Honza_n:
„Znamená to, že se nejdříve má vytvořit pole a pak se to má převést na objekt?“ Z nějakého zvrhlého důvodu PHP nemá literály pro pole a generický objekt - tohle je jakýsi workaround, aby nebylo nutné inicializovat objekt na padesát řádků. |
||
Honza_n Profil * |
Takže jsou dva postupy, jeden:
$obj = (object) array(); a druhý pomocí $obj = new stdClass; $obj->vlastnost1 = "hodnota"; Už to chápu. |
||
Nox Profil |
#8 · Zasláno: 3. 7. 2010, 20:44:08
DoubleThink:
Nedá se říct, že array(1,3,5) je literál? |
||
DoubleThink Profil * |
#9 · Zasláno: 3. 7. 2010, 20:47:10
Nox:
„Nedá se říct, že array(1,3,5) je literál?“ Nevím, podle manuálu je to jazykový konstrukt. Jako literál bych čekal spíš hranaté závorky, tak jako všude jinde. |
||
Honza_n Profil * |
#10 · Zasláno: 3. 7. 2010, 20:47:55
Možná jo, ale není to objekt...
A teď mě napadlo, dala by se tam přidat metoda? |
||
Nox Profil |
#11 · Zasláno: 3. 7. 2010, 20:54:28 · Upravil/a: Nox
DoubleThink:
Ok ... nejsem si jistý jaký je v tom rozdíl...no, to je jedno. S těma závorkama to souhlasím, co teď víc koukám do JS tak mě to taky trklo, některý věci jsou tam zajímavější Honza_n: Standardním způsobem nevim, ale v PHP by mělo jít function moje_funkce(){...} $funkce = "moje_funkce"; $obj->funkce = "moje_funkce"; $obj->funkce(); Nebo nově 5.3+ třeba $obj->funkce = function(){ ... }; |
||
DoubleThink Profil * |
#12 · Zasláno: 3. 7. 2010, 21:00:21
Nox:
To první je nějaká blbost. To druhé by bylo logické, ale nefunguje to. |
||
martindeveloper Profil |
#13 · Zasláno: 3. 7. 2010, 21:04:50
Pokud vím tak metody se v PHP přidávají přes classkit_method_add, ale je to experimentální funkce.
|
||
Honza_n Profil * |
#14 · Zasláno: 3. 7. 2010, 21:58:58
V mém php žádný takový modul není. Je to mrtvé
Installation This extension is considered unmaintained and dead. However, the source code for this extension is still available within PECL SVN here: » http://svn.php.net/viewvc/pecl/classkit. |
||
Honza_n Profil * |
#15 · Zasláno: 3. 7. 2010, 22:23:34
Ještě teda k té původní třídě words. Dejme tomu, že nadefinuju několik objektů.
poj - podstatná jména prj - přídavná jména sl - slovesa atd. Každý asi bude obsahovat zase několik objektů podle časů, a tyto objekty konečně budou obsahovat vzory. Kam by bylo nejlépe umístit tyto nadefinované objekty. Mám to umístit úplně mimo třídu words? Nebo to načíst v nějakém rozšíření? Kladu si otázku zda je vhodné to do třídy words umísťovat a pokud bych to umístil jinam, tak že bych to ve třídě zpřístupnil jako vlastnost. Nevím co je nejlepší. Metoda words má ukládat slovíčka do databáze. Vzory jsou na to, aby při vkládání slovíček daly slovíčka přesněji definovat. Dále má třída words obsahovat metody na načtení slovíčka z databáze a případně další metody na vyskloňování, aj. věci. |
||
Nox Profil |
#16 · Zasláno: 4. 7. 2010, 11:04:36 · Upravil/a: Nox
DoubleThink:
není blbost http://cz.php.net/manual/en/functions.variable-functions.php jako máš $$ tak u funkcí je toto |
||
Honza_n Profil * |
#17 · Zasláno: 4. 7. 2010, 12:09:01
Tak jsem to trochu předělal. Problém byl v tom, že stdClass nelze zpracovávat jako pole. Hledal jsem a našel jsme ArrayObject:
$podstatnaJmena = array( 'seznam' => array ( // SEZNAMY VZORŮ 'm' => array ('mz1', 'mz2', 'md1', 'md2', 'ml1', 'ml2' ), // mužské 'z' => array ('zz1', 'zz2', 'zd1', 'zd2' ), // ženské 's' => array ('sz1', 'sz2' ) // střední ), 'mz1' => (object) array ( // mužský jednotný 1 => array ('pán', '', 'a', 'ovi,u', 'a', 'e', 'ovi,u', 'em'), 6 => array ('stroj','', 'e', 'i', 'i', '', 'i', 'em') ), 'md1' => (object) array ( 1 => array ('divák','', 'a', 'ovi,u', 'a', 'u', 'ovi,u', 'em') ), 'ml1' => (object) array ( 1 => array ('Brut', 'us', 'a', 'ovi', 'a', 'e', 'ovi', 'em') ), 'mz2' => (object) array ( 1 => array ('pán', 'i', 'ové,i', 'ů', 'ům', 'ové,i', 'ech', 'y'), 6 => array ('stroj', '', 'ech', 'ům', 'e', 'e', 'ích', 'i') ) ); $podstatnaJmena = new ArrayObject($podstatnaJmena); Výsledek: ArrayObject Object ( [seznam] => Array ( [m] => Array ( [0] => mz1 [1] => mz2 [2] => md1 [3] => md2 [4] => ml1 [5] => ml2 ) [z] => Array ( [0] => zz1 [1] => zz2 [2] => zd1 [3] => zd2 ) [s] => Array ( [0] => sz1 [1] => sz2 ) ) [mz1] => stdClass Object ( [1] => Array ( [0] => pán [1] => [2] => a [3] => ovi,u [4] => a [5] => e [6] => ovi,u [7] => em ) [6] => Array ( [0] => stroj [1] => [2] => e [3] => i [4] => i [5] => [6] => i [7] => em ) ) [md1] => stdClass Object ( [1] => Array ( [0] => divák [1] => [2] => a [3] => ovi,u [4] => a [5] => u [6] => ovi,u [7] => em ) ) [ml1] => stdClass Object ( [1] => Array ( [0] => Brut [1] => us [2] => a [3] => ovi [4] => a [5] => e [6] => ovi [7] => em ) ) [mz2] => stdClass Object ( [1] => Array ( [0] => pán [1] => i [2] => ové,i [3] => ů [4] => ům [5] => ové,i [6] => ech [7] => y ) [6] => Array ( [0] => stroj [1] => [2] => ech [3] => ům [4] => e [5] => e [6] => ích [7] => i ) ) ) Díky tomu pak mohu zpravovat objekt ve třídě Words: public function __construct($podstatnaJmena) { $this->poj=$podstatnaJmena; print_r( $this->poj ); die(); } function js_seznam() { // VYTVOŘÍ JS OBJEKT $s = 'seznam = {'; foreach ( $this->poj['seznam'] as $k1=>$v1 ): $s .= $t.'"'.$k1.'":['; foreach ( $this->poj['seznam'][$k1] as $k2=>$v2 ): $s .= '"'.$v2.'",'; endforeach; $s = rtrim($s, ',').'],'."\n"; $t = ' '; endforeach; $s = substr($s, 0, -2)."\n$t};"; return $s; } Ta fnc js_seznam() vytváří objekt, který je seznamem platných polí (vzorů podstatných jmen). $w = new words($podstatnaJmena); return $w->js_seznam(); Ale ještě bych rád udělal jednu věc. Problém je, že v JS se ten objekt jmenuje "seznam" místo např podstatnaJmena.seznam ... Nevíte jak bych mohl tu metodu js_seznam() vylepšit, abych dynamicky zjistil název instance? V tomto případě tedy v js_seznam() získat hodnotu "podstatnaJmena". Jestli to tedy jde. |
||
DoubleThink Profil * |
#18 · Zasláno: 4. 7. 2010, 14:10:02
Nox:
„není blbost“ Je. Přestože ti tam chybí ten dolar, i tak budeš volat tu funkci v kontextu toho objektu, ne jako globální externí fci. Vyzkoušej si to. |
||
Nox Profil |
#19 · Zasláno: 4. 7. 2010, 14:28:11
DoubleThink:
Aha, máš pravdu... resp. neřekl bych blbost, jen v PHP teda asi nejde vytvořit analogická konstrukce pro vlastnost jako pro proměnnou... Jediný co mi funguje je to dělat oklikou $functions = array( "xyz" => function(){ echo "123<br>"; } ); $obj = new stdClass; $obj->funkce = "xyz"; $functions[$obj->funkce](); leč není to hezké... |
||
Časová prodleva: 14 let
|
0