Portál AbcLinuxu, 10. května 2025 00:28

Dotaz: Jak dostat do třídy instanci své třídy v php

13.10.2013 20:32 Jakub
Jak dostat do třídy instanci své třídy v php
Přečteno: 282×
Odpovědět | Admin
Když vytvořím instanci třídy 'Ovoce'
$obj = Ovoce();
a z té třídy volám jiné třídy které potřebují instanci třídy 'Ovoce', existuje řešení jak to udělat? Děkuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.10.2013 20:46 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ano, uvnitř třídy použiješ speciální proměnnou $this.
13.10.2013 20:54 Jakub
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Myslel jsem to jinak, patrně jsem se špatně vyjádřil. Zkusím to lépe.

Vytvořím instanci
$obj = Ovoce();
v class Ovoce zavolám jinou class Zelenina
$obj2 = Zelenina();
a v class Zelenina potřebuji zavolat metodu v class Ovoce.

je to lépe k pochopení? Děkuji
13.10.2013 21:11 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Není to sice úplně triviální, ale budiž:
<?php
class Ovoce {
    private $atribut;
    private $obj2;

    function __construct($atribut){
        $this->atribut = $atribut;
        $this->obj2 = new Zelenina($this);
    }

    function getAtribut(){
        return $this->atribut;
    }

    function __toString() {
        return "Ovoce a $this->obj2";
    }
}

class Zelenina {
    private $ovoce;

    function __construct(Ovoce $ovoce){
        $this->ovoce = $ovoce;
    }

    function __toString() {
        return "zeleniny mám: " . $this->ovoce->getAtribut() . " kusů";
    }

}

$obj = new Ovoce(42);
echo $obj;
Výsledek:
Ovoce a zeleniny mám: 42 kusů
13.10.2013 22:28 Jakub
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Tak to je na pochopení už docela mazec :-( Musím si to pořádně rozebrat.. Děkuji

ještě tady mám úplně obyčejnou class, ze které opět nedostanu nic jiného než nadafinované proměnné na false. V každé metodě se uloží string který se ještě vypíše pokud tam vložím echo, ale v poslední metodě "show" už jsou zase všechny proměnné false, kde se to ztrácí? Děkuji
     class Test{
          private $item1 = false;
          private $item2 = false;
          private $item3 = false;
           public $show  = false;

          public function __construct(){
               $this->item1();
               $this->item2();
               $this->item3();
          }

          public function item1(){
               $this->item1 .= 'Text item1';
          }

          public function item2(){
               $this->item2 .= 'Text item2';
          }

          public function item3(){
               $this->item3 .= 'Text item3';
          }

          public function show(){
               $this->show .= $this->item1;
               $this->show .= $this->item2;
               $this->show .= $this->item3;
          }
     }

     $test = new Test();

     var_dump($test->show); // bool(false)
13.10.2013 22:43 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Kde voláš tu metodu show()? Podle mne nikde. Atributu $show zůstane původní hodnota. Kdo ti poradil, abys dělal atributy "public"? Mají být "private".

To je tedy nápad, pojmenovávat atributy stejně jako metody. Nedivím se, že v tom máš guláš.

A kdo ti poradil řetězit booleovskou hodnotu s řetězcem? Sice to tak nějak funguje, ale je to nesmysl.
13.10.2013 23:16 Jakub
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Kde voláš tu metodu show()? Podle mne nikde. Atributu $show zůstane původní hodnota.
Já jsem fakt pako :-(
Kdo ti poradil, abys dělal atributy "public"? Mají být "private".
Narážiš na tento zápis ?
public $show  = false;
Pokud ano, jak bych tu proměnnou pak vypsal?
A kdo ti poradil řetězit booleovskou hodnotu s řetězcem? Sice to tak nějak funguje, ale je to nesmysl.
tak jak to má být? Měl jsem za to, že když se jedná o inicializace proměnné je to fuk..
public $show  = '';
nebo
public $show  = "";
nebo úplně jinak
Díky
13.10.2013 23:21 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Nepotřebuješ obsah proměnné, ale metodu, která ti vypíše to, co potřebuješ. Proměnnou $show nepotřebuješ inicializovat, protože je úplně zbytečná. Vůbec tam nemusí být.
13.10.2013 23:16 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Ten tvůj příklad by v reálu asi vypadal mnohem jednodušeji:
<?php
class Test {
    private $item1 = 'Text item1';
    private $item2 = 'Text item2';
    private $item3 = 'Text item3';

    public function __toString() {
        return $this->item1 . $this->item2 . $this->item1;
    }
}
        
$test = new Test();
echo $test;
Všechno ostatní je tam jaksi "navíc" a není příliš patrné, proč to tam máš.

Vyhýbej se operátorům ".=" - nejsou moc efektivní a většinou ani nejsou potřebné.
13.10.2013 23:37 Jakub
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Všechno ostatní je tam jaksi "navíc" a není příliš patrné, proč to tam máš.
Byl to jen příklad, metody jsem tady nechtěl z důvodu přehlednosti rozvádět...

Když si vezmu cenné ponaučení a vycházím z původního příkladu, tak ted je to OK ? Děkuji

class Test{
          private $item1;
          private $item2;
          private $item3;

          public function __construct(){
               $this->item1();
               $this->item2();
               $this->item3();
          }

          public function item1(){
               $this->item1 = 'Text item1';
          }

          public function item2(){
               $this->item2 = 'Text item2';
          }

          public function item3(){
               $this->item3 = 'Text item3';
          }

          public function show(){
               $this->show = $this->item1.$this->item2.$this->item1;
          }

          public function __toString(){
               return show();
          }
     }

     $test = new Test();

     echo($test->show());
13.10.2013 23:55 Kit
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Metodu __toString() tam máš navíc, protože jsi ji nepoužil. U metody show() ti chybí return. Atribut $this->show je opět zbytečný.

Když místo posledních dvou metod budeš mít jen jednu
public function __toString(){
   return $this->item1.$this->item2.$this->item1;
}
tak vůbec nebudeš potřebovat volat metodu show()
$test = new Test();
echo($test);
Uvnitř objektu si udržuj atributy v atomickém stavu, ale vně objektu je prezentuj jako komplexní hotovou informaci, kterou k něčemu potřebuješ. Nesnaž se z vnějšku manipulovat s jednotlivými atributy, to je úkolem metod uvnitř objektu.
14.10.2013 00:12 Jakub
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
Metodu __toString() tam máš navíc, protože jsi ji nepoužil.
jak to že jsem ji nepoužil? ta metoda se zpracuje přece vždy?
U metody show() ti chybí return.
Ano to je pravda, to co jsem napsal je nesmysl, čili se dvěma metodama asi takto (doufám)
public function show(){
  return $this->item1.$this->item2.$this->item1;
}

public function __toString(){
  return show();
}
Uvnitř objektu si udržuj atributy v atomickém stavu, ale vně objektu je prezentuj jako komplexní hotovou informaci, kterou k něčemu potřebuješ.
Vůbec netuším co je to atomický stav, musím pohledat a nastudovat...
Nesnaž se z vnějšku manipulovat s jednotlivými atributy, to je úkolem metod uvnitř objektu.
No a tohle jde úplně mimo mne. Absolutně nerozumím co se mi snažíš poradit...
14.10.2013 07:16 DarkKnight | skóre: 26
Rozbalit Rozbalit vše Re: Jak dostat do třídy instanci své třídy v php
metoda __toString() se zavola pouze v pripade, ze se pokusis vytisknout objekt (respektive kdyz ho pretypujes na string), proto ji mas zbytecnou (volas $objekt->show(), ne print $objekt)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.