Autor Zpráva
quiet_user
Profil
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
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
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
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
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
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
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
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
__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
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);
Viac o OOP v PHP sa dozvieš tu
quiet_user
Profil
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
__construct:
Tam by se daly delat jeste vetsi prasarny ve stylu SPL (Iterator, ArrayAccess) a pouziti __toString();

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