某个属性的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; 

谢谢!

+2

首先你的类需要访问的所有对象。因此,您需要将它传递给GetTotalScoreForTeam()或将其设置为属性。约翰的182分不知道保罗是否存在,或者他得到了212分。组织方面......我不知道为什么一名队员会有一种方法来计算球队的得分。这应该在Team类中的某个地方保存所有TeamMember对象。 –

麦克乙方在评论你应该先说将您的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 ->