3

I have a PHP class that can contain an array of its own type this class has also a function called hatch() when I call it for one of the array items it gives me a message you can't call the function. I call it like that

$this->arrayLikeThis[$i]->hatch();

however I made an outer function to hatch the object but I love to call it that way. I know that I can call any function of the the var_dump() of the class is like that:

object(web\ui\structure\tag)#1 (4) {
  ["name"]=>
  string(4) "meta"
  ["type"]=>
  int(1)
  ["attributes"]=>
  array(2) {
    [0]=>
    object(web\ui\structure\attribute)#2 (2) {
      ["attributeName"]=>
      string(7) "content"
      ["attributeValue"]=>
      string(24) "text/html; charset=utf-8"
    }
    [1]=>
    object(web\ui\structure\attribute)#3 (2) {
      ["attributeName"]=>
      string(10) "http-equiv"
      ["attributeValue"]=>
      string(12) "Content-Type"
    }
  }
  ["childNodes"]=>
  array(0) {
  }
}
Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
Romany Saad
  • 115
  • 1
  • 9

2 Answers2

1

You aren't specifying the actual object, just the array of objects:

$this->arrayLikeThis[identifier]->hatch();

where identifier is either a number if your array is numeric, or the name of the element that contains the object whose function you want to call.

I snapped up this example for you just now to show you:

<?php  
    class arby
    {
        public $myID=0;
        public $ray=array();

        public function insertNew()
        {
            $this->ray[0] = new arby();
        }

        public function updateMe()
        {
            $this->myID='1';
        }

        public function displayMe()
        {
            echo $this->myID."\n";
        }

    }

    $var= new arby();
    $var->displayMe();
    $var->insertNew();
    $var->ray[0]->updateMe();
    $var->ray[0]->displayMe();


?>  

which outputs:

0
1

This covers off a class that can have instances of itself within it, adding these into an array and calling functions from within them and individual objects within the array of objects.

Edit: Assuming that the hatch() function is a function within the attribute object, this should work:

$varName->attributes[0]->hatch();

Edit: Assuming that there were further instances of arby within the second one that I made you can call the functions from them like this:

$var->ray[0]->ray[1]->hatch();

This assumes that the variable $var has another instance of the arby class in the array element 0 which in turn has another array and you want to call the function of the object in the element 1 this time.

Fluffeh
  • 33,228
  • 16
  • 67
  • 80
  • sorry but i forgot to put it in the question i've done that i'll update the question thank you. – Romany Saad Sep 04 '12 at 08:18
  • @Romany1St Just to make sure, the `hatch()` function is in the `attribute` object yes - or is it in the `childNodes` object? If it is the latter, then your var_dump doesn't show any that have been created using `= new tag();` which means that the object isn't set - hence you can't call it's functions. – Fluffeh Sep 04 '12 at 08:35
  • @Romany1St I have included an example of code that will allow you to call functions inside a third level of objects if you need. This might help clear it up for you. – Fluffeh Sep 04 '12 at 08:46
  • Thanks man it was about the `foreach` loop instead of for `loop` – Romany Saad Sep 04 '12 at 08:59
1

Fluffeh is right, your code should work fine if it's actually a reference to the class (which I highly doubt that it is). Here's an example that simulates what your class might look like (with the same functions and in an array).

<?php
    class egg {
        private $identifier;
        private $eggChildren = array();
        public function __construct($identifier) {
            $this->identifier = $identifier;
        }
        public function createEgg($identifier) {
            $this->eggChildren[$identifier] = new egg($this->identifier . " - " . $identifier);
        }
        public function hatch() {
            echo "Just hatched egg with ID " . $this->identifier . "<br />";
        }
        public function hatchAllChildren() {
            foreach ($this->eggChildren as $childID => $eggChild) {
                $eggChild->hatch();
            }
        }
    }
    class eggs {
        private $arrayLikeThis;
        const COUNT_EGGS = 3;
        const COUNT_EGG_CHILDREN = 3;
        public function createEggs() {
            $this->arrayLikeThis = array();
            for ($i = 0; $i < self::COUNT_EGGS; $i++) {
                $this->arrayLikeThis[$i] = new egg($i);
                for ($j = 0; $j < self::COUNT_EGG_CHILDREN; $j++) { 
                    $this->arrayLikeThis[$i]->createEgg($j);
                }
            }
        }
        public function hatchEggs() {
            for ($i = 0; $i < self::COUNT_EGGS; $i++) {
                $this->arrayLikeThis[$i]->hatchAllChildren();
                $this->arrayLikeThis[$i]->hatch();
            }
        }
    }

    $eggController = new eggs();
    $eggController->createEggs();
    $eggController->hatchEggs();
?>

And this will output

Just hatched egg with ID 0 - 0
Just hatched egg with ID 0 - 1
Just hatched egg with ID 0 - 2
Just hatched egg with ID 0
Just hatched egg with ID 1 - 0
Just hatched egg with ID 1 - 1
Just hatched egg with ID 1 - 2
Just hatched egg with ID 1
Just hatched egg with ID 2 - 0
Just hatched egg with ID 2 - 1
Just hatched egg with ID 2 - 2
Just hatched egg with ID 2
h2ooooooo
  • 39,111
  • 8
  • 68
  • 102