代码之家  ›  专栏  ›  技术社区  ›  Daniel Bingham

php类在文件中查找类文件,但不查找类

  •  5
  • Daniel Bingham  · 技术社区  · 16 年前

    我在一个文件中定义了一个抽象超类,在另一个文件中定义了一个子类。我需要超级类文件和堆栈跟踪报告来找到一个包含它的文件。

    但是,当它碰到“扩展”行时,它会返回一个错误: 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 builder.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;
        }
    
    }
    
    
    ?>
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   outis    16 年前

    注意,在跟踪中,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(...);
    
    推荐文章