Model tournaments between teams
Your code is actually much better than the average. Congrats.

I would change ICandidate to Candidate. No one needs to know if this is an interface, abstract class, concrete class, etc. Don't break encapsulation.

Also, using types makes your code more readable and less error prone.

I wouldn't also use getters and setters. For instance:

class Participant
{
    private string $name;
    private string $class;

    public function __construct(string $name, string $class)
    {
        $this-&gt;name = $name;
        $this-&gt;class = $class;
    }

    public function name(): string
    {
        return $this-&gt;name;
    }

    public function class(): string
    {
        return $this-&gt;class;
    }
}


But... do you really need the Participant class? From your example, it's not necessary.

In your Tournament class, $participants is an array of Candidates. 

Ah, I would also use namespaces so I would be able to implement autoloading (https://www.php-fig.org/psr/psr-4/)