PHP Classe trova file di classe, ma non di classe nel file
-
01-10-2019 - |
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;
}
}
?>
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(...);