php5, include_once

Programovacie jazyky, rady, poradňa...
final
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 04 dec 2005, 11:43
Bydlisko: Prievidza

php5, include_once

Príspevok od používateľa final »

čafte..

mám jednu triedu, pre includovanie súborov (ktorá obsahuje debug, atď)..

sú 2 súbory..
v tom prvom includujem ten druhý súbor a následne ho zobrazujem..

problém spočíva v tom, že v tom prvom súbore ešte pred include vytváram zopár inštancií na triedy, ktoré chcem taktiež používať v tom druhom súbore..

momentalne to mám riešené cez type hinting, ale to mi príde dosť škaredé..

zádrhel je ten, že to čo sa includuje je obsahom len danej inštacie (resp. to includujem len cez :: ), nie scriptu..

nejaký nápad? thx
carnaby
Amateur
Amateur
Príspevky: 24
Registrovaný: 23 aug 2005, 20:32
Bydlisko: Martin

Príspevok od používateľa carnaby »

asi je to tou rannou hodinou ale vobec som ta nepochopil :( skus lepsie vysvetlit kde je problem.

avsak v php5 ak vytvaras triedy mozes na include napisat aj autoloader kde mozes vyhodnotit nazov triedy a podla toho includnut co potrebujes. Tento sposob je vsak evidentne pomalsi ako ked pouzijes include_once tam kde ho potrebujes

Kód: Vybrať všetko

<?php
function __autoload($class_name) 
{
   require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

ak ti vsak nejaky inklud zapisuje hned nieco do vystupu (echo) a ty to nechces alebo by si to radzej mal v premennej tak sa to da cez ob_.....

Kód: Vybrať všetko

<?php
ob_start();

echo "Hello World";

$out = ob_get_clean();
$out = strtolower($out);

var_dump($out);
?>
a len na okraj hinting neni skareda vec :)
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

ehm .. tiez som si nie isty ci dobre chapem ale ...

ked tie premenne (instanice niecoho) "prvej" triedy spravis ako staticke ... nepojdu pouzit v ten "druhej"??
Nosferatu
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 24 máj 2005, 8:50

Príspevok od používateľa Nosferatu »

..on myslí asi thak, že keď má súbor, v ktorom má vytvorené inštancie tried, za tým má includnutý súbor a v ňom chce používať objekty z toho súboru, ktorý includuje ten v ktorom chce používať tie objekty, či ich položky..
no neviem, ono to nejde, aby includnutý súbor používal triedy a objekty ktoré sú v súbore ktorý ho includuje? :o .. možno som len zle pochopil.. to to ráno :?
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

Nosferatu napísal:..on myslí asi thak, že keď má súbor, v ktorom má vytvorené inštancie tried, za tým má includnutý súbor a v ňom chce používať objekty z toho súboru, ktorý includuje ten v ktorom chce používať tie objekty, či ich položky..
no neviem, ono to nejde, aby includnutý súbor používal triedy a objekty ktoré sú v súbore ktorý ho includuje? :o .. možno som len zle pochopil.. to to ráno :?
ja som to pochopil tak isto .. a preco by nesli pouzit staticke atributy?
final
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 04 dec 2005, 11:43
Bydlisko: Prievidza

Príspevok od používateľa final »

ok, sorry, horšie som to asi nemohol napísať :oops:

carnaby, ten autoload mi ja na nič, ale inak zaujímavá vec..
a ten hinting, mne to pekne nepríde, 8 inštancií takto tlačiť do toho objektu... hm.. a ten ob_* tam mám, lebo je to template to, čo sa includuje a následne ešte priraďujem obsah na určité časti tej predlohy.. ale dííík za snahu :)

ale k tomu vysvetleniu..

[subor:1]

Kód: Vybrať všetko

<?
$x =  new nejakaTrieda;
$x->blabla = 10;

class includeTrieda
{
public function __construct($subor)
 {
 if(!@include_once($subor))
  {
  ..debug..
  }
 }
}

new includeTrieda('subor:2');
?>
[subor:2]

Kód: Vybrať všetko

<?=$x->blabla;?>
= čiže by som chcel aby sa zobrazilo 10, bez hintingu a s tým, že by include_once ostalo v triede.. (samozrejme keď ho dám mimo triedy, išlo by to)

problémom sa to nedá nazvať, ja len skôr dúfam, že existuje pri triedach niečo ako pri funkciách (global), akurát už v nejakom lepšiom štádiu..
Nosferatu
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 24 máj 2005, 8:50

Príspevok od používateľa Nosferatu »

Cez globálne polia by to šlo takto.. tiež som mal podobný problém a keďže sa mi to necelo riešiť spravil som to takto.. ale neni to najlepší spôsob, ale funguje
<?
$GLOBALS["x"] = new nejakaTrieda;
$GLOBALS["x"]->blabla = 10;

class includeTrieda
{
public function __construct($subor)
{
if(!@include_once($subor))
{
..debug..
}
}
}

new includeTrieda('subor:2');
?>
<?=$GLOBALS["x"]->blabla;?>
a tamtá trieda by mohla fungovať nejak takto aj.. a potom nemáš problém s tým druhým súborom..

Kód: Vybrať všetko

class includeTrieda
{
 public function __construct($subor)
 {
  if(!subor)
  {
  ..debug..
  }
 }
}

new includeTriedy(@include_once('subor:2'));
final
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 04 dec 2005, 11:43
Bydlisko: Prievidza

Príspevok od používateľa final »

no to už je lepšie :) počkám ešte na ostatných ak niečo majú, ak nie tak to použijem.. dík (karma+)

// edit: ehm, k tej triede, ono to je trochu inak navrhnuté, ide to cez pár tried
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

hmm ja tam ziadny type hinting nevidim :?

a nemozes dat tu $x do tej includeTriedy?
Nosferatu
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 24 máj 2005, 8:50

Príspevok od používateľa Nosferatu »

rád som pomohol :) ..

no ja by som to $x nepchal do tej triedy, lepšie by asi bolo to druhé čo som napísal, tj. vyhodiť include von z triedy a debugovať len návratovú hodnotu includu (tj. false pri zlyhaní) vtedy sa trieda natiahne priamo na úroveň ostatných a nie do tej jednej, čo som predtým aj ja robil a zistil som že to neni moc dobré.. začal som používať globálne polia, ale to v OOP nemá čo robiť..
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

Nosferatu napísal:rád som pomohol :) ..

no ja by som to $x nepchal do tej triedy, lepšie by asi bolo to druhé čo som napísal, tj. vyhodiť include von z triedy a debugovať len návratovú hodnotu includu (tj. false pri zlyhaní) vtedy sa trieda natiahne priamo na úroveň ostatných a nie do tej jednej, čo som predtým aj ja robil a zistil som že to neni moc dobré.. začal som používať globálne polia, ale to v OOP nemá čo robiť..
v OOP nema co robit ani samostatna premenna mimo triedy :)
carnaby
Amateur
Amateur
Príspevky: 24
Registrovaný: 23 aug 2005, 20:32
Bydlisko: Martin

Príspevok od používateľa carnaby »

chapem ako nechapem preco...

rozumiem vsetkemu no nerozumiem aky benefit stoho ma byt. OOP za kazdu cenu ? naco vytvarat instanciu triedy ked tam prebehne akurat konstruktor mozno par volani nejaky log a instancia zanika ??? to uz radsej staticka trieda pripadne triedy s vlastnym factory pripadne instancie singleton ci manager instancii.
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

ja osobne by som to riesil sposobom, kedy sa vyuziva prostredny (sprostredkovatelsky) objekt

[class.nejakaTrieda.php]

Kód: Vybrať všetko

<?
class nejakaTrieda
{
  public $blabla;
  
  public function __construct()
  {
  }

}
?>
[class.Trieda.php]

Kód: Vybrať všetko

<?php
require_once "class.nejakaTrieda.php";
class Trieda
{
  static private $_instance;
  
  public function __construct()
  {
  }

  public static function &Create($return=true) 
  { 
    if (!isset(self::$_instance)) 
    { 
      self::$_instance = new nejakaTrieda();
    } 
    if( $return )
    return self::$_instance; 
  }

  static public function get($name)
  {
    if( !isset(self::$_instance) )
      self::Create(false);
    $arr = get_object_vars(self::$_instance);
    if( array_key_exists($name, $arr) )
    {
        return self::$_instance->$name;
    }
    else
      return "co vlastne chces????";
  }

}
?>
[index.php]

Kód: Vybrať všetko

<?php
require_once "class.Trieda.php";

class includeTrieda
{
public function __construct($subor)
 {
 if( file_exists($subor) )
  {
    ob_start();
      include_once($subor);
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
  }
 }
}

$x = Trieda::Create();
$x->blabla = 10;

new includeTrieda('subor.php');
?>
[subor.php]

Kód: Vybrať všetko

<?=Trieda::get("blabla"); ?>
Napísať odpoveď