Недавно я понял, что мой подход к проекту в настоящее время значительно улучшится с использованием более / более описательных объектов. Таким образом, я понял, что хочу, чтобы массив объектов был членом другого класса.
Редактирование: Я не знал, что такое мой вопрос. Мой вопрос таков: как у меня есть массив в классе 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
поскольку он предназначен для хранения объектов.