У меня есть сайт PHP, который имеет два основных файла PHP ci_controller.php
а также my_controller.php
и ряд файлов php контроллера.
My_Controller
класс расширяется CI_Controller
,
Другие классы PHP контроллеров расширяются My_Controller
,
Я хотел изменить веб-сайт, чтобы некоторые вещи My_Controller
Класс будет происходить только для некоторых классов, которые расширились. то есть в зависимости от того, какой класс продлен My_Controller
сделать х.
Мне было интересно, можно ли использовать отношения родитель / потомок (или посмотреть, какие файлы расширяют класс), чтобы создать исключение if /, чтобы некоторые из My_Controller
части на ходу для определенных PHP?
Например, если три класса;
В этом примере я хочу иметь строку в classC, которая выполняет следующий псевдокод:
if (extended by classA)
{//do something}
else if (extended by classB)
{//do something else}
ПРИМЕЧАНИЕ. Два похожих вопроса о stackoverflow:
Однако они не решают мою проблему, но могут быть полезны для тех, кто ищет подобное решение.
Очень просто:
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
?>