如何让我的班级从课堂外使用数组?

时间:2014-02-17 15:54:40

标签: php arrays object

我目前正在尝试重新进入面向对象编程如何在我的课程中获取我的数组?全球公司没有接缝来削减它。

<?
$systems = file_get_contents('https://api.eveonline.com/map/Sovereignty.xml.aspx');
$systems = explode("<row ",$systems);
//print_r($systems);
for ($i = 1; $i <= count($systems); $i++) {

    //system name
    $systemnames=explode("solarSystemName=",$systems[$i]);
    $systemnames=explode('"',$systemnames[1]);
    $systemnames=$systemnames[1];

    //system id
    $systemid=explode("solarSystemID=",$systems[$i]);
    $systemid=explode('"',$systemid[1]);
    $systemid=$systemid[1];

    $systembyid[$systemid]=$systemnames;
    $systembyname[$systemnames]=$systemid;
}   

class Systems{    

    public function __construct()
    {
        global $systembyid;
        global $systembyname;
    }

    function getSystems($system)
    {
        if (is_numeric($system) && $systembyid[$system]) {
            return $systembyid[$system];
        }
        elseif($systembyname[$system]){
            return $systembyname[$system];
        }
        else{
           return "Error: Invalid system id or name";
        }
    }
}

?>

3 个答案:

答案 0 :(得分:0)

我更喜欢使用 依赖注入 。依赖注入是指通过构造函数注入对象的依赖项。这可以确保对象在创建时具有依赖性。

class Systems {
    protected $systembyid;
    protected $systembyname;

    public function __construct($systembyid, $systembyname)
    {
        $this->systembyid = $systembyid;
        $this->systembyname = $systembyname;
    }

    public function getSystems($system) {
        //Access them with $this-> like below
        $this->systembyid[$system];
        $this->systembyname[$system];
    }
}

注意 如果您希望能够在课堂外修改$systembyid$systembyname,并查看其中的更改在类中,您可以通过将参数指定为引用来传递对__construct()的引用:

public function __construct(&$systembyid, &$systembyname)
{
    $this->systembyid = $systembyid;
    $this->systembyname = $systembyname;
}

或者,您可以将它们作为参数传递给getSystems()方法。

class Systems() {
    public function getSystems($system, $systembyid, $systembyname) {
        //Do stuff
    }
}

这种方法的主要缺点是你总是必须将它们作为参数传递给方法,并且方法签名可能会很长。

答案 1 :(得分:0)

您需要在使用它的函数中使用带有var的global关键字,在本例中为getSystems()(错误)或将它们传递给构造函数或使用它们的函数,或设置它们:

可能是最常见的情况:

public function __construct($s1, $s2)
    {
        $this->systembyid = $s1
        $this->systembyname = $s2
    }
//then use $this->systembyid etc in other functions

或者更好的是,为什么不将所有处理代码放在类processSystems()之类的函数中并在那里设置变量:

public function processSystems($file) {
    $systems = file_get_contents($file);
    $systems = explode("<row ",$systems);
    //print_r($systems);
    for ($i = 1; $i <= count($systems); $i++) {

        //system name
        $systemnames=explode("solarSystemName=",$systems[$i]);
        $systemnames=explode('"',$systemnames[1]);
        $systemnames=$systemnames[1];

        //system id
        $systemid=explode("solarSystemID=",$systems[$i]);
        $systemid=explode('"',$systemid[1]);
        $systemid=$systemid[1];

        $systembyid[$systemid]=$systemnames;
        $systembyname[$systemnames]=$systemid;
    }   
    $this->systembyid = $systemnames;
    $this->systembyname = $systemid;
}

除此之外,我会考虑查看simple_xmlDOM进行XML解析。

此外,您在每个数组中存储完全相同的数据。只需使用一个,然后查找键或值。

答案 2 :(得分:0)

尝试将值传递给构造函数,如果使用&,只是传递引用而不是复制整个数组。

class Systems{    

    private $sysyembyid;
    private $systembyname;

    public function __construct(&$systembyid, &$systembyname)
    {
        $this->systembyid = $systembyid;
        $this->systembyname = $systembyname;
    }

    function getSystems($system){
        if(is_numeric($system) && $this->systembyid[$system]){
        return $this->systembyid[$system];
    }
    elseif($this->systembyname[$system]){
            return $this->systembyname[$system];
        }
        else{
           return "Error: Invalid system id or name";
        }
    }
}