dirname в случае наследования класса

У меня есть родительский класс, который содержит общую переменную для пути к изображению и который устанавливается через конструктор класса

abstract class Parent_Class {
     protected $image_path;

     public function __construct($image_path_base) {
         $this->image_path = $image_path_base . '/images/';         
    }
}

Базовый путь зависит от дочерних классов или, скорее, от их расположения файлов.

class ChildA_Class {
    public function __construct() {
         parent::__construct(dirname(__FILE__));         
         ...
    }
}

class ChildB_Class {
    public function __construct() {
        parent::__construct(dirname(__FILE__));
        ...         
    }
}

Есть ли способ устранить dirname(__FILE__) в дочерних классах и переместить логику в сторону родительского класса?

1 ответ

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

abstract class ParentClass
{
    protected $imagePath;

    public function __construct()
    {
        // get reflection for the current class
        $reflection = new ReflectionClass(get_called_class());

        // get the filename where the class was defined
        $definitionPath = $reflection->getFileName();

        // set the class image path
        $this->imagePath = realpath(dirname($definitionPath) . "/images/");
    }
}

Каждый дочерний класс будет автоматически иметь путь к изображению в зависимости от того, где был определен дочерний класс.

Другие вопросы по тегам