[OOP] php get_instance_class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
Ik heb de hele dag en nacht suf gezocht, naar iets dat toch simpel moet zijn volgens mij:


Hoe kan ik een array verkrijgen van alle objecten van een classe?

iets van

PHP:
1
2
3
4
5
6
7
8
class foo
{

}
$bar1 = new foo;
$bar2 = new foo;

echo count( get_instances_of_class(foo) );


Waar het mij om gaat is dat ik een automatisch een id kan toewijzen aan iedere klasse
Als ik nu ergens een tellertje had kon ik makkelijk dat voor elkaar krijgen

-- bijvraagje --
Onmogelijk waarschijnlijk
Is het mogelijk om de naam van de variabele van een object binnen dat object te achterhalen?

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
g4wx3 schreef op maandag 07 april 2008 @ 06:53:
Ik heb de hele dag en nacht suf gezocht, naar iets dat toch simpel moet zijn volgens mij:


Hoe kan ik een array verkrijgen van alle objecten van een classe?

iets van

PHP:
1
2
3
4
5
6
7
8
class foo
{

}
$bar1 = new foo;
$bar2 = new foo;

echo count( get_instances_of_class(foo) );


Waar het mij om gaat is dat ik een automatisch een id kan toewijzen aan iedere klasse
Als ik nu ergens een tellertje had kon ik makkelijk dat voor elkaar krijgen

-- bijvraagje --
Onmogelijk waarschijnlijk
Is het mogelijk om de naam van de variabele van een object binnen dat object te achterhalen?
Vraag 1:
Waarom zou je dit willen? Je maakt een object dat foo objecten opzet en voorziet van een oplopende Int. Je kunt het zelfs doen door een interface te definieren die alleen setid(int i) en get(id) heeft en daar vervolgens tegen aan te blaten als je een object wilt voorzien van een ID.

Vraag2:
Ja dat kan. Reflection.

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
vraag 2: Je bedoeld dat ik de naam als een argument moet opgeven?
vraag 1: ik wil div's op m'n website een id geven in de aard van id="foo_#"

Ah, dus er is geen functie. Het is nogal omslachtig om het anders voor elkaar te krijgen.
Mja, het is doenbaar:

Is dit wat je bedoeld?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class object_couter
{
    var $objects;
    function __construct()
    {
    $this->objects = array();
    }
    
    function set_objects($class,$object_name)
    {
    if (!array_key_exists( $class, $this->objects))
    {
    $this->objects[$class] = array();   
    }
    array_push($this->objects[$class],$object_name);
    }
    function get_objects($class)
    {
    return $this->objects[$class];
    }
//singleton trigger
    static private $_instance = null; 
    public static function &sn()
    {
        if ( self::$_instance === null )
        {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}

class foo
{
   var $id;
   function __construct($object_name)
      {
      object_couter::sn()->set_objects('foo',$object_name);
      $this->id = count(object_couter::sn()->get_objects('foo'));
      }
   function get_id()
      {
      return $this->id;
      }
   function get_name()
      {
      $foo = object_couter::sn()->get_objects('foo');
      return $foo[$this->id-1];
      }
}
$bar1 = new foo('bar1');
$bar2 = new foo('bar2');

echo "aantal instanties van: foo: " . count(object_couter::sn()->get_objects('foo')) . "<br>";
echo "objecten_namen (foo) " . "<br>";
print_r( object_couter::sn()->get_objects('foo') );

echo $bar2->get_id() . ": ";
echo $bar2->get_name() . "<br>";


output
code:
1
2
3
4
5
6
7
8
aantal instanties van: foo: 2
objecten_namen (foo) 
Array
(
    [0] => bar1
    [1] => bar2
)
2: bar2



Als ik het idee van de variable namen laat vallen, en alleen de id gebruik dan hoef ik geen argumenten te geven aan de objecten.

Is het dit wat je bedoeld?

[ Voor 4% gewijzigd door g4wx3 op 07-04-2008 10:14 ]

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik zie niet in waarom het nummeren van je divs een antwoord is op vraag 2 die door webgnome gesteld is. Uiteraard kun je een static variabele gebruiken om een teller bij te houden en deze in de construct van de foo class ophogen (waarom sleep je hier een complete singleton implementatie bij??), maar ik vraag me af of je wel het juiste probleem aan het oplossen bent

[ Voor 9% gewijzigd door Janoz op 07-04-2008 10:15 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
aaahzo

Ik snapte nog niet helemaal goed hoe je een static moest gebruiken.
Heb ik dat ook weer ontdekt dankzij jullie.
Bedankt allemaal voor de tips.

Ik heb het dus voor elkaar op de volgende manier.
Is dat hoe het proffesioneel zou worden gedaan?

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
echo '<pre>';

class dom_box
{
    static private $counter;
    function __construct()
    {   
        self::$counter++;
    }
    function get_objects()
    {
        return self::$counter;
    }
}

$boxerobject1 = new dom_box;
$boxerobject2 = new dom_box;
$boxerobject3 = new dom_box;
$boxerobject4 = new dom_box;

echo dom_box::get_objects() . 'instances of ';
echo get_class($boxerobject1). '<br>';

print_r($boxerobject1);echo '</pre>';


Ever het "programeer-probleem".

Het programeer probleem was dat ik aan site wilde maken met allemaal korte berichtjes.
Afhankelijk van inhoud (titel/bericht/links/formulier)allemaal vorm gegeven op dezelfde manier. Je kan dat doen met een array, en een soep van functies.

Toevallig kruiste ik een tutor over OOP. Ik had al gehoord van OOP, maar had dan nog niet echt een idee in welke context ik dat moest gebruiken. Meestal gaat het voorbeeld over een mens een arbeider, of dieren en hond of cat. Maar omdat ik juist me die webstie in m'n hoofdvatte ik instant het hele concept.

Ik heb verschillende tutors gelezen. Maar zoals altijd, als je dan in real life aan de slag gaat, kom je dingen tegen die niet of niet uitgebreid of slecht/niet begrijpbaar zijn uitgelegd.

Beste manier is dus om wat te exerimenteren met de taal constructie. Als het leerijk is maakt het niet uit of iets nuttig is of niet, het brengt ervaring bij. Ik op korte tijd ontzettend veel bijgeleerd over OOP door te experimteren.

wat ik wil doen is dus:

class box{}
class form extend box()
class header exend box()
class footer extend box()
enzo verder..

Dan wil ik met een array of variabele variabele werken (zien wat mogelijk is), om verschillende objecten te definieren, en opzullen met inhoud uit een DB. Om daarna keurig uit te printen.
Ik zoveel mogelijk automatisch door de classe zelf laten doen. Zoals een id geven aan iedere object. Daarom wilde ik een interne counter, dan moet ik 1 argument minder doorgeven. Een andere id opgeven is nog altijd een mogelijkheid. Maar ik denk niet dat het noodakelijk zal zijn op deze manier.

[ Voor 9% gewijzigd door g4wx3 op 08-04-2008 14:04 ]

http://www.softfocus.be/