2010-04-24 13 views
5

Qui non sono a conoscenza. Ho definito una superclasse astratta in un file e una sottoclasse in un altro. Ho richiesto il file di super classi e i rapporti di tracciabilità dello stack per trovare un includerlo. Tuttavia, restituisce un errore quando raggiunge la linea "extends": 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 delle classi che usa le fabbriche un momento fa. Ho appena aggiunto il livello builder tra le fabbriche e il consumatore. Il livello factory sembrava quasi identico in termini di inclusioni e dipendenze. Quindi questo mi fa pensare che devo aver fatto qualcosa di sciocco che causa il non corretto o corretto interpretazione del file HTMLBuilder.php o qualcosa del genere.Verifica di pazzia: la classe PHP trova il file di classe ma non la classe nel file

Ecco la traccia dello stack completo (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 figlia, (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; 
    } 

} 


?> 

Gradirei qualsiasi idea. Qui sono completamente a corto di ciò che sta andando storto. Sono sicuro che sia qualcosa di stupido che non riesco a vedere ...

+0

Qual è il valore di 'include_path'? – outis

+0

include_path =>.:/Usr/share/php:/usr/share/pear =>.:/Usr/share/php:/usr/share/pera –

risposta

2

Nota che, nella traccia, HTMLBuilder.php richiede che MarkupBuilder.php richieda HTML4_01Builder.php. Hai un ciclo di inclusione. Quando viene definito HTML4_01Builder, PHP non ha terminato l'elaborazione di HTMLBuilder.php. In particolare, non ha raggiunto l'inizio della definizione abstract class HTMLBuilder.

Non è necessario includere una classe discendente durante la definizione dell'antenato. PHP utilizza l'associazione tardiva dei nomi delle classi, quindi il discendente deve esistere solo nel momento in cui i metodi vengono richiamati.

MarkupBuilder.php:

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

class MarkupBuilder { 
    static public function getInstance(...) { 
     ... 
     return new HTML4_01Builder(...); 
+0

Sì, l'ho notato. La cosa strana è che l'albero di fabbrica ha lo stesso ciclo di inclusione. Identico nella struttura. Ha funzionato senza intoppi. –

+0

@Daniel: vuoi dire che c'è una classe factory astratta definita in un file che include direttamente o indirettamente un file che definisce un discendente della classe factory astratta prima che la classe base sia definita? Scommetto che non è esattamente la stessa cosa. – outis

+0

Esattamente lo stesso. MarkupFactory ha una funzione di istanza get che restituisce un'istanza in HTML4_01Factory(). HTML4_01Factory è una discendenza da HTMLFactory che a sua volta discende da MarkupFactory. Lo stesso ciclo: ha funzionato. Quando stavo scrivendo quel codice, spuntò una bandiera di avviso, ma decisi di andare avanti e provarlo comunque. –

Problemi correlati