Autor Zpráva
TFSi
Profil
Zdravím,
omlouvám se za blbý titulek, ale lepší mně nenapadl :/

Mám tyto soubory:
index.php
<?php
require_once 'class.Main.php';
$app = new Main;


class.Main.php
<?php
class Main {
	public $trida;
	public static $http = Array();
	function __construct() {
		require_once 'class.Trida.php';
		$this->trida = new Trida;
	}
/* zbytek kódu */
}


a class.Trida.php
<?php
class Trida {
	public function Trida() {
/*1)*/		Main::$http[] = 'obsah'; // skončí na Fatal error (viz níž)
/*2)*/		global $app;
			$app->http[] = 'obsah'; // tak tahle šaškárna projde...?!
	}
}


a pokud se to takhle pokusím spustit, tak se mi to zacyklí :( . Pokud ale třída Trida nebude mít extends Main, tak to poběží tak jak má, jenomže z ní nebudu moc pořádně zasahovat do proměnných v třídě Main.

Poradíte někdo?
bohyn
Profil
TFSi
a pokud se to takhle pokusím spustit, tak se mi to zacyklí :( . Pokud ale třída Trida nebude mít extends Main, tak to poběží tak jak má, jenomže z ní nebudu moc pořádně zasahovat do proměnných v třídě Main.
Tohle reseni je pekna blbost. Z Tridy muzes normalne pristupovat k promenym v Main (pokud je to treba), takze zadny takovy hybrid neni treba.
TFSi
Profil
bohyn
Z Tridy muzes normalne pristupovat k promenym v Main (pokud je to treba), takze zadny takovy hybrid neni treba.
:: jsem zkoušel, ale i když mám proměnou nastavenou na public static, tak skončím na Fatal error: Access to undeclared static property: Main::$http in ... (upravil jsem příklad nahoře aby to bylo vidět)

Zatím jsem to řešil prasárnou typu global $app; $app->http = ... , jenže takovouhle šaškárnu snad ani nemůžu vypustit do ostrého provozu ;)

Btw, ještě mně napadlo: nemůže třeba název třídy Main kolidovat s něčím ve vnitřnostech PHP?
Aesir
Profil
TFSi:

1.) v třídě Trida dědíte i ten konstruktor, tak se nedivte, že se vám cyklí
2.) parent

edit: aha, tak už nedědíte :))
TFSi
Profil
Aesir
aha, tak už nedědíte :))
To je právě ono - když nedědím, tak se Main nedostanu, a když dědím, tak se to cyklí :(
bohyn
Profil
TFSi
Nejlepsi bude asi priklad
class trida1 {
  public $var;

  function __construct() {
    $this->var = 1;
  }

  function getvar() {
    return $this->var;
  }
}

class trida2 extends trida1 {

  function __construct() {
    parent::__construct();
  }

  function printvar() {
    echo $this->var;
    echo parent::getvar();
  }
}

$trida = new trida2;
$trida->printvar(); // 11


Btw, ještě mně napadlo: nemůže třeba název třídy Main kolidovat s něčím ve vnitřnostech PHP?
Jelikoz php funkci main() nema a ani neni rezervovane slovo tak by to kolidovat nemelo.
TFSi
Profil
bohyn
Jasně, chápu. Díky.
Ale ještě se zeptám: jde to použít i v případě, že chci do (pokud to vztáhnu na tvůj příklad) třídy trida1 vložit třeba pět, šest tříd, které by měly "extends trida1"??
bohyn
Profil
TFSi
Vkladani potomku do rodicovske tridy je logicka chyba, ale udelat by to slo. Pokud by se tridy vytvarely v konstruktotu trida1 tak by v tride2 bylo treba zabranit volani konstruktoru parent::_construct() (aby nedoslo k cykleni) a inicializovat vsechny promene v konstruktoru trida2
TFSi
Profil
Vkladani potomku do rodicovske tridy je logicka chyba
Aha ... :|
... takže: se asi trošku změnilo téma:
mám několik tříd a chci, aby se všechny nějak automaticky načetly. Tedy abych v index.php nemusel dělat něco jako
<?php
require_once 'trida1.php';
$trida1 = new trida1;
require_once 'trida2.php';
$trida2 = new trida2;
...

ale aby se to dalo udělat zavoláním jedné funkce / třídy / prostě nečeho?
bohyn
Profil
TFSi
Reseni je nekolik:
1) sesypat tridy do jednoho souboru a instanci kazde tridy vytvorit v tom souboru.
2) vytvorit dalsi script ktery vlozi jednotlive tridy a vytvori instanci kazde z nich
3) udelat funkci ktera se potara o vlozeni a jejichvytvoreni a
3a) vysledek vrati jako pole
3b) promene definujes mimo funkci a funkce k nim pak pristupuje pres global
// definice promenych
$trida1 = $trida2 = null;
function vytvor_tridy() {
  global $trida1, $trida2;
  // require ... 
  $trida1 = new trida1;
  // atd.
}


Edit: 4) Vytvorit tridu ktera bude slouzit jako kontejner pro pozadovane tridy.

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: