Autor | Zpráva | ||
---|---|---|---|
quiet_user Profil |
#1 · Zasláno: 28. 10. 2010, 12:48:15 · Upravil/a: quiet_user
Ahoj,
mám funkce 1. function getCode($msg,$img), kterou získávám informace z formuláře, kontroluji jestli nejsou prázdné pole a také výsledek spracuji a vykreslím. 2. function getSize($msg), která počítá počet znaků funkcí strlen z výsledku funkce getCode ovšem, při navazování promenných mi píší, že jsou prázdné, nebo neexistující, že spolu nemůžou pracovat část první funkce: $data = new \stdClass; $data->urlAddress = $_POST['url_address']; $data->ipAddress = $_POST['remote_addr']; $data->source = file_get_contents($data->urlAddress); $data->source = highlight_string($data->source); a teď napíši jenom na ukázku např.: $source = new \stdClass; $source->size = strlen($data->source); (píši to pod novou třídu, protože bude více práce s řetězci) takže již nejde pracovat s proměnnou $data->source napadlo mě pár řešení: -> udělat proměnnou $data = new.... jako super globální a inkludovat jí jako třídu $msg, tímto bych však dostal po celém serveru všude možně rozházené nové třídy a funkce by pak nedávali smysl a pro jejich úpravu bych musel do xx souborů -> přejímat do funkce getSize proměnnou $data -> getSize($data) - ovšem je to nefunkční -> vnořit funkci do funkce -> je to prasárna a navíc se vykreslí znova daná funkce, což je nepřípustné máte nějaký nápad, jak to vyřešit? Tak abych s proměnnými $data, mohl pracovat i v dalších funkcích (globálně)? Díky |
||
Tori Profil |
#2 · Zasláno: 28. 10. 2010, 19:28:13
tohle by se nedalo použít?
$data = new \stdClass; $data->urlAddress = $_POST['url_address']; $data->ipAddress = $_POST['remote_addr']; $data->source = new \stdClass; $data->source->text = file_get_contents($data->urlAddress); $data->source->text = highlight_string($data->source->text); $data->source->size = strlen($data->source->text); |
||
quiet_user Profil |
#3 · Zasláno: 28. 10. 2010, 19:41:50
Tak prvně nevím, kde bereš $data->source->text a za druhé, to musím mít v funkcích, takže getCode a getSize na sebe musí navazot a přenášet s sebou proměnné.
Mě je jasný, že když vytvořím novou std třídu mimo funkci a pak jen dám do funkce parametr $data ($data->source), tak to přenesu, ale takto bych zakládal miliony a miliony volných tříd, které by byly mimo funkce a jelikož bych je nemohl nechávat jen tak vedle kódu, musel bych je inkludovat a případná úprava by zabrala 2x víc času. Navíc to nebude jen o funkci getSize() která bude používat proměnné z getCode() další řešení? Děkuji |
||
__construct Profil |
#4 · Zasláno: 28. 10. 2010, 19:53:46 · Upravil/a: __construct
quiet_user:
„Tak prvně nevím, kde bereš $data->source->text“ Pozri si 5. riadok toho kódu čo napísal … Pletieš si pojmy a dojmy … Objekt != Trieda To čo vytváraš ty sú objekty. Používaš ich a ani nevieš ako fungujú. To čo robíš sa dá urobiť poľami, ale to je nemoderné, že ? |
||
quiet_user Profil |
#5 · Zasláno: 28. 10. 2010, 19:56:13
Ano, ale takto by to lze, kdybych to měl v jedné funkci.
Ovšem přepočítání znaků, velikost souboru a vykreslení (vypsání) je jiná funkce. A když hodím ty první 3 řádky zvlášt do funkce a ty další také, do druhé zavolám $data tak se neděje nic a problém mám pořád stejný. |
||
quiet_user Profil |
#6 · Zasláno: 28. 10. 2010, 20:00:35
Mno hlavně jsem to začal používat pro přehlednost, líbí se mi to více a na efektu to nic nemění.
|
||
__construct Profil |
#7 · Zasláno: 28. 10. 2010, 20:02:59
Pozri keď chceš silou mocou používať používať objekty tak asi nejak takto:
class Objekt { private $data = array(); public function getCode($msg,$img){ //… niečo } public function getSize($msg){ //… niečo } // Overloading public function __get($key){ return array_key_exists($key, $this->data) ? $this->data[$key] : null; } public function __set($key, $value){ $this->data[$key] = $value; } } |
||
Tori Profil |
#8 · Zasláno: 28. 10. 2010, 20:11:33
quiet_user:
možná jsme se nepochopili - ten volný řádek č.4 v mém přikladu neznamená oddělení nějaké první a druhé funkce, jen tam jen pro přehlednost. Jestli chcete použít funkce místo objektů, vytvořte si proměnnou $data mimo funkce a pak ji předávejte referencí - získáte k ní přístup z obou funkcí a bude to flexibilnější, než použít global. |
||
quiet_user Profil |
#9 · Zasláno: 28. 10. 2010, 20:17:10
__construct:
to se mi moc líbí, ale potřeboval bych o něm více informací - overloading = vypsání? - __get, ___set? - proč null? Tori: tvoje řešení bylo dobré, jen nevyhovovalo podmínkám, které mám |
||
__construct Profil |
#10 · Zasláno: 28. 10. 2010, 20:28:40 · Upravil/a: __construct
quiet_user:
„overloading“ Nie … skús použiť slovník. Prekladá sa to ako preťažovanie, alebo presycovanie. Znamená to, že v poli $data sú uložené neexistujúce atribúty.
S overloadingom súvisia v PHP magické metódy __get() __set() __call() a ponovom aj __callStatic()
Keď som sa pozrel o čo Ti ide tak by sa to mohlo riešiť +/- takto nejako: <?php class Objekt { // naschvál som nedefinoval $size a $source aby si videl, že ich obsah sa nachádza v $data private $data = array(); public $domain; // je privátna, lebo zvonka ju netreba volať private function getCode(){ ob_start(); highlight_string(file_get_contents($this->domain)); $this->source = ob_get_contents(); ob_end_clean(); } public function getSize(){ $this->getCode(); return $this->size = strlen($this->source); } // Overloading public function __get($key){ return array_key_exists($key, $this->data) ? $this->data[$key] : null; } public function __set($key, $value){ $this->data[$key] = $value; } } $obj = new Objekt; $obj->domain = "http://example.com/"; $obj->getSize(); echo "<pre>"; var_export($obj); |
||
quiet_user Profil |
#11 · Zasláno: 28. 10. 2010, 20:32:17
Moc hezkej kód, jen se obávám, že nejsem až tak technicky vyspělý co se týče OO programování.
Já mám tuto verzi, nemyslím si, že by to byla prasárna, ale tvůj kód je moc hezký, problém je, že jestli ho do něho přepracuji budu mít problém v něm pokračovat a dále editovat. <?php // form model include'formModel.php'; // language template - error echo include'languageTemplate.php'; function getCode($msg,$img) { if (isset($_POST['action'])) { if ($_POST['url_address']=="" OR $_POST['url_address']=="http://") {echo $img->false;} else {echo $img->true;} echo $msg->urlAddress . $_POST['url_address']; $data = new \stdClass; $data->urlAddress = $_POST['url_address']; $data->ipAddress = $_POST['remote_addr']; $data->source = file_get_contents($data->urlAddress); $data->source = highlight_string($data->source); // specified page size $data->size = strlen(file_get_contents($data->urlAddress)); if ($data->urlAddress=="") { echo $msg->errorUrl; } elseif ($data->urlAddress=="http://") { echo $msg->errorUrl; } elseif ($data->urlAddress!="") { echo"<pre>$data->source</pre>" . $data->size; } } } getCode($msg,$img); ?> |
||
Lamicz Profil |
#12 · Zasláno: 29. 10. 2010, 15:09:16
__construct:
Tam by se daly delat jeste vetsi prasarny ve stylu SPL (Iterator, ArrayAccess) a pouziti __toString(); |
||
Časová prodleva: 14 let
|
0