Наследование в php, пространства имен

298
04 июля 2017, 23:52

Есть 2 класса:

namespace A;
class AClass {
    function create() {
        return new Test(); // по идее тут создается объект класс \A\Test()
    }
}

Второй класс:

namespace B;
class BClass extends \A\AClass {
    // мы унаследовали метод create(), но он все равно вернет 
    // нам объект класса \A\Test
    // Как наиболее правильно и гибко реализовать, чтобы метод
    // create в классе BClass возвращал объект класса \B\Test,
    // с минимальным кодом в классе BClass
}

При этом важно, не переопределять метод create в классе BClass Спасибо.

Answer 1

Предложу пару вариантов.

Вариант №1 - задавать имя создаваемого класса в виде protected члена класса, перекрывая его в наследниках.

namespace A {
    class AClass {
        protected $cls = "\\A\\Test";
        function create() {
            return new $this->cls;
        }
    }
    class Test {}
}
namespace B {
    class BClass extends \A\AClass{
        protected $cls = "\\B\\Test";
    }
    class Test {}
}

Вариант №2. Извлекать полное имя класса во время выполнения с помощью static, и заменять имя класса, оставляя namespace.

function create() {
    $cls = preg_replace("/(.+)\\\(\w+?)$/",  "$1\\Test", static::class);
    return new $cls;
}
READ ALSO
Как правильно использовать wall.post api vk attachments

Как правильно использовать wall.post api vk attachments

Как правильно использовать параметр attachments на api vk метод wallpost в php делаю так:

459
Yii2. Получить параметры в beforesave

Yii2. Получить параметры в beforesave

Хочу перед тем, как сохранить строку в базе, сделать некие манипуляцииНо данных находящихся в $this не хватает

291
Проверка пришедших в post данных

Проверка пришедших в post данных

Написал скрипт, есть необходимость проверить пришедший на него post запрос на наличие домена в блек листеТ

177
Не корректно выводится дата

Не корректно выводится дата

У меня нарисовалась мелкая, но неприятная помарка при выводе датыНа странице меток пункты списка должны выглядеть так:

212