Domanda

Ho definito una superclasse astratta in un file e una sottoclasse in un altro. Ho richiesto il file di super-classi e le relazioni della traccia dello stack di trovare un include esso.

Tuttavia, quindi restituisce un errore quando si colpisce il 'estende' linea: Fatal error: Class 'HTMLBuilder' not found in View/Markup/HTML/HTML4.01/HTML4_01Builder.php on line 7.

ho avuto questo lavoro con un altro albero classe che utilizza le fabbriche un momento fa. Ho appena aggiunto lo strato costruttore tra le fabbriche e il consumatore. Lo strato di fabbrica sembrava quasi esattamente la stessa in termini di include e le dipendenze.

In modo che mi fa pensare che devo avere fatto qualcosa sciocca di quella causa il file HTMLBuilder.php di non essere incluso in modo corretto o interpretato correttamente o qualcosa del genere.

Ecco la traccia completa dello stack (percorsi leggermente alterati):

#   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

Ecco il codice in questione:

classe padre (Visualizza / 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);

}

?>

Classe Bambino, (Vista / 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;
    }

}


?>
È stato utile?

Soluzione

Si noti che, nella traccia, HTMLBuilder.php richiede MarkupBuilder.php richiede HTML4_01Builder.php. Hai un include ciclo. Quando HTML4_01Builder è definita, PHP non ha terminato l'elaborazione HTMLBuilder.php. In particolare, essa non ha raggiunto l'inizio della definizione abstract class HTMLBuilder.

Non c'è alcuna necessità di includere una classe discendente quando si definisce l'antenato. PHP utilizza l'associazione tardiva dei nomi di classe, in modo che il discendente ha solo bisogno di esistere per il momento i metodi sono invocati.

MarkupBuilder.php:

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

class MarkupBuilder {
    static public function getInstance(...) {
        ...
        return new HTML4_01Builder(...);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top