Массив объектов внутри класса в PHP

Недавно я понял, что мой подход к проекту в настоящее время значительно улучшится с использованием более / более описательных объектов. Таким образом, я понял, что хочу, чтобы массив объектов был членом другого класса.

Редактирование: Я не знал, что такое мой вопрос. Мой вопрос таков: как у меня есть массив в классе 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 ?

Да, это сработает.

 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(); 

Это дополнение к ответу Брэда или Сваткинса . Вы написали:

что мне нужно сделать в классе LogFile для создания массива, который содержит объекты типа 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 класс LogFile который соответствует классу LogFile :

 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(); } 

Демо – Надеюсь, это полезно.

Просто создайте другую общедоступную переменную для совпадений. Затем вы можете инициализировать его как массив в методе конструктора .

 class LogFile { public $formattedMatches; public $pathToLog; public $matchCount; public $matches; function __construct() { $matches=array(); //Load $matches with whatever here } } 
 class LogFile { public $formattedMatches; public $pathToLog; public $matchCount; public $matches = array(); } 

PHP не строго типизирован – вы можете поместить все, что угодно, в любую переменную. Чтобы добавить к совпадениям, просто выполните $logFile->matches[] = new Match(); ,

Просто включите

 public $matches = array(); 

Затем, когда вы хотите добавить в массив:

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

Вы можете использовать объект SplObjectStorage поскольку он предназначен для хранения объектов.