Можно ли получить имя класса / файла, который расширяет другой класс в PHP?

У меня есть сайт PHP, который имеет два основных файла PHP ci_controller.php а также my_controller.php и ряд файлов php контроллера.My_Controller класс расширяется CI_Controller, Другие классы PHP контроллеров расширяются My_Controller,

Я хотел изменить веб-сайт, чтобы некоторые вещи My_Controller Класс будет происходить только для некоторых классов, которые расширились. т.е. в зависимости от того, какой класс продлен My_Controller сделать х.

Мне было интересно, можно ли использовать отношения родитель / потомок (или посмотреть, какие файлы расширяют класс), чтобы создать исключение if /, чтобы некоторые из My_Controller части на ходу для определенных PHP?

Например, если три класса;

  • класс A, класс B и класс C.
  • classA и classB оба расширяют classC (то есть класс classA расширяет classC)

В этом примере я хочу иметь строку в classC, которая выполняет следующий псевдокод:

if (extended by classA)
{//do something}
else if (extended by classB)
{//do something else}

ПРИМЕЧАНИЕ. Два похожих вопроса о stackru:

Однако они не решают мою проблему, но могут быть полезны для тех, кто ищет подобное решение.

2 ответа

Решение

Очень просто:

class MyController {

    public function someFunc() {
        if ($this instanceof ClassA || $this instanceof ClassB) {
            ...
        }
    }

}

НО: Это ужасный дизайн. Родитель не должен знать о своих детях и специализировать свое поведение в зависимости от того, кто его расширяет. Это должно быть наоборот. Родитель обеспечивает некоторую функциональность, и каждый из детей использует его по мере необходимости. Переверните его и вызывайте только родительскую функцию от определенного потомка, а не вызывайте ее от других потомков:

class MyController {
    public function foo() { .. }
}

class ClassB extends MyController {
    public function __construct() {
        $this->foo();
    }
}

class ClassD extends MyController {
    public function __construct() {
        // simply don't call
    }
}

В PHP есть функция, которая проверяет, является ли класс подклассом другого.

http://php.net/manual/en/function.is-subclass-of.php

Следующее взято из документов:

<?php
// define a class
class WidgetFactory
{
  var $oink = 'moo';
}

// define a child class
class WidgetFactory_Child extends WidgetFactory
{
  var $oink = 'oink';
}

// create a new object
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (is_subclass_of($WFC, 'WidgetFactory')) {
  echo "yes, \$WFC is a subclass of WidgetFactory\n";
} else {
  echo "no, \$WFC is not a subclass of WidgetFactory\n";
}


if (is_subclass_of($WF, 'WidgetFactory')) {
  echo "yes, \$WF is a subclass of WidgetFactory\n";
} else {
  echo "no, \$WF is not a subclass of WidgetFactory\n";
}


// usable only since PHP 5.0.3
if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
  echo "yes, WidgetFactory_Child is a subclass of WidgetFactory\n";
} else {
  echo "no, WidgetFactory_Child is not a subclass of WidgetFactory\n";
}
?>

Выход:

yes, $WFC is a subclass of WidgetFactory
no, $WF is not a subclass of WidgetFactory
yes, WidgetFactory_Child is a subclass of WidgetFactory

На другой странице есть заметка, созданная пользователем, которая имеет функцию, которая получает детей (если вы хотите пойти другим путем в какой-то момент):

<?php
function get_child($instance, $classname) {
    $class = $classname;
    $t = get_class($instance);
    while (($p = get_parent_class($t)) !== false) {
        if ($p == $class) {
            return $t;
        }
        $t = $p;
    }
    return false;
}

abstract class A {
    function someFunction() {
        return get_child($this, __CLASS__);
    }
}

class B extends A {

}

class C extends B {

}

$c = new C();
echo $c->someFunction(); //displays B

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