Почему в классе позволяет использовать все функции другого класса не объявленные в интерфейсе?

Вот структура моего проекта:

index.php

require_once __DIR__.'/classes/SignUp.php';
require_once __DIR__.'/classes/ParsePage.php';
require_once __DIR__.'/classes/CaptchaSolver.php';

$Parser = new ParsePage( 'cookie.txt' );
$CaptchaSolver = new CaptchaSolver( 'token', $Parser );
$DataGenerator = new DataGenerator();

$SignUp = new SignUp( $Parser, $CaptchaSolver, $DataGenerator, 'https://smm-rock.ru');
$create = $SignUp->create();

ParsePage

interface IParsePage {
    public function parseSource($str, $case = 1);
    public function getPage( $source, $method = 'GET', $post_data = '' );
    public function getAllRows($rows);
}

interface IParserGetHtmlString {
    public function getPage( $source, $method = 'GET', $post_data = '' );
}

class ParsePage implements IParsePage, IParserGetHtmlString {
    ...
    public function getPage( $source, $method = 'GET', $post_data = '' ) {
        ...
    }
}

CaptchaSolver

interface ICaptchaSolver {
    public function rucaptcha($type = 'in', $site_key = '', $pageurl = '');
}

class CaptchaSolver implements ICaptchaSolver {
    private $token;
    private $parser;

    function __construct($token, IParserGetHtmlString $parser) {
        $this->token = $token;
        $this->parser = $parser;
    }

    public function rucaptcha($type = 'in', $site_key = '', $pageurl = '') {
        ...
        $go = $this->$parser->parseSource('http://test.ru');
        //тут срабатывает и успешно выполняется функция parseSource, хотя ее нет в интерфейсе IParserGetHtmlString 
    }


}

Почему так происходит? Буду благодарен за разъяснение!


Ответы (2 шт):

Автор решения: Алексей Шиманский

успешно выполняется функция parseSource, хотя ее нет в интерфейсе IParserGetHtmlString

Зато метод есть в IParsePage

→ Ссылка
Автор решения: Ильнур Гильманов

Зависимость IParserGetHtmlString $parser - гарантирует что у объекта будет методы интерфейса, при этом совсем не важно какие методы могут быть у этой зависимости. Под зависимостью сейчас уже имею ввиду объект. $parser - это же объект, правильно? Интерфейс - это просто набор методов, которые обязательно должны быть у объекта.

→ Ссылка