PHP中类中的对象数组

时间:2011-10-18 18:55:43

标签: php class

我最近意识到我对项目的当前方法将通过使用更好/更具描述性的对象而大大改进。因此,我意识到我希望一个对象数组成为另一个类的成员。

编辑:我不清楚我的问题是什么。我的问题是:我如何在类LogFile中有一个包含Match类型对象的数组?

class LogFile
{
    public $formattedMatches;
    public $pathToLog;
    public $matchCount;
    ** An array called matches that is an array of objects of type Match **
}

class Match
{
    public $owner;
    public $fileLocation;
    public $matchType;
}

最终我希望能够做到这样的事情:

$logFile = new LogFile();
$match = new Match();
$logFile->matches[$i]->owner = “Brian”;

我如何做我描述的内容?换句话说,我需要在类LogFile中创建一个包含Match类型对象的数组?

6 个答案:

答案 0 :(得分:4)

这是对answer by Bradby swatkins的补充。你写道:

  

我在LogFile类中需要做什么来创建一个包含Match类型对象的数组?

您可以创建一个只能包含Match个对象的“数组”。通过从ArrayObject扩展并仅接受特定类的对象,这相当容易:

class Matches extends ArrayObject
{
    public function offsetSet($name, $value)
    {
        if (!is_object($value) || !($value instanceof Match))
        {
            throw new InvalidArgumentException(sprintf('Only objects of Match allowed.'));
        }
        parent::offsetSet($name, $value);
    }
}

然后,您使用LogFile类{<1}}使您成为Matches课程。

class LogFile
{
    public $formattedMatches;
    public $pathToLog;
    public $matchCount;
    public $matches;
    public function __construct()
    {
        $this->matches = new Matches();
    }
}

在你设置它的构造函数中,新的Matches“数组”。用法:

$l = new LogFile();
$l->matches[] = new Match(); // works fine

try
{
    $l->matches[] = 'test'; // throws exception as that is a string not a Match
} catch(Exception $e) {
    echo 'There was an error: ', $e->getMessage();

}

Demo - 希望这有用。

答案 1 :(得分:1)

只需为匹配创建另一个公共变量。然后,您可以将其初始化为constructor method中的数组。

class LogFile
{
    public $formattedMatches;
    public $pathToLog;
    public $matchCount;
    public $matches;

    function __construct() {
        $matches=array();
        //Load $matches with whatever here
    }
}

答案 2 :(得分:1)

class LogFile
{
    public $formattedMatches;
    public $pathToLog;
    public $matchCount;
    public $matches = array();
}

PHP没有强类型 - 您可以在任何变量中添加任何您喜欢的内容。要添加到匹配项,只需执行$logFile->matches[] = new Match();

答案 3 :(得分:1)

是的,那会有用。

class LogFile
{
    public $formattedMatches;
    public $pathToLog;
    public $matchCount;
    public $matches = array();
}

class Match
{
    public $owner;
    public $fileLocation;
    public $matchType;
}

$l = new LogFile();
$l->matches[0] = new Match();

答案 4 :(得分:0)

请加入

public $matches = array();

然后当你想要添加到数组时:

$matches[] = $match;   // $match being object of type match

答案 5 :(得分:0)

您可以使用SplObjectStorage的对象,因为它旨在存储对象。