0

抽象Pageクラスを使用して、PHP でテンプレート システムを作成しています。私の Web サイトの各ページは、クラスを拡張する独自のPageクラスです。$page = new Page();そのページのクラス名を知らずに拡張ページのクラスをインスタンス化する方法を理解できないように、抽象クラスをインスタンス化することはできません。

実行時に抽象クラスの名前しか知らない場合、抽象クラスを拡張するクラスをインスタンス化することは可能ですか? もしそうなら、どうすればそれを行うことができますか?


Page クラスの擬似コード:

<?php    
abstract class Page{
    private $request = null;
    private $usr;
    function __construct($request){
        echo 'in the abstract';
        $this->request = $request;
        $this->usr = $GLOBALS['USER'];
    }

    //Return string containing the page's title. 
    abstract function getTitle();

    //Page specific content for the <head> section.
    abstract function customHead();

    //Return nothing; print out the page. 
    abstract function getContent();
}?>

すべてをロードするインデックス ページには、次のようなコードが含まれます。

require_once('awebpage.php');
$page = new Page($request);
/* Call getTitle, customHead, getContent, etc */

個々のページは次のようになります。

class SomeArbitraryPage extends Page{
    function __construct($request){
        echo 'in the page';
    }

    function getTitle(){
        echo 'A page title!';
    }

    function customHead(){
        ?>
            <!-- include styles and scripts -->
        <?php 
    }
    function getContent(){
        echo '<h1>Hello world!</h1>';
    }
}
4

2 に答える 2

2

関数/クラス名に変数を使用できます。

class YourExtendedClass {
    public function example(){
        echo 1;
    }
}

$class = 'YourExtendedClass';
$t = new $class();
$t->example();
于 2013-02-28T04:55:33.993 に答える
1

名前を知らずにクラスをインスタンス化することはできません。上記のように、変数をクラス/関数名として使用できます。すべてのページの子のリストを次のように作成できます。

abstract class Page {
        public static function me()
        {
            return get_called_class();
        }
    }

class Anonym extends Page {

}

$classes = get_declared_classes();
$children = array();
$parent = new ReflectionClass('Page');

foreach ($classes AS $class)
{
    $current = new ReflectionClass($class);
    if ($current->isSubclassOf($parent))
    {
        $children[] = $current;
    }
}

print_r($children);

次の出力を取得します

Array ( [0] => ReflectionClass Object ( [name] => Anonym ) )

しかし、繰り返しになりますが、名前がわからない場合は、インデックスもわかりません。

于 2013-02-28T05:03:42.927 に答える