某个属性的PHP聚合,属于某个类中的所有对象
问题描述:
为了做一个OO noob而提前道歉... 我正在尝试编写一种方法来聚合给定类存在的所有对象的属性。下面的代码描述了我想要做的事情。某个属性的PHP聚合,属于某个类中的所有对象
Class TeamMember(){
function SetScore($value) {
$this->score = $value;
}
function GetTotalScoreForTeam() {
//best way to iterate over all the objects to get a sum??????
return totalScore;
}
}
$john = new TeamMember();
$john->SetScore('182');
$paul = new TeamMember();
$paul->SetScore('212');
$totalScore = TeamMember->GetTotalScoreForTeam;
谢谢!
答
麦克乙方在评论你应该先说将您的TeamMember实例分组到一个Team类的实例中,然后运行一些聚合函数来计算该特定团队的总分数,例如
<?php
$team1 = Team::create('Team 1')
->add(TeamMember::create('john')->SetScore(182))
->add(TeamMember::create('paul')->SetScore(212));
$team2 = Team::create('Team 2')
->add(TeamMember::create('peter')->SetScore(200))
->add(TeamMember::create('marry')->SetScore(300));
foo($team1);
foo($team2);
function foo(Team $team) {
$score = $team->membersReduce(
function($v, $e) {
return $v+$e->getScore();
}
);
$members = $team->membersMap(
function($e) {
return $e->getName();
}
);
echo 'team : ', $team->getName(), "\r\n";
echo 'score: ', $score, "\r\n";
echo 'members: ', join(' | ', $members), "\r\n";
}
class TeamMember {
protected $score = 0;
protected $name;
public static function create($name) {
return new TeamMember($name);
}
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function SetScore($value) {
$this->score = $value;
return $this;
}
public function GetScore() {
return $this->score;
}
}
class Team {
protected $members = array();
protected $name;
public static function create($name) {
return new Team($name);
}
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function add(TeamMember $t) {
// <-- check if $t already member of team -->
$this->members[] = $t;
return $this;
}
public function membersReduce($fn) {
return array_reduce($this->members, $fn);
}
public function membersMap($fn) {
return array_map($fn, $this->members);
}
}
打印
team : Team 1
score: 394
members: john | paul
team : Team 2
score: 500
members: peter | marry
答
即使这不是解决这个问题的最好方法,我认为这是最说明您的问题,您预先编写的代码:
class TeamMember { // a class is not a function/method; removed the()
public static $members = array(); // holds the instances
public $score; // It is simply good practice to declare your fields (it is not necessary)
function __construct() {
self::$members[] = $this; // save the instances accessible for your score-calcuating method
}
function setScore ($value) {
$this->score = $value;
}
static function getTotalScoreForTeam() { // a static method is best here
$totalScore = 0;
foreach (self::$members as $member) // foreach over the instances holding list
$totalScore += $member->score;
return $totalScore;
}
}
$john = new TeamMember();
$john->setScore('182');
$paul = new TeamMember();
$paul->setScore('212');
$totalScore = TeamMember::getTotalScoreForTeam(); // for static access, use a :: instead of ->
首先你的类需要访问的所有对象。因此,您需要将它传递给GetTotalScoreForTeam()或将其设置为属性。约翰的182分不知道保罗是否存在,或者他得到了212分。组织方面......我不知道为什么一名队员会有一种方法来计算球队的得分。这应该在Team类中的某个地方保存所有TeamMember对象。 –