[英]Is it possible to get the name of class/file which extends another class in PHP?
我有一个PHP网站,其中有两个核心php文件ci_controller.php
和my_controller.php
以及许多控制器php文件。 My_Controller
类扩展CI_Controller
。 其他contoroller PHP类扩展了My_Controller
。
我想更改网站,以便My_Controller
类的某些内容仅适用于某些扩展的类。 即取决于哪个类扩展My_Controller
做x。
我想知道是否可以使用父子关系(或查看哪些文件扩展了一个类)来创建if / exception,以便某些PHP的My_Controller
部分可以运行?
例如,如果一个三班;
在这个例子中,我想在classC中有一行,它执行以下伪代码:
if (extended by classA)
{//do something}
else if (extended by classB)
{//do something else}
注意:关于stackoverflow的两个类似问题是:
但是,它们不能解决我的问题,但可能对那些寻求类似解决方案的人有所帮助
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
?>
很简单:
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.