Autor Zpráva
Shadowek
Profil
Dobrý den, potřeboval bych z instance objektu pracovat s nadřazeným objektem, ale nenapadá mě jak na to ..
class objekt1{
//...metody, proměnné
__construct(){
  $this->promenna = new objekt2();
}
class objekt2{
//...dalsi metody, dalsi promenne
public function udelej_neco(){
//A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1)
}
}
}

Snad jste můj příklad pochopili a máte nějaké řešení jak na to ...
Majkl578
Profil
A co ti brání použít $this (za předpokladu, že to bude opravdu rodič, což teď není — chybí extends)?
Jinak doporučení: kód se snaž lépe formátovat a uvádět funkční celky, v tomhle se nedá vyznat.
__construct
Profil
Shadowek:
Keď chceš pracovať v triede objekt2 s triedou objekt1 musíš si vytvoriť jej inštanciu v objekt2, priradiť ju nejakej premennej a potom k nej cez ňu pristupovať:

class objekt1{
    //…metody, proměnné
    public function verejnaMetoda(){
        echo "Ahoj";
    }
}

class objekt2{
    private $promenna;
    public function __construct(){
        // inštancia triedy objekt1
        $this->promenna = new objekt1();
    }
    //…dalsi metody, dalsi promenne
    public function udelej_neco(){
        //A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1)
        $this->promenna->verejnaMetoda();
    }
}
Shadowek
Profil
Ano to chápu, ovšem já bych to potřeboval naopak ...
class objekt1{
    //…metody, proměnné
    public function verejnaMetoda(){
        //tady potřebuju pracovat s metodami objektu objekt2
    }
}

class objekt2{
    private $promenna;
    public function __construct(){
        // inštancia triedy objekt1
        $this->promenna = new objekt1();
    }
    //…dalsi metody, dalsi promenne
    public function udelej_neco(){
        //A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1)
        $this->promenna->verejnaMetoda();
    }
}
tiso
Profil
Shadowek: popíš presnejšie čo chceš dosiahnuť.
Shadowek
Profil
No já bych potřeboval, aby třída která je přístupná přes proměnnou v jiné třídě mohla volat funkce té třídy, ze které byla volaná. Snad ten popis pochopíte. Zkusím napsat trefnější ukázku.
class mysql{
  protected $user;
  protected $pass;
  protected $host;
  protected $db;
  public $conn = false;
  public $generator;
  public function __construct($host = NULL, $user = NULL, $pass = NULL, $db = NULL $connect = false){
    $this->user = $user;
    $this->pass = $pass;
    $this->host = $host;
    $this->db = $db;
    if($connect === true){
      $this->connect();
    }
    $this->generator = new gen();
  }
  public function protect($string){
    return mysql_real_escape_string($string);
  }
  //Několik nezajímavých metod...
}
class gen{
  public function insert($table, $vals){
    //Tady potřebuji proměnnou $table cenzurovat metodou protect() ze třídy mysql
    $sql = "INSERT INTO `".$table."`";
    $f = "";
    $s = "";
    foreach($vals as $key => $item){
      if($f != ""){
        $f .= ", ";
      }
      if($s != ""){
        $s .= ", ";
      }
      //Tady potřebuji proměnnou $key cenzurovat metodou protect() ze třídy mysql
      $f .= "`".$key."`";
      if($item === "NULL" || $item === NULL || strlen($item) < 1){
        $s .= "NULL";
      }
      else{
        //Tady potřebuji proměnnou item cenzurovat metodou protect() ze třídy mysql
        $s .= "'".$item."'";
      } 
    }
    $sql = $sql."(".$f.") VALUES (".$s.")";
    return $sql; 
  }
}
Nox
Profil
Shadowek:
toto se obvykle provádí tak, že to co chceš ošetřit (proměnné) nepíšeš přímo do řetězce, ale předáš to jako argument db funkci a ta si to pak zpracuje sama

příklad z doctrine2 DBAL
$count = $conn->executeUpdate('UPDATE user SET username = ? WHERE id = ?', array('jwage', 1));
Shadowek
Profil
No ano, ale o to mi tady nejde, to byl jen příklad. Mě jde spíše o to abych mohl využít ty funkce ze třídy mysql
AM_
Profil
Nic proti, ale tohle je typický příklad toho, jak objektové programování nevypadá. Teoreticky toho lze docílit tak, že instanci toho "nadřazeného" objektu předáš konstruktoru toho "podřazeného" objektu, třeba takto:
class Foo
{
  protected $bar;
  public function __construct()
  {
    $bar = new Bar($this);
  }
  public function baz()
  {
    echo 'foo bar baz';
  }
}
class Bar
{
  protected $ownerFoo;
  public function __construct($ownerFoo)
  {
    $this->ownerFoo = $ownerFoo;
    $this->ownerFoo->baz(); //zde volame baz() na "nadrazenem" objektu
  }
}


ovšem v 95% případů začátečníků, kdy dojdou do situace, že potřebují takto volat něco z "vlastníka", je to příznak špatně navrženého schématu objektů, a ty bohužel nejsi mezi šťastnými 5%.
1) potřebuješ si psát vlastní třídu pro připojení k mysql? pro základní funkce použij vestavěnou třídu mysqli, pokud chceš nějaký "pěkný" přístup, je zde spousta free záležitostí (od jednoduché dibi po propracovanou doctrine). Autory všech těchto věcí jsou mnohem zkušenější programátoři, a pokud chceš napsat vlastní, spíš se k tomu vrať za pár let, až budeš ostřílený programátor a bude pravděpodobné, že tvůj DB engine bude srovnatelný s jejich.
2) pokud má gen být třída pro generování dotazů (zajímavé, já bych jménem gen nazval spíš třídu reprezentující údaj lidské genetické informace, DBQueryGenerator nebo tak něco by bylo lepší) a třída mysql sloužit pro obhospodařování spojení, tak by zřejmě metoda protect měla být členem třídy Gen.
Shadowek
Profil
Hmm, díky no. Tak nechtěl bys mi napsat jak to má vypadat správně navržené? A já mám v normálním kódu generator, jen tu jsem omylem použil gen.
joe
Profil
A proč nenapíšeš tu metodu protect jako statickou?

public static function protect($string){


A v dalším kódu pak

$sql = "INSERT INTO `". mysql::protect($table) . "`";


Nox:
toto se obvykle provádí tak...
Kdybych to psal já, odpověděl bych ti na to - a co je mi do toho, jak to dělají jinde. On v tom svém kódu místo ručně psaného dotazu má název metody (insert), kam jen předá parametry. Takže nemusí celý dotaz psát ručně. A někomu to tak vyhovuje.
AM_
Profil
Shadowek:
Tak nechtěl bys mi napsat jak to má vypadat správně navržené?

AM:
tak by zřejmě metoda protect měla být členem třídy Gen.

ostatně já bych takovou třídu ani nenavrhoval, třída mysql ve tvém podání mi přijde jako definice zbytečnosti sama, nevidím, že by oproti vestavěné třídě mysqli přinášela něco nového (snad jen nahrazení zdlouhavého "real_esacpe_string" - což je název jednoznačně říkající, že ta funkce escapuje řetězec - za méně výstižnější "protect" - což může klidně znamenat, že ten řetězec šifruje, umisťuje do chráněné paměti nebo nevím co ještě).
Třída generator (stále mi ten název nepřijde dost výstižný) by mohla existovat sama o sobě, mohlo by se to používat nějak takto:
$db->query(MyQueryGen::insert('tabulka', $data));
Shadowek
Profil
joe:
No řešit to statickou metodou mě napadlo, ale nevěděl jsem co to slůvko "static" přesně dělá, chtěl jsem si to večer prostudovat, protože v tuto chvíli nemám přístup k mému kódu. A chtěl jsem se zeptat, protože s OOP v PHP začínám, jak bych to měl udělat tedy správně?
AM_
Profil
Shadowek:
A chtěl jsem se zeptat, protože s OOP v PHP začínám, jak bych to měl udělat tedy správně?
už jsem ti to napsal dvakrát, zkus upřesnit, co ti není jasné.
Shadowek
Profil
AM:
No jako jak by ta třída vypadala nějak správně navržená, to by jako všechny metody byly uvnitř toho hlavního objektu? Tvou předchozí odpověď jsem neviděl, protože jsem začal psát odpověď pro joeho když jsi to odeslal a pak sem si ji nevšiml. A o existenci něčeho jako je mysqli jsem ještě nezaregistroval ... Nevím jak se to mohlo stát :)
AM_
Profil
Shadowek:
to by jako všechny metody byly uvnitř toho hlavního objektu?
já nevím jaké všechny metody tam máš, jen říkám, že zde bych escape prováděl ve třídě toho generátoru a na třídu mysql bych se vykašlal.
Jak obecně dělat objektové návrhy o tom se dá napsat celá knížka (můžeš si nějakou koupit), to se určitě nedá vysvětlit na dva řádky v diskusi...
Shadowek
Profil
A nechceš sem nějakou takovou napsat? :D No tak díky, pročtu si něco kdyžtak o té mysqli. Děkuji :)
joe
Profil
Asi to už je vyřešené, ale přece...

AM:
...že zde bych escape prováděl ve třídě toho generátoru a na třídu mysql bych se vykašlal

To se mi nějak nezdá. Proč by metoda "protect" nebo nazvaná lépe měla být ve třídě generátoru? Vždyť už samotné slovíčko "mysql" v názvu oné funkce jasně říká, že to patří k mysql...

Pak by to totiž mohlo fungovat tak, že třída generátoru by byla nezávislá na typu databázi, což by s tím tvým návrhem nešlo... Nebo se pletu?

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