0

I'm trying to make a use from Steam API data as I like to learn on live examples, and looking at the way various statistics are returned I began to think that OOP approach would suit me best in this case.

What I'm trying to achieve is to loop through all the results, and programatically populate an array with objects of type that corresponds to the actual type of the statistic. I've tried to build myself a basic class, called Statistic, and after instantiating an object determine wheter or not it's class should change (i.e. whether or not to cast an object of type that Statistic is parent to and if so, of what type). How to do that in PHP? My solution gives me no luck, all of the objects are of type Statistic with it's 'type' property being the object I want to store alone in the array. Code:

$data = file_get_contents($url);
$data = json_decode($data);
$data = $data->playerstats;
$data = $data->stats;
$array;
for($i=0;$i<165;$i++)
    {
        $array[$i]  = new Statistic($data[$i]);
        echo "<br/>";
    }
var_dump($array[10]);

And the classes' code:

<?php

class Statistic
    {
        public function getProperties()
            {
                $array["name"] = $this->name;
                $array["value"] = $this->value;
                $array["type"] = $this->type;
                $array["className"] = __CLASS__;
                return json_encode($array);
            }
        public function setType($x)
            {

                $y = explode("_",$x->name);
                if($y[0]=="total")
                    {
                        if(!isset($y[2]))
                           {
                               $this->type = "General";
                           }
                        else 
                            {
                                if($y[1]=="wins")
                                    {
                                        $this->type = new Map($x);
                                        $this->__deconstruct();
                                    }
                                if($y[1]=="kills")
                                    {
                                        $this->type = new Weapon($x);
                                        $this->__deconstruct();
                                    }
                                else $this->type="Other";
                            }

                    }
                else $this->type = "Other";
            }
        function __construct($obj)
            {
                $this->name = $obj->name;
                $this->value = $obj->value;
                $this->setType($obj);
            }
        function __deconstruct()
            {
                echo "deconstructing <br/>";
                return $this->type;

            }

    }
class Weapon extends Statistic
    {
        public function setType($x)
            {
                $y = explode("_",$x);
                if($y[1]=="kills")
                    {
                        $this->type = "kills";
                    }
                else if($y[1]=="shots")
                    {
                        $this->type = "shots";
                    }
                else if($y[1]=="hits")
                    {
                        $this->type = "hits";
                    }
            }
        function __construct($x)
            {
                $name = explode("_",$x->name);
                $this->name = $name[2];
                $this->value = $x->value;
                $this->setType($x->name);
            }
        function __deconstruct()
            {

            }
}
class Map extends Statistic
    {
        public function setType($x)
            {
                if($x[1]=="wins")
                    {
                        $this->type = "wins";
                    }
                if($x[1]=="rounds")
                    {
                        $this->type = "rounds";
                    }
            }
        public function setName($name)
            {
                if(isset($name[3]))
                    {
                        if(isset($name[4]))
                            {
                                return $name[3] + " " + $name[4];
                            }
                        else return $name[3];
                    }

                else return $name[2];
            }   
        function __construct($x)
            {
                $name = explode("_",$x->name);
                $this->name = $this->setName($name);
                $this->value = $x->value;
                $this->setType($name);    
            }
        function __deconstruct()
            {

            }


    }

Gives the result:

object(Statistic)#223 (3) { 
["name"]=> string(18) "total_kills_deagle" 
["value"]=> int(33) 
["type"]=> object(Weapon)#222 (3) { 
    ["name"]=> string(6) "deagle" 
    ["value"]=> int(33) 
    ["type"]=> string(5) "kills" } 
}

Should that determination be driven from the loop itself, the whole advantage of having a set of functions that does everything for me and returns a ready-to-serve data is gone, since I would really have to cast different objects that aren't connected to each other, which is not the case here. How can I achieve returning objects of different type than the object itself is?

tybin
  • 26
  • 4
  • Can you give us the returned json from API? For testing? – Alberto Favaro Mar 01 '18 at 12:06
  • If you are using the Steam API, chances are you can filter your API call using specific types, for instance "only return weapon stats". Try making more specific api calls and use the results to build objects with more meaningful types like `Weapon` or `Map` instead of a generic `Statistic` object – William Perron Mar 01 '18 at 16:46

1 Answers1

0

For answer your question How can I achieve returning objects of different type than the object itself is?

"Casting to change the object's type is not possible in PHP (without using a nasty extension)"

For more info: Cast the current object ($this) to a descendent class

So you can't change the class type of an instance with type of a derived class. In other world can't change instance of Static with instance of Weapon.

Alberto Favaro
  • 1,824
  • 3
  • 21
  • 46