是否有可能获得 class/file 的名称,它扩展了 PHP 中的另一个 class?
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
class 扩展 CI_Controller
。
另一个控制器 PHP class 扩展 My_Controller
.
我想更改网站,这样 My_Controller
class 中的某些内容只会出现在扩展的 class 中。即取决于 class extended My_Controller
do x.
我想知道是否可以使用 parent/child 关系(或查看哪些文件扩展了 class)来创建 if/exception,以便某些 My_Controller
部分 运行 某些 PHPs?
例如,如果三个 classes;
- classA,classB 和 classC。
- classA 和 classB 都扩展了 classC(即 class classA 扩展了 classC)
在这个例子中,我想在 classC 中有一行执行以下伪代码:
if (extended by classA)
{//do something}
else if (extended by classB)
{//do something else}
NOTE: Two similar questions on Whosebug are:
- Get the current script file name
- How to get current PHP page name
However they do not solve my problem, but maybe helpful for those looking for a similar solution
PHP 有一个函数可以检查 class 是否是另一个 class 的子class。
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
?>
很简单:
class MyController {
public function someFunc() {
if ($this instanceof ClassA || $this instanceof ClassB) {
...
}
}
}
但是: 这是一个糟糕的设计。 parent 不应该知道它的 children 并根据谁扩展它来专门化它的行为。它需要反过来。 parent 提供了一些功能,children 每个人都在必要时使用它。反过来,只从特定的child调用一个parent函数,不要从其他children:[=12调用它=]
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 网站,它有两个核心 php 文件 ci_controller.php
和 my_controller.php
以及一些控制器 php 文件。
My_Controller
class 扩展 CI_Controller
。
另一个控制器 PHP class 扩展 My_Controller
.
我想更改网站,这样 My_Controller
class 中的某些内容只会出现在扩展的 class 中。即取决于 class extended My_Controller
do x.
我想知道是否可以使用 parent/child 关系(或查看哪些文件扩展了 class)来创建 if/exception,以便某些 My_Controller
部分 运行 某些 PHPs?
例如,如果三个 classes;
- classA,classB 和 classC。
- classA 和 classB 都扩展了 classC(即 class classA 扩展了 classC)
在这个例子中,我想在 classC 中有一行执行以下伪代码:
if (extended by classA)
{//do something}
else if (extended by classB)
{//do something else}
NOTE: Two similar questions on Whosebug are:
- Get the current script file name
- How to get current PHP page name
However they do not solve my problem, but maybe helpful for those looking for a similar solution
PHP 有一个函数可以检查 class 是否是另一个 class 的子class。
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
?>
很简单:
class MyController {
public function someFunc() {
if ($this instanceof ClassA || $this instanceof ClassB) {
...
}
}
}
但是: 这是一个糟糕的设计。 parent 不应该知道它的 children 并根据谁扩展它来专门化它的行为。它需要反过来。 parent 提供了一些功能,children 每个人都在必要时使用它。反过来,只从特定的child调用一个parent函数,不要从其他children:[=12调用它=]
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
}
}