Autor Zpráva
Honza_n
Profil *
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
Konstanta nemůže být pole, pouze skalární typ (string, int apod.).
Honza_n
Profil *
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 *
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 *
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 *
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
DoubleThink:
Nedá se říct, že array(1,3,5) je literál?
DoubleThink
Profil *
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 *
Možná jo, ale není to objekt...
A teď mě napadlo, dala by se tam přidat metoda?
Nox
Profil
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 *
Nox:
To první je nějaká blbost.
To druhé by bylo logické, ale nefunguje to.
martindeveloper
Profil
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 *
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 *
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
DoubleThink:
není blbost
http://cz.php.net/manual/en/functions.variable-functions.php

jako máš $$ tak u funkcí je toto
Honza_n
Profil *
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 *
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
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é...

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0