Как использовать пространство имен в конструкторе родительского класса

1

У меня есть класс с именем Service_B который расширяет пользовательский класс сервиса.

Для этого пользовательского класса службы требуется один объект с именем Reader в его __construct() для правильного создания экземпляра.

Родительская служба определяется следующим образом.

namespace Vendor\Services;

abstract class Service{

    function __construct(Vendor\Services\Reader $reader){
    }
}

Service_B определяется следующим образом:

namespace Vendor\Services;    

class Service_B extends Service{

    function __construct(){
        parent::__construct(new \Vendor\Services\Reader());
    }
}

Reader есть следующая строка вверху файла:

use Vendor\Services;

Файлы классов организованы следующим образом:

Vendor/Services/Service_B.php
Vendor/Services/Reader.php

Вопрос: Когда я создаю экземпляр Service_B, появляется следующее сообщение об ошибке:

Fatal error: Class 'Vendor\Services\Reader' not found

Я не понимаю, почему я получаю эту ошибку, так как я думаю, что я использую правильные объявления пространств имен. спасибо

Теги:
namespaces
oop

1 ответ

3
Лучший ответ

В дополнение к классу вашего Reader:

//This will declare the Reader class in this namespace
namespace Vendor\Services; 

и удалите:

//THIS IS A WRONG DIRECTIVE: you're telling PHP to use the Vendor\Services class but it doesn't even exist     
use Vendor\Services;

Затем измените класс Service_B следующим образом:

namespace Vendor\Services;    

//i think this should extend Service, as it calling the parent constructor
class Service_B extends Service
{
    function __construct(){
        parent::__construct( new Reader() );
    }
}

Таким образом, все ваши 3 класса будут находиться в одном пространстве имен, а класс Reader должен быть найден без явного префикса пространства имен

  • 0
    Да Service_B расширяет Сервис Я соответственно отредактировал оригинальное сообщение
  • 1
    Спасибо, замена 'use' на 'namespace' устранила проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню