是否有可能获得在PHP中扩展另一个类的类/文件的名称?

时间:2015-01-20 03:16:16

标签: php file class filenames parent

我有一个PHP网站,它有两个核心php文件ci_controller.phpmy_controller.php以及一些控制器php文件。 My_Controller类扩展了CI_Controller。 其他contoroller PHP类扩展My_Controller

我想要更改网站,以便某些事情My_Controller类只会出现在扩展的某些类中。即取决于扩展My_Controller的哪个类做x。

我想知道是否可以使用父/子关系(或查看哪些文件扩展一个类)来创建if / exception,以便某些PHP运行的My_Controller部分?< / p>

例如,如果有三个类;

  • classA,classB和classC。
  • classA和classB都扩展了classC(即class classA extends classC)

在这个例子中,我希望在classC中有一行代码执行以下伪代码:

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

注意:stackoverflow上有两个类似的问题:

           

然而,它们并没有解决我的问题,但对于那些寻找类似解决方案的人来说可能会有所帮助

2 个答案:

答案 0 :(得分:2)

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

another page上有一个用户提供的备注,其中包含一个可以让孩子们接受的功能(如果你想在某个时候采取其他方式):

<?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

?>

答案 1 :(得分: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
    }
}