[php]Dynamisch aanmaken van class print classinhoud uit

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik ben bezig met een project voor school.

Nu heb ik een functie classes laad aan de hand van de naam.

Hier is die functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function &load_class($class, $instantiate = true)
 {
    static $objects = array();
    
    if(isset($object[$class]))
    {
        return $object[$class];
    }
    
    if(file_exists(BASEPATH . "files/classes/" . $class . ".php"))
    {
        require_once(BASEPATH . "files/classes/". $class . ".php");         
    }
    else
    {
        require_once(APPPATH . "libraries/" . $class . ".php");
    }
    
    if($instantiate)
    {   
        echo "test";
        $object =& new $class();
        die("test1");
    }
    else
    {
        $object = true;
    }
    
    $objects[$class] = $object;
    return $object;
    
 }


Maar als ik die functie nu aanroep dan krijg ik:

boe1
Router Object
(
[controller] => view
[method] => artikel
[parameters] => Array
(
[0] => 1
[1] => 2
)

[uri_string] => /view/artikel/1/2
)

boe
Het wordt dus veroorzaakt door deze regel:
PHP:
1
$object =& new $class();


Heeft iemand een idee hoe dit komt? Ik heb geen idee hoe ik dit kan vinden op google.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

PHP:
1
2
3
<?php
$object =& new $$class();
?>

(Dubbel dollarteken)

[ Voor 28% gewijzigd door Snake op 27-05-2008 14:50 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Snake schreef op dinsdag 27 mei 2008 @ 14:49:
PHP:
1
2
3
<?php
$object =& new $$class();
?>

(Dubbel dollarteken)
Nee, dat werkt ook niet. Dan krijg ik een foutmelding:
Notice: Undefined variable: Router in D:\Tools\XAMPP\htdocs\webshop\files\common.php on line 71
Ik heb andere code als voorbeeld gebruikt, en daar gebruiken ze ook een enkel $-teken.

Acties:
  • 0 Henk 'm!

  • Cosca
  • Registratie: Mei 2006
  • Laatst online: 14-11-2023
Je zegt dat je hem aanroept, maar hoe dan?

ps.
code:
1
2
3
<?php
$object = new $class(); 
?>


referentie is overbodig..

load_class('blablabla'); krijg je gewoon een keiharde error


//edit:
__autoload en singleton misschien een optie?

[ Voor 13% gewijzigd door Cosca op 27-05-2008 15:03 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Kan me ook niet voorstellen dat je met een aanroep ineens output krijgt. Daar zul je toch ergens een echo of print voor moeten doen :?

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Cosca schreef op dinsdag 27 mei 2008 @ 15:02:
Je zegt dat je hem aanroept, maar hoe dan?

ps.
code:
1
2
3
<?php
$object = new $class(); 
?>


referentie is overbodig..

load_class('blablabla'); krijg je gewoon een keiharde error


//edit:
__autoload en singleton misschien een optie?
Ik roep hem zo aan:
PHP:
1
$rtr =& load_class('Router');


En dat geeft geen error, in $rtr komt gewoon de class te staan. Het enige probleem is dat hij nog de inhoud uitprint, dat vind ik behoorlijk vaag.

Bij CodeIgniter doen ze het ook op deze manier:

PHP:
1
2
3
4
5
[...]
        $name = ($class != 'Controller') ? 'CI_'.$class : $class;
    
    $objects[$class] =& new $name();
    return $objects[$class];


Waarbij $class bijvoorbeeld de waarde 'Router' heeft.

Acties:
  • 0 Henk 'm!

  • Cosca
  • Registratie: Mei 2006
  • Laatst online: 14-11-2023
die print staat echt niet in het stukje dat je aan levert, die moet er dus ergens buiten hebben staan

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

compufreak88 schreef op dinsdag 27 mei 2008 @ 15:07:
[...]


Ik roep hem zo aan:
PHP:
1
$rtr =& load_class('Router');


En dat geeft geen error, in $rtr komt gewoon de class te staan. Het enige probleem is dat hij nog de inhoud uitprint, dat vind ik behoorlijk vaag.

Bij CodeIgniter doen ze het ook op deze manier:

PHP:
1
2
3
4
5
[...]
        $name = ($class != 'Controller') ? 'CI_'.$class : $class;
    
    $objects[$class] =& new $name();
    return $objects[$class];


Waarbij $class bijvoorbeeld de waarde 'Router' heeft.
Hoe ziet de class router er uit?

Gebeurt dit ook met andere classes?

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • daniëlpunt
  • Registratie: Maart 2004
  • Niet online

daniëlpunt

monkey's gone to heaven

Wat is er mist met __autoload? :?

Acties:
  • 0 Henk 'm!

  • Cosca
  • Registratie: Mei 2006
  • Laatst online: 14-11-2023
__autoload doet iets anders dan wat de topicstarter wil bereiken.
Hij wil één instantie van een class centraal opslaan en dus overal aan kunnen roepen.
Wel meerdere instanties van verschillende classes

Uiteraard kan dit wel met __autoload, maar dan in combinatie met iets van een singleton-structuur

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
LuCarD schreef op dinsdag 27 mei 2008 @ 15:11:
[...]

Hoe ziet de class router er uit?

Gebeurt dit ook met andere classes?
8)7 8)7 Ok. Het ligt dus aan de class Router. Ik had daar nog een print statement staan. Ik voel me nu echt stom. Het probleem is dus opgelost nu.
Dat zou ik ook wel kunnen gebruiken wss.

Nog even een vraag over references in php: Hoe gebruik je ze precies?
Als ik het goed begrijp, dan maakt php automatisch kopiën van objecten als je er een variabele naar wijst:

PHP:
1
2
$a = new class A;
$b = $a


Verwijst $b nou naar hetzelfde object als $a, of naar een kopie van $a?

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

compufreak88 schreef op dinsdag 27 mei 2008 @ 15:27:


PHP:
1
2
$a = new class A;
$b = $a


Verwijst $b nou naar hetzelfde object als $a, of naar een kopie van $a?
ik zeg....

Test het :)

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Cosca
  • Registratie: Mei 2006
  • Laatst online: 14-11-2023
See for yourself ;)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class foo
{
    public $bar = 'foobar';
}

$a = new foo;
$b = $a;

$b -> bar = 'barfoo';

echo $a -> bar . "\n";
echo $b -> bar . "\n";

// mocht dit ongewenst zijn

$a = new foo;
$b = clone $a;

$b -> bar = 'barfoo';

echo $a -> bar . "\n";
echo $b -> bar . "\n";
?>

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Cosca schreef op dinsdag 27 mei 2008 @ 15:33:
See for yourself ;)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class foo
{
    public $bar = 'foobar';
}

$a = new foo;
$b = $a;

$b -> bar = 'barfoo';

echo $a -> bar . "\n";
echo $b -> bar . "\n";

// mocht dit ongewenst zijn

$a = new foo;
$b = clone $a;

$b -> bar = 'barfoo';

echo $a -> bar . "\n";
echo $b -> bar . "\n";
?>
Ok, niet dus. Maar waarom gebruik je dan bijvoorbeeld references? Of zijn references echt voor buiten de scope?

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

On track


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

In PHP4 moest je (of: kon je beter) references gebruiken bij objecten omdat anders kopieën werden gemaakt. Vanaf PHP5 is dat niet meer zo. Maar een reference is nog altijd wel handig als je bijvoorbeeld twee variabelen naar dezelfde waarde wilt laten wijzen oid (en als je dan de een aanpast dat je dat dan in de andere terugziet)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1