簡體   English   中英

是否有可能獲得擴展PHP中另一個類的類/文件的名稱?

[英]Is it possible to get the name of class/file which extends another class in PHP?

我有一個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部分可以運行?

例如,如果一個三班;

  • classA,classB和classC。
  • classA和classB都擴展了classC(即class A擴展了classC)

在這個例子中,我想在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM