5

あるファイルで抽象スーパークラスを定義し、別のファイルでサブクラスを定義しました。スーパークラス ファイルとスタック トレース レポートが含まれていることを確認する必要があります。

ただし、「extends」行に到達するとエラーが返されます: Fatal error: Class 'HTMLBuilder' not found in View/Markup/HTML/HTML4.01/HTML4_01Builder.php on line 7.

少し前に、ファクトリを使用する別のクラス ツリーでこれを動作させました。ファクトリとコンシューマーの間にビルダー レイヤーを追加しました。ファクトリ レイヤーは、インクルードと依存関係に関してほぼ同じように見えました。

そのため、HTMLBuilder.php ファイルが正しく含まれていないか、正しく解釈されていないなどの愚かなことをしたに違いないと思います。

完全なスタック トレースは次のとおりです (パスはわずかに変更されています)。

#   Time    Memory  Function    Location
1   0.0001  53904   {main}( )   ../index.php:0
2   0.0002  67600   require_once( 'View/Page.php' ) ../index.php:3
3   0.0003  75444   require_once( 'View/Sections/SectionFactory.php' )  ../Page.php:4
4   0.0003  81152   require_once( 'View/Sections/HTML/HTMLSectionFactory.php' ) ../SectionFactory.php:3
5   0.0004  92108   require_once( 'View/Sections/HTML/HTMLTitlebarSection.php' )    ../HTMLSectionFactory.php:5
6   0.0005  99716   require_once( 'View/Markup/HTML/HTMLBuilder.php' )  ../HTMLTitlebarSection.php:3
7   0.0005  103580  require_once( 'View/Markup/MarkupBuilder.php' ) ../HTMLBuilder.php:3
8   0.0006  124120  require_once( 'View/Markup/HTML/HTML4.01/HTML4_01Builder.php' ) ../MarkupBuilder.php:3

問題のコードは次のとおりです。

親クラス (View/Markup/HTML/HTMLBuilder.php):

<?php

require_once('View/Markup/MarkupBuilder.php');

abstract class HTMLBuilder extends MarkupBuilder {

    public abstract function getLink($text, $href);

    public abstract function getImage($src, $alt);

    public abstract function getDivision($id, array $classes=NULL, array $children=NULL);

    public abstract function getParagraph($text, array $classes=NULL, $id=NULL);

}

?>

子クラス (View/Markup/HTML/HTML4.01/HTML4_01Builder.php):

<?php

require_once('HTML4_01Factory.php');
require_once('View/Markup/HTML/HTMLBuilder.php');


class HTML4_01Builder extends HTMLBuilder {
    private $factory;

    public function __construct() {
        $this->factory = new HTML4_01Factory(); 
    }

    public function getLink($href, $text) {
        $link = $this->factory->getA();
        $link->addAttribute('href', $href);
        $link->addChild($this->factory->getText($text));
        return $link;   
    }

    public function getImage($src, $alt) {
        $image = $this->factory->getImg();
        $image->addAttribute('src', $src);
        $image->addAttribute('alt', $alt);
        return $image;
    }

    public function getDivision($id, array $classes=NULL, array $children=NULL) {
        $div = $this->factory->getDiv();
        $div->setID($id);
        if(!empty($classes)) {
            $div->addClasses($classes);
        }   
        if(!empty($children)) {
            $div->addChildren($children);   
        }
        return $div;
    }

    public function getParagraph($text, array $classes=NULL, $id=NULL) {
        $p = $this->factory->getP();
        $p->addChild($this->factory->getText($text));
        if(!empty($classes)) {
            $p->addClasses($classes);   
        }
        if(!empty($id)) {
            $p->setID($id); 
        }
        return $p;
    }

}


?>
4

1 に答える 1

2

トレースでは、HTMLBuilder.php には MarkupBuilder.php が必要であり、HTML4_01Builder.php が必要であることに注意してください。インクルードサイクルがあります。が定義されている場合HTML4_01Builder、PHP は HTMLBuilder.php の処理を​​完了していません。特に、abstract class HTMLBuilder定義の先頭に達していません。

祖先を定義するときに子孫クラスを含める必要はありません。PHP はクラス名のレイト バインディングを使用するため、子孫はメソッドが呼び出されるまでに存在する必要があります。

MarkupBuilder.php:

<?php
// unnecessary: 
//require_once('View/Markup/HTML/HTML4.01/HTML4_01Builder.php');

class MarkupBuilder {
    static public function getInstance(...) {
        ...
        return new HTML4_01Builder(...);
于 2010-04-24T22:44:10.223 に答える